using Content.Server.NPC.Components; using Content.Server.NPC.HTN; using Content.Shared.Actions; using Robust.Shared.Timing; namespace Content.Server.NPC.Systems; public sealed class NPCUseActionOnTargetSystem : EntitySystem { [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; /// public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnMapInit); } private void OnMapInit(Entity ent, ref MapInitEvent args) { ent.Comp.ActionEnt = _actions.AddAction(ent, ent.Comp.ActionId); } public bool TryUseTentacleAttack(Entity user, EntityUid target) { if (!Resolve(user, ref user.Comp, false)) return false; if (!TryComp(user.Comp.ActionEnt, out var action)) return false; if (!_actions.ValidAction(action)) return false; if (action.Event != null) { action.Event.Coords = Transform(target).Coordinates; } _actions.PerformAction(user, null, user.Comp.ActionEnt.Value, action, action.BaseEvent, _timing.CurTime, false); return true; } public override void Update(float frameTime) { base.Update(frameTime); // Tries to use the attack on the current target. var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var comp, out var htn)) { if (!htn.Blackboard.TryGetValue(comp.TargetKey, out var target, EntityManager)) continue; TryUseTentacleAttack((uid, comp), target); } } }