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 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 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 m_MinRadius = 0f; [Tooltip("Allowed maximum radius. 0 means unconstrained.")] [SerializeField] protected SharedVariable m_MaxRadius = 3f; public override TaskStatus OnUpdate() { if (self == null || behaviorSc == null || self.buffSm.HasBuff()) { 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; } } }