2023-01-10 03:37:26 -06:00
using Content.Server.Administration.Logs ;
2022-02-05 13:33:24 +00:00
using Robust.Shared.Player ;
using Content.Shared.Interaction ;
using Content.Shared.Popups ;
using Content.Shared.Doors.Components ;
using Content.Shared.Doors.Systems ;
using Content.Shared.Physics ;
using Content.Shared.Access.Components ;
using Content.Server.Doors.Systems ;
using Content.Server.Doors.Components ;
2022-06-16 06:36:36 -07:00
using Content.Server.Power.EntitySystems ;
2023-01-10 03:37:26 -06:00
using Content.Shared.Database ;
2022-03-13 01:33:23 +13:00
using Content.Shared.Interaction.Events ;
2022-06-16 06:36:36 -07:00
using static Content . Server . Remotes . DoorRemoteComponent ;
2022-02-05 13:33:24 +00:00
namespace Content.Server.Remotes
{
public sealed class DoorRemoteSystem : EntitySystem
{
2023-01-10 03:37:26 -06:00
[Dependency] private readonly IAdminLogManager _adminLogger = default ! ;
2023-01-18 05:44:32 +11:00
[Dependency] private readonly AirlockSystem _airlock = default ! ;
2022-02-05 13:33:24 +00:00
[Dependency] private readonly SharedPopupSystem _popupSystem = default ! ;
[Dependency] private readonly DoorSystem _doorSystem = default ! ;
[Dependency] private readonly SharedInteractionSystem _interactionSystem = default ! ;
2023-01-18 05:44:32 +11:00
// I'm so sorry [Dependency] private readonly SharedAirlockSystem _sharedAirlockSystem = default!;
2022-02-05 13:33:24 +00:00
public override void Initialize ( )
{
SubscribeLocalEvent < DoorRemoteComponent , UseInHandEvent > ( OnInHandActivation ) ;
2022-06-12 17:15:23 -07:00
SubscribeLocalEvent < DoorRemoteComponent , BeforeRangedInteractEvent > ( OnBeforeInteract ) ;
2022-02-05 13:33:24 +00:00
}
public void OnInHandActivation ( EntityUid user , DoorRemoteComponent component , UseInHandEvent args )
{
2022-06-16 06:36:36 -07:00
string switchMessageId ;
2022-02-05 13:33:24 +00:00
switch ( component . Mode )
{
2022-06-16 06:36:36 -07:00
case OperatingMode . OpenClose :
component . Mode = OperatingMode . ToggleBolts ;
switchMessageId = "door-remote-switch-state-toggle-bolts" ;
2022-02-05 13:33:24 +00:00
break ;
2022-06-16 06:36:36 -07:00
case OperatingMode . ToggleBolts :
component . Mode = OperatingMode . ToggleEmergencyAccess ;
switchMessageId = "door-remote-switch-state-toggle-emergency-access" ;
2022-02-05 13:33:24 +00:00
break ;
2022-06-16 06:36:36 -07:00
case OperatingMode . ToggleEmergencyAccess :
component . Mode = OperatingMode . OpenClose ;
switchMessageId = "door-remote-switch-state-open-close" ;
2022-02-05 13:33:24 +00:00
break ;
2022-06-16 06:36:36 -07:00
default :
throw new InvalidOperationException (
$"{nameof(DoorRemoteComponent)} had invalid mode {component.Mode}" ) ;
2022-02-05 13:33:24 +00:00
}
2022-06-16 06:36:36 -07:00
ShowPopupToUser ( switchMessageId , args . User ) ;
2022-02-05 13:33:24 +00:00
}
2022-06-12 17:15:23 -07:00
private void OnBeforeInteract ( EntityUid uid , DoorRemoteComponent component , BeforeRangedInteractEvent args )
2022-02-05 13:33:24 +00:00
{
2022-06-16 06:36:36 -07:00
if ( args . Handled
2022-02-05 13:33:24 +00:00
| | args . Target = = null
2022-06-16 06:36:36 -07:00
| | ! TryComp < DoorComponent > ( args . Target , out var doorComp ) // If it isn't a door we don't use it
| | ! TryComp < AirlockComponent > ( args . Target , out var airlockComp ) // Remotes only work on airlocks
// The remote can be used anywhere the user can see the door.
// This doesn't work that well, but I don't know of an alternative
| | ! _interactionSystem . InRangeUnobstructed ( args . User , args . Target . Value ,
SharedInteractionSystem . MaxRaycastRange , CollisionGroup . Opaque ) )
2022-02-05 13:33:24 +00:00
return ;
args . Handled = true ;
2022-05-27 10:36:12 +10:00
2022-06-16 06:36:36 -07:00
if ( ! this . IsPowered ( args . Target . Value , EntityManager ) )
2022-02-05 13:33:24 +00:00
{
2022-06-16 06:36:36 -07:00
ShowPopupToUser ( "door-remote-no-power" , args . User ) ;
return ;
2022-02-05 13:33:24 +00:00
}
2022-06-16 06:36:36 -07:00
if ( TryComp < AccessReaderComponent > ( args . Target , out var accessComponent ) & &
2023-01-10 03:37:26 -06:00
! _doorSystem . HasAccess ( args . Target . Value , args . Used , accessComponent ) )
2022-02-05 13:33:24 +00:00
{
2023-01-10 03:37:26 -06:00
_doorSystem . Deny ( args . Target . Value , doorComp , args . User ) ;
2022-06-16 06:36:36 -07:00
ShowPopupToUser ( "door-remote-denied" , args . User ) ;
return ;
2022-02-05 13:33:24 +00:00
}
2022-02-09 03:13:35 +00:00
2022-06-16 06:36:36 -07:00
switch ( component . Mode )
2022-02-09 03:13:35 +00:00
{
2022-06-16 06:36:36 -07:00
case OperatingMode . OpenClose :
2023-01-10 03:37:26 -06:00
if ( _doorSystem . TryToggleDoor ( args . Target . Value , doorComp , args . Used ) )
_adminLogger . Add ( LogType . Action , LogImpact . Medium , $"{ToPrettyString(args.User):player} used {ToPrettyString(args.Used)} on {ToPrettyString(args.Target.Value)}: {doorComp.State}" ) ;
2022-06-16 06:36:36 -07:00
break ;
case OperatingMode . ToggleBolts :
2022-10-17 02:44:04 +02:00
if ( ! airlockComp . BoltWireCut )
2023-01-10 03:37:26 -06:00
{
2023-01-18 05:44:32 +11:00
_airlock . SetBoltsWithAudio ( uid , airlockComp , ! airlockComp . BoltsDown ) ;
_adminLogger . Add ( LogType . Action , LogImpact . Medium , $"{ToPrettyString(args.User):player} used {ToPrettyString(args.Used)} on {ToPrettyString(args.Target.Value)} to {(airlockComp.BoltsDown ? "" : " un ")}bolt it" ) ;
2023-01-10 03:37:26 -06:00
}
2022-06-16 06:36:36 -07:00
break ;
case OperatingMode . ToggleEmergencyAccess :
2023-01-18 05:44:32 +11:00
_airlock . ToggleEmergencyAccess ( uid , airlockComp ) ;
2023-01-10 03:37:26 -06:00
_adminLogger . Add ( LogType . Action , LogImpact . Medium , $"{ToPrettyString(args.User):player} used {ToPrettyString(args.Used)} on {ToPrettyString(args.Target.Value)} to set emergency access {(airlockComp.EmergencyAccess ? " on " : " off ")}" ) ;
2022-06-16 06:36:36 -07:00
break ;
default :
throw new InvalidOperationException (
$"{nameof(DoorRemoteComponent)} had invalid mode {component.Mode}" ) ;
2022-02-09 03:13:35 +00:00
}
2022-02-05 13:33:24 +00:00
}
2022-06-16 06:36:36 -07:00
private void ShowPopupToUser ( string messageId , EntityUid user ) = >
2022-12-19 10:41:47 +13:00
_popupSystem . PopupEntity ( Loc . GetString ( messageId ) , user , user ) ;
2022-02-05 13:33:24 +00:00
}
}