using System.Linq; using Content.Shared.Database; using Content.Shared.Examine; using Content.Shared.Interaction; using Content.Shared.Popups; using Content.Shared.Verbs; using Content.Shared.Weapons.Ranged.Components; using Robust.Shared.Prototypes; namespace Content.Shared.Weapons.Ranged.Systems; public sealed class BatteryWeaponFireModesSystem : EntitySystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnInteractHandEvent); SubscribeLocalEvent>(OnGetVerb); SubscribeLocalEvent(OnExamined); } private void OnExamined(EntityUid uid, BatteryWeaponFireModesComponent component, ExaminedEvent args) { if (component.FireModes.Count < 2) return; var fireMode = GetMode(component); if (!_prototypeManager.TryIndex(fireMode.Prototype, out var proto)) return; args.PushMarkup(Loc.GetString("gun-set-fire-mode", ("mode", proto.Name))); } private BatteryWeaponFireMode GetMode(BatteryWeaponFireModesComponent component) { return component.FireModes[component.CurrentFireMode]; } private void OnGetVerb(EntityUid uid, BatteryWeaponFireModesComponent component, GetVerbsEvent args) { if (!args.CanAccess || !args.CanInteract || args.Hands == null) return; if (component.FireModes.Count < 2) return; for (var i = 0; i < component.FireModes.Count; i++) { var fireMode = component.FireModes[i]; var entProto = _prototypeManager.Index(fireMode.Prototype); var index = i; var v = new Verb { Priority = 1, Category = VerbCategory.SelectType, Text = entProto.Name, Disabled = i == component.CurrentFireMode, Impact = LogImpact.Low, DoContactInteraction = true, Act = () => { SetFireMode(uid, component, index, args.User); } }; args.Verbs.Add(v); } } private void OnInteractHandEvent(EntityUid uid, BatteryWeaponFireModesComponent component, ActivateInWorldEvent args) { if (!args.Complex) return; if (component.FireModes.Count < 2) return; CycleFireMode(uid, component, args.User); } private void CycleFireMode(EntityUid uid, BatteryWeaponFireModesComponent component, EntityUid user) { if (component.FireModes.Count < 2) return; var index = (component.CurrentFireMode + 1) % component.FireModes.Count; SetFireMode(uid, component, index, user); } private void SetFireMode(EntityUid uid, BatteryWeaponFireModesComponent component, int index, EntityUid? user = null) { var fireMode = component.FireModes[index]; component.CurrentFireMode = index; Dirty(uid, component); if (TryComp(uid, out ProjectileBatteryAmmoProviderComponent? projectileBatteryAmmoProvider)) { if (!_prototypeManager.TryIndex(fireMode.Prototype, out var prototype)) return; projectileBatteryAmmoProvider.Prototype = fireMode.Prototype; projectileBatteryAmmoProvider.FireCost = fireMode.FireCost; if (user != null) { _popupSystem.PopupClient(Loc.GetString("gun-set-fire-mode", ("mode", prototype.Name)), uid, user.Value); } } } }