Files
Cielonos/Assets/Opsive/BehaviorDesigner/Add-Ons/CielonosPack/Actions/AcquireSector.cs
SoulliesOfficial 39b43680a9 爆更
2026-07-18 03:16:20 -04:00

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;
}
}
}