using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Content.Shared.DoAfter;
using Content.Shared.Interaction;
namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators.Interactions;
public sealed partial class AltInteractOperator : HTNOperator
{
[Dependency] private readonly IEntityManager _entManager = default!;
[DataField("targetKey")]
public string Key = "Target";
///
/// If this alt-interaction started a do_after where does the key get stored.
///
[DataField("idleKey")]
public string IdleKey = "IdleTime";
public override async Task<(bool Valid, Dictionary? Effects)> Plan(NPCBlackboard blackboard, CancellationToken cancelToken)
{
return new(true, new Dictionary()
{
{ IdleKey, 1f }
});
}
public override HTNOperatorStatus Update(NPCBlackboard blackboard, float frameTime)
{
var owner = blackboard.GetValue(NPCBlackboard.Owner);
var target = blackboard.GetValue(Key);
var intSystem = _entManager.System();
var count = 0;
if (_entManager.TryGetComponent(owner, out var doAfter))
{
count = doAfter.DoAfters.Count;
}
var result = intSystem.AltInteract(owner, target);
// Interaction started a doafter so set the idle time to it.
if (result && doAfter != null && count != doAfter.DoAfters.Count)
{
var wait = doAfter.DoAfters.First().Value.Args.Delay;
blackboard.SetValue(IdleKey, (float) wait.TotalSeconds + 0.5f);
}
else
{
blackboard.SetValue(IdleKey, 1f);
}
return result ? HTNOperatorStatus.Finished : HTNOperatorStatus.Failed;
}
}