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;
}
}