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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user