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