using System.Threading;
using System.Threading.Tasks;
using Content.Server.NPC.Pathfinding;
using Content.Shared.DeviceLinking;
using Content.Shared.Interaction;
using Content.Shared.Silicons.Bots;
namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators.Specific;
public sealed partial class FindLinkedMachineOperator : HTNOperator
{
[Dependency] private readonly IEntityManager _entManager = default!;
private PathfindingSystem _pathfinding = default!;
[DataField] public string RangeKey = NPCBlackboard.FillbotPickupRange;
///
/// Target entity to find
///
[DataField(required: true)]
public string TargetKey = string.Empty;
///
/// Target entitycoordinates to move to.
///
[DataField(required: true)]
public string TargetMoveKey = string.Empty;
public override void Initialize(IEntitySystemManager sysManager)
{
base.Initialize(sysManager);
_pathfinding = sysManager.GetEntitySystem();
}
public override async Task<(bool Valid, Dictionary? Effects)> Plan(NPCBlackboard blackboard,
CancellationToken cancelToken)
{
var owner = blackboard.GetValue(NPCBlackboard.Owner);
if (!blackboard.TryGetValue(RangeKey, out var _, _entManager)
|| !_entManager.TryGetComponent(owner, out var fillbot)
|| !_entManager.TryGetComponent(owner, out var fillbotlinks)
|| fillbotlinks.LinkedPorts.Count != 1
|| fillbot.LinkedSinkEntity == null
|| _entManager.Deleted(fillbot.LinkedSinkEntity))
return (false, null);
var path = await _pathfinding.GetPath(owner, fillbot.LinkedSinkEntity.Value, SharedInteractionSystem.InteractionRange - 0.5f, cancelToken);
if (path.Result == PathResult.NoPath)
return (false, null);
return (true, new()
{
{TargetKey, fillbot.LinkedSinkEntity},
{TargetMoveKey, _entManager.GetComponent(fillbot.LinkedSinkEntity.Value).Coordinates},
{NPCBlackboard.PathfindKey, path},
});
}
}