6
2025-11-03 10:15:18 +03:00

96 lines
3.7 KiB
C#

using Content.Shared._RMC14.Weapons.Common;
using Content.Shared.Examine;
using Content.Shared.Interaction;
using Content.Shared.Popups;
using Content.Shared.Tag;
using Content.Shared.Weapons.Ranged.Components;
using Content.Shared.Weapons.Ranged.Events;
using Content.Shared.Weapons.Ranged.Systems;
using Robust.Shared.Audio.Systems;
using Robust.Shared.GameObjects;
namespace Content.Shared._RMC14.Weapons.Ranged;
public sealed class BreechLoadedSystem : EntitySystem
{
[Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!;
[Dependency] private readonly SharedAudioSystem _audioSystem = default!;
[Dependency] private readonly SharedGunSystem _gunSystem = default!;
[Dependency] private readonly SharedPopupSystem _popupSystem = default!;
[Dependency] private readonly TagSystem _tagSystem = default!;
public override void Initialize()
{
SubscribeLocalEvent<BreechLoadedComponent, AttemptShootEvent>(OnAttemptShoot);
SubscribeLocalEvent<BreechLoadedComponent, GunShotEvent>(OnGunShot);
SubscribeLocalEvent<BreechLoadedComponent, RMCTryAmmoEjectEvent>(OnTryAmmoEject);
SubscribeLocalEvent<BreechLoadedComponent, UniqueActionEvent>(OnUniqueAction);
SubscribeLocalEvent<BreechLoadedComponent, InteractUsingEvent>(OnInteractUsing,
before: new[] { typeof(SharedGunSystem) });
}
private void OnAttemptShoot(Entity<BreechLoadedComponent> gun, ref AttemptShootEvent args)
{
if (args.Cancelled || !gun.Comp.Open && (!gun.Comp.NeedOpenClose || gun.Comp.Ready))
return;
args.Cancelled = true;
if (gun.Comp.Open)
_popupSystem.PopupClient(Loc.GetString("rmc-breech-loaded-open-shoot-attempt"), args.User, args.User);
else
_popupSystem.PopupClient(Loc.GetString("rmc-breech-loaded-not-ready-to-shoot"), args.User, args.User);
}
private void OnGunShot(Entity<BreechLoadedComponent> gun, ref GunShotEvent args)
{
if (!gun.Comp.NeedOpenClose)
return;
gun.Comp.Ready = false;
Dirty(gun);
}
private void OnTryAmmoEject(Entity<BreechLoadedComponent> gun, ref RMCTryAmmoEjectEvent args)
{
if (gun.Comp.Open)
return;
_popupSystem.PopupClient(Loc.GetString("rmc-breech-loaded-closed-extract-attempt"), args.User, args.User);
args.Cancelled = true;
}
private void OnUniqueAction(Entity<BreechLoadedComponent> gun, ref UniqueActionEvent args)
{
if (args.Handled)
return;
args.Handled = true;
gun.Comp.Open = !gun.Comp.Open;
if (!gun.Comp.Open)
gun.Comp.Ready = true;
if (gun.Comp.ShowBreechOpen && TryComp(gun.Owner, out AppearanceComponent? appearanceComponent))
_appearanceSystem.SetData(gun, BreechVisuals.Open, gun.Comp.Open, appearanceComponent);
Dirty(gun);
var sound = gun.Comp.Open ? gun.Comp.OpenSound : gun.Comp.CloseSound;
//_audioSystem.PlayPredicted(sound, gun, args.UserUid, sound.Params);
_audioSystem.PlayPredicted(sound, gun, args.UserUid);
}
private void OnInteractUsing(Entity<BreechLoadedComponent> gun, ref InteractUsingEvent args)
{
if (gun.Comp.Open ||
!TryComp(gun.Owner, out BallisticAmmoProviderComponent? ammoProviderComponent) ||
ammoProviderComponent.Whitelist == null ||
ammoProviderComponent.Whitelist.Tags == null ||
!_tagSystem.HasAnyTag(args.Used, ammoProviderComponent.Whitelist.Tags))
return;
_popupSystem.PopupClient(Loc.GetString("rmc-breech-loaded-closed-load-attempt"), args.User, args.User);
args.Handled = true;
}
}