using System.Linq; using Content.Shared._White.Cult.Components; using Content.Shared.Examine; using Content.Shared.Ghost; using Content.Shared.Hands; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; using Content.Shared.Interaction.Events; using Content.Shared.Weapons.Ranged.Events; using Content.Shared.Weapons.Ranged.Systems; using Robust.Shared.Containers; using Robust.Shared.Network; using Robust.Shared.Timing; namespace Content.Shared._White.Cult.Systems; public sealed class BoltBarrageSystem : EntitySystem { [Dependency] private readonly SharedHandsSystem _hands = default!; [Dependency] private readonly INetManager _net = default!; [Dependency] private readonly IGameTiming _timing = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnShootAttempt); SubscribeLocalEvent(OnGunShot); SubscribeLocalEvent(OnDrop); SubscribeLocalEvent(OnUnequipHand); SubscribeLocalEvent(OnRemoveAttempt); SubscribeLocalEvent(OnEmptyShot); SubscribeLocalEvent(OnExamine); } private void OnExamine(Entity ent, ref ExaminedEvent args) { args.PushMarkup(Loc.GetString("bolt-barrage-component-extra-desc")); } private void OnUnequipHand(Entity ent, ref GotUnequippedHandEvent args) { if (_net.IsServer && ent.Comp.Unremoveable) QueueDel(ent); } private void OnRemoveAttempt(Entity ent, ref ContainerGettingRemovedAttemptEvent args) { if (!_timing.ApplyingState && ent.Comp.Unremoveable) args.Cancel(); } private void OnEmptyShot(Entity ent, ref OnEmptyGunShotEvent args) { if (_net.IsServer) QueueDel(ent); } private void OnDrop(Entity ent, ref DroppedEvent args) { if (_net.IsServer && ent.Comp.Unremoveable) QueueDel(ent); } private void OnGunShot(Entity ent, ref GunShotEvent args) { if (!TryComp(args.User, out HandsComponent? hands)) return; foreach (var hand in _hands.EnumerateHands(args.User, hands)) { if (!hand.IsEmpty) continue; ent.Comp.Unremoveable = false; _hands.SetActiveHand(args.User, hand, hands); _hands.TryPickup(args.User, ent, hand, false, false, hands); ent.Comp.Unremoveable = true; return; } } private void OnShootAttempt(Entity ent, ref AttemptShootEvent args) { /*if (!HasComp(args.User) && !HasComp(args.User)) { args.Cancelled = true; args.Message = Loc.GetString("bolt-barrage-component-not-cultist"); return; }*/ if (_hands.EnumerateHands(args.User).Any(hand => hand.IsEmpty)) return; args.Cancelled = true; args.Message = Loc.GetString("bolt-barrage-component-no-empty-hand"); } }