using Content.Shared.Access; using Content.Shared.Access.Systems; using Content.Shared.Popups; using Content.Shared.Turrets; using Robust.Shared.Audio.Systems; using Robust.Shared.Prototypes; namespace Content.Shared.TurretController; /// /// Oversees entities that can change the component values of linked deployable turrets, /// specifically their armament and access level exemptions, via an associated UI /// public abstract partial class SharedDeployableTurretControllerSystem : EntitySystem { [Dependency] private readonly AccessReaderSystem _accessreader = default!; [Dependency] private readonly TurretTargetSettingsSystem _turretTargetingSettings = default!; [Dependency] private readonly SharedUserInterfaceSystem _userInterfaceSystem = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; public override void Initialize() { base.Initialize(); // Handling of client messages SubscribeLocalEvent(OnArmamentSettingChanged); SubscribeLocalEvent(OnExemptAccessLevelsChanged); } private void OnArmamentSettingChanged(Entity ent, ref DeployableTurretArmamentSettingChangedMessage args) { if (IsUserAllowedAccess(ent, args.Actor)) ChangeArmamentSetting(ent, args.ArmamentState, args.Actor); if (_userInterfaceSystem.TryGetOpenUi(ent.Owner, DeployableTurretControllerUiKey.Key, out var bui)) bui.Update(); } private void OnExemptAccessLevelsChanged(Entity ent, ref DeployableTurretExemptAccessLevelChangedMessage args) { if (IsUserAllowedAccess(ent, args.Actor)) ChangeExemptAccessLevels(ent, args.AccessLevels, args.Enabled, args.Actor); if (_userInterfaceSystem.TryGetOpenUi(ent.Owner, DeployableTurretControllerUiKey.Key, out var bui)) bui.Update(); } protected virtual void ChangeArmamentSetting(Entity ent, int armamentState, EntityUid? user = null) { ent.Comp.ArmamentState = armamentState; Dirty(ent); _appearance.SetData(ent, TurretControllerVisuals.ControlPanel, armamentState); // Linked turrets are updated on the server side } protected virtual void ChangeExemptAccessLevels( Entity ent, HashSet> exemptions, bool enabled, EntityUid? user = null ) { // Update the controller if (!TryComp(ent, out var targetSettings)) return; var controller = new Entity(ent, targetSettings); foreach (var accessLevel in exemptions) { if (!ent.Comp.AccessLevels.Contains(accessLevel)) continue; _turretTargetingSettings.SetAccessLevelExemption(controller, accessLevel, enabled); } Dirty(controller); // Linked turrets are updated on the server side } public bool IsUserAllowedAccess(Entity ent, EntityUid user) { if (_accessreader.IsAllowed(user, ent)) return true; _popup.PopupClient(Loc.GetString("turret-controls-access-denied"), ent, user); _audio.PlayPredicted(ent.Comp.AccessDeniedSound, ent, user); return false; } }