|
|
|
|
|
using MalbersAnimations.Scriptables;
|
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
|
|
namespace MalbersAnimations.Controller.AI
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
[CreateAssetMenu(menuName = "Malbers Animations/Pluggable AI/Tasks/Play Animal State")]
|
|
|
|
|
|
public class PlayStateTask : MTask
|
|
|
|
|
|
{
|
|
|
|
|
|
public override string DisplayName => "Animal/Set State";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[Space, Tooltip("State to play")]
|
|
|
|
|
|
public StateID StateID;
|
|
|
|
|
|
[Tooltip("Play the State only when the animal has arrived to the target")]
|
|
|
|
|
|
public bool PlayNearTarget = false;
|
|
|
|
|
|
|
|
|
|
|
|
[Space, Tooltip("Apply the Task to the Animal(Self) or the Target(Target)")]
|
|
|
|
|
|
public Affected affect = Affected.Self;
|
|
|
|
|
|
[Tooltip("What to do with the State")]
|
|
|
|
|
|
public StateAction action = StateAction.Activate;
|
|
|
|
|
|
|
|
|
|
|
|
public ExecuteTask Play = ExecuteTask.OnStart;
|
|
|
|
|
|
[Tooltip("Time elapsed to Play the Mode again and Again")]
|
|
|
|
|
|
public FloatReference CoolDown = new FloatReference (2f);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public override void StartTask(MAnimalBrain brain, int index)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (Play == ExecuteTask.OnStart)
|
|
|
|
|
|
{
|
|
|
|
|
|
StateActivate(brain);
|
|
|
|
|
|
brain.TaskDone(index);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public override void UpdateTask(MAnimalBrain brain, int index)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (Play == ExecuteTask.OnUpdate) StateActivate(brain); //If the animal is in range of the Target
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void StateActivate(MAnimalBrain brain)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (PlayNearTarget && !brain.AIControl.HasArrived) return; //Dont play if Play on target is true but we are not near the target.
|
|
|
|
|
|
|
|
|
|
|
|
switch (affect)
|
|
|
|
|
|
{
|
|
|
|
|
|
case Affected.Self:
|
|
|
|
|
|
PlayState(brain.Animal);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case Affected.Target:
|
|
|
|
|
|
if (brain.TargetAnimal)
|
|
|
|
|
|
PlayState(brain.TargetAnimal);
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void PlayState(MAnimal CurrentAnimal)
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (action)
|
|
|
|
|
|
{
|
|
|
|
|
|
case StateAction.Activate:
|
|
|
|
|
|
CurrentAnimal.State_Activate(StateID);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case StateAction.AllowExit:
|
|
|
|
|
|
if (CurrentAnimal.ActiveStateID == StateID) CurrentAnimal.ActiveState.AllowExit();
|
|
|
|
|
|
break;
|
|
|
|
|
|
case StateAction.ForceActivate:
|
|
|
|
|
|
CurrentAnimal.State_Force(StateID);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case StateAction.Enable:
|
|
|
|
|
|
CurrentAnimal.State_Enable(StateID);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case StateAction.Disable:
|
|
|
|
|
|
CurrentAnimal.State_Disable(StateID);
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public override void ExitAIState(MAnimalBrain brain, int index)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (Play == ExecuteTask.OnExit) //If the animal is in range of the Target
|
|
|
|
|
|
{
|
|
|
|
|
|
StateActivate(brain);
|
|
|
|
|
|
}
|
|
|
|
|
|
brain.TaskDone(index);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Reset() => Description = "Plays a State on the Animal(Self or the Target)";
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|