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;