Files
2024-11-20 15:21:28 +01:00

70 lines
2.4 KiB
C#

using UnityEngine;
namespace Invector.vCharacterController.AI.FSMBehaviour
{
#if UNITY_EDITOR
[vFSMHelpbox("Requires a ControlAIShooter", UnityEditor.MessageType.Info)]
#endif
public class vAIShooterAttack : vStateAction
{
public override string categoryName
{
get { return "Combat/"; }
}
public override string defaultName
{
get { return "Trigger ShooterAttack"; }
}
public vAIShooterAttack()
{
executionType = vFSMComponentExecutionType.OnStateEnter | vFSMComponentExecutionType.OnStateExit | vFSMComponentExecutionType.OnStateUpdate;
}
[vHelpBox("Use this to ignore attack time")]
public bool forceCanAttack;
public override void DoAction(vIFSMBehaviourController fsmBehaviour, vFSMComponentExecutionType executionType = vFSMComponentExecutionType.OnStateUpdate)
{
if (fsmBehaviour.aiController is vIControlAIShooter)
{
ControlAttack(fsmBehaviour, fsmBehaviour.aiController as vIControlAIShooter);
}
}
protected virtual void ControlAttack(vIFSMBehaviourController fsmBehaviour, vIControlAIShooter combat, vFSMComponentExecutionType executionType = vFSMComponentExecutionType.OnStateUpdate)
{
switch (executionType)
{
case vFSMComponentExecutionType.OnStateEnter:
InitAttack(combat);
break;
case vFSMComponentExecutionType.OnStateUpdate:
HandleAttack(fsmBehaviour, combat);
break;
case vFSMComponentExecutionType.OnStateExit:
FinishAttack(combat);
break;
}
}
protected virtual void InitAttack(vIControlAIShooter combat)
{
combat.isInCombat = true;
combat.InitAttackTime();
}
protected virtual void HandleAttack(vIFSMBehaviourController fsmBehaviour, vIControlAIShooter combat)
{
combat.AimToTarget();
if (!combat.isAiming) return;
combat.Attack(forceCanAttack: forceCanAttack);
}
protected virtual void FinishAttack(vIControlAIShooter combat)
{
combat.isInCombat = false;
combat.ResetAttackTime();
}
}
}