Make failing to fire a gun that requires wielding not delay the next shot (#27973)

Make failing to fire a wield-only gun not delay the next shot
This commit is contained in:
DrSmugleaf
2024-05-13 21:53:47 -07:00
committed by GitHub
parent 63c551b20d
commit f22e5404aa
4 changed files with 22 additions and 9 deletions

View File

@@ -6,8 +6,13 @@ namespace Content.Shared.Weapons.Ranged.Components;
/// <summary> /// <summary>
/// Indicates that this gun requires wielding to be useable. /// Indicates that this gun requires wielding to be useable.
/// </summary> /// </summary>
[RegisterComponent, NetworkedComponent, Access(typeof(WieldableSystem))] [RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
[Access(typeof(WieldableSystem))]
public sealed partial class GunRequiresWieldComponent : Component public sealed partial class GunRequiresWieldComponent : Component
{ {
[DataField, AutoNetworkedField]
public TimeSpan LastPopup;
[DataField, AutoNetworkedField]
public TimeSpan PopupCooldown = TimeSpan.FromSeconds(1);
} }

View File

@@ -1,3 +1,5 @@
using Content.Shared.Weapons.Ranged.Components;
namespace Content.Shared.Weapons.Ranged.Events; namespace Content.Shared.Weapons.Ranged.Events;
/// <summary> /// <summary>
@@ -15,7 +17,7 @@ public record struct ShotAttemptedEvent
/// <summary> /// <summary>
/// The gun being shot. /// The gun being shot.
/// </summary> /// </summary>
public EntityUid Used; public Entity<GunComponent> Used;
public bool Cancelled { get; private set; } public bool Cancelled { get; private set; }

View File

@@ -239,7 +239,7 @@ public abstract partial class SharedGunSystem : EntitySystem
var prevention = new ShotAttemptedEvent var prevention = new ShotAttemptedEvent
{ {
User = user, User = user,
Used = gunUid Used = (gunUid, gun)
}; };
RaiseLocalEvent(gunUid, ref prevention); RaiseLocalEvent(gunUid, ref prevention);
if (prevention.Cancelled) if (prevention.Cancelled)

View File

@@ -16,7 +16,7 @@ using Content.Shared.Weapons.Ranged.Events;
using Content.Shared.Weapons.Ranged.Systems; using Content.Shared.Weapons.Ranged.Systems;
using Content.Shared.Wieldable.Components; using Content.Shared.Wieldable.Components;
using Robust.Shared.Audio.Systems; using Robust.Shared.Audio.Systems;
using Robust.Shared.Player; using Robust.Shared.Timing;
namespace Content.Shared.Wieldable; namespace Content.Shared.Wieldable;
@@ -30,6 +30,7 @@ public sealed class WieldableSystem : EntitySystem
[Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly UseDelaySystem _delay = default!; [Dependency] private readonly UseDelaySystem _delay = default!;
[Dependency] private readonly SharedGunSystem _gun = default!; [Dependency] private readonly SharedGunSystem _gun = default!;
[Dependency] private readonly IGameTiming _timing = default!;
public override void Initialize() public override void Initialize()
{ {
@@ -42,7 +43,7 @@ public sealed class WieldableSystem : EntitySystem
SubscribeLocalEvent<WieldableComponent, GetVerbsEvent<InteractionVerb>>(AddToggleWieldVerb); SubscribeLocalEvent<WieldableComponent, GetVerbsEvent<InteractionVerb>>(AddToggleWieldVerb);
SubscribeLocalEvent<MeleeRequiresWieldComponent, AttemptMeleeEvent>(OnMeleeAttempt); SubscribeLocalEvent<MeleeRequiresWieldComponent, AttemptMeleeEvent>(OnMeleeAttempt);
SubscribeLocalEvent<GunRequiresWieldComponent, AttemptShootEvent>(OnShootAttempt); SubscribeLocalEvent<GunRequiresWieldComponent, ShotAttemptedEvent>(OnShootAttempt);
SubscribeLocalEvent<GunWieldBonusComponent, ItemWieldedEvent>(OnGunWielded); SubscribeLocalEvent<GunWieldBonusComponent, ItemWieldedEvent>(OnGunWielded);
SubscribeLocalEvent<GunWieldBonusComponent, ItemUnwieldedEvent>(OnGunUnwielded); SubscribeLocalEvent<GunWieldBonusComponent, ItemUnwieldedEvent>(OnGunUnwielded);
SubscribeLocalEvent<GunWieldBonusComponent, GunRefreshModifiersEvent>(OnGunRefreshModifiers); SubscribeLocalEvent<GunWieldBonusComponent, GunRefreshModifiersEvent>(OnGunRefreshModifiers);
@@ -61,16 +62,21 @@ public sealed class WieldableSystem : EntitySystem
} }
} }
private void OnShootAttempt(EntityUid uid, GunRequiresWieldComponent component, ref AttemptShootEvent args) private void OnShootAttempt(EntityUid uid, GunRequiresWieldComponent component, ref ShotAttemptedEvent args)
{ {
if (TryComp<WieldableComponent>(uid, out var wieldable) && if (TryComp<WieldableComponent>(uid, out var wieldable) &&
!wieldable.Wielded) !wieldable.Wielded)
{ {
args.Cancelled = true; args.Cancel();
if (!HasComp<MeleeWeaponComponent>(uid) && !HasComp<MeleeRequiresWieldComponent>(uid)) var time = _timing.CurTime;
if (time > component.LastPopup + component.PopupCooldown &&
!HasComp<MeleeWeaponComponent>(uid) &&
!HasComp<MeleeRequiresWieldComponent>(uid))
{ {
args.Message = Loc.GetString("wieldable-component-requires", ("item", uid)); component.LastPopup = time;
var message = Loc.GetString("wieldable-component-requires", ("item", uid));
_popupSystem.PopupClient(message, args.Used, args.User);
} }
} }
} }