78 lines
3.1 KiB
C#
78 lines
3.1 KiB
C#
using System.Collections.Generic;
|
|
using Cielonos.MainGame.Buffs.Character;
|
|
using Opsive.BehaviorDesigner.Runtime.Tasks;
|
|
using Opsive.GraphDesigner.Runtime.Variables;
|
|
using Opsive.Shared.Utility;
|
|
using UnityEngine;
|
|
|
|
namespace Cielonos.MainGame.Characters.AI
|
|
{
|
|
[Description("Acquires a Formation Sector and writes the successful request into BehaviorSubcontroller.")]
|
|
[Category("Cielonos")]
|
|
public class AcquireSector : AutomataActionBase
|
|
{
|
|
[Header("Formation")]
|
|
[Tooltip("Use the current formation request stored in BehaviorSubcontroller.")]
|
|
public bool useCurrentFormationRole = false;
|
|
|
|
[Tooltip("Requested tactical role.")]
|
|
public FormationTacticalRole role = FormationTacticalRole.ActiveMelee;
|
|
|
|
[Tooltip("Requested Sector purpose.")]
|
|
public FormationSectorPurpose purpose = FormationSectorPurpose.Action;
|
|
|
|
[Tooltip("Preferred Sector names. Leave empty to use FormationProfile priority scoring.")]
|
|
public List<string> preferredSectorNames;
|
|
|
|
[Tooltip("If enabled, only Sectors whose name is listed in Allowed Sector Names can be selected.")]
|
|
public bool useSectorNameLimit = false;
|
|
|
|
[Tooltip("Hard Sector name filter. Empty while enabled means no Sector can be selected.")]
|
|
public List<string> allowedSectorNames;
|
|
|
|
[Header("Radius Constraint")]
|
|
[Tooltip("Restrict candidate positions by radius from the player.")]
|
|
public bool useRadiusConstraint = true;
|
|
|
|
[Tooltip("Allowed minimum radius. 0 means unconstrained.")]
|
|
[SerializeField] protected SharedVariable<float> m_MinRadius = 0f;
|
|
|
|
[Tooltip("Allowed maximum radius. 0 means unconstrained.")]
|
|
[SerializeField] protected SharedVariable<float> m_MaxRadius = 3f;
|
|
|
|
public override TaskStatus OnUpdate()
|
|
{
|
|
if (self == null || behaviorSc == null || self.buffSm.HasBuff<MovementSuppression>())
|
|
{
|
|
return TaskStatus.Failure;
|
|
}
|
|
|
|
FormationTacticalRole requestRole = useCurrentFormationRole ? behaviorSc.formationRole : role;
|
|
FormationSectorPurpose requestPurpose = useCurrentFormationRole ? behaviorSc.formationPurpose : purpose;
|
|
float minRadius = useRadiusConstraint ? m_MinRadius.Value : 0f;
|
|
float maxRadius = useRadiusConstraint ? m_MaxRadius.Value : 0f;
|
|
|
|
bool acquired = CombatManager.CoordinatorSm.TryAcquireSector(
|
|
self,
|
|
requestRole,
|
|
requestPurpose,
|
|
preferredSectorNames,
|
|
useSectorNameLimit ? allowedSectorNames : null,
|
|
minRadius,
|
|
maxRadius);
|
|
|
|
if (!acquired)
|
|
{
|
|
return TaskStatus.Failure;
|
|
}
|
|
|
|
behaviorSc.formationRole = requestRole;
|
|
behaviorSc.formationPurpose = requestPurpose;
|
|
behaviorSc.formationUseRadiusConstraint = useRadiusConstraint;
|
|
behaviorSc.formationMinRadius = minRadius;
|
|
behaviorSc.formationMaxRadius = maxRadius;
|
|
return TaskStatus.Success;
|
|
}
|
|
}
|
|
}
|