using Content.Server.NPC.HTN.PrimitiveTasks.Operators.Specific;
using Content.Shared.Silicons.Bots;
using Robust.Shared.Timing;
namespace Content.Server.Silicons.Bots;
///
/// Beyond what does, this system manages the "lifecycle" of
/// .
///
public sealed class HugBotSystem : SharedHugBotSystem
{
[Dependency] private readonly IGameTiming _gameTiming = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent(OnHtnRaisedEvent);
}
private void OnHtnRaisedEvent(Entity entity, ref HTNRaisedEvent args)
{
if (args.Args is not HugBotDidHugEvent ||
args.Target is not {} target)
return;
var ev = new HugBotHugEvent(GetNetEntity(entity));
RaiseLocalEvent(target, ev);
ApplyHugBotCooldown(entity, target);
}
///
/// Applies to based on the configuration of
/// .
///
public void ApplyHugBotCooldown(Entity hugBot, EntityUid target)
{
var hugged = EnsureComp(target);
hugged.CooldownCompleteAfter = _gameTiming.CurTime + hugBot.Comp.HugCooldown;
}
public override void Update(float frameTime)
{
// Iterate through all RecentlyHuggedByHugBot entities...
var huggedEntities = AllEntityQuery();
while (huggedEntities.MoveNext(out var huggedEnt, out var huggedComp))
{
// ... and if their cooldown is complete...
if (huggedComp.CooldownCompleteAfter <= _gameTiming.CurTime)
{
// ... remove it, allowing them to receive the blessing of hugs once more.
RemCompDeferred(huggedEnt);
}
}
}
}
///
/// This event is indirectly raised (by being ) on a HugBot when it hugs (or emaggedly
/// punches) an entity.
///
[Serializable, DataDefinition]
public sealed partial class HugBotDidHugEvent : EntityEventArgs;