2023-08-04 21:18:29 -05:00
using Content.Server.Administration.Logs ;
2023-12-29 04:47:43 -08:00
using Content.Server.Chemistry.Containers.EntitySystems ;
2023-08-04 21:18:29 -05:00
using Content.Shared.Database ;
2024-03-22 10:37:46 +01:00
using Content.Shared.Glue ;
2023-06-28 05:48:06 +03:00
using Content.Shared.IdentityManagement ;
using Content.Shared.Interaction ;
using Content.Shared.Item ;
using Content.Shared.Lube ;
2024-04-01 06:27:39 +00:00
using Content.Shared.Nutrition.EntitySystems ;
2023-06-28 05:48:06 +03:00
using Content.Shared.Popups ;
2024-03-22 10:37:46 +01:00
using Content.Shared.Verbs ;
2023-11-27 22:12:34 +11:00
using Robust.Shared.Audio ;
using Robust.Shared.Audio.Systems ;
2023-06-28 05:48:06 +03:00
using Robust.Shared.Random ;
namespace Content.Server.Lube ;
public sealed class LubeSystem : EntitySystem
{
[Dependency] private readonly SharedAudioSystem _audio = default ! ;
[Dependency] private readonly SharedPopupSystem _popup = default ! ;
[Dependency] private readonly SolutionContainerSystem _solutionContainer = default ! ;
[Dependency] private readonly IRobustRandom _random = default ! ;
2023-08-04 21:18:29 -05:00
[Dependency] private readonly IAdminLogManager _adminLogger = default ! ;
2024-03-22 10:37:46 +01:00
[Dependency] private readonly OpenableSystem _openable = default ! ;
2023-06-28 05:48:06 +03:00
public override void Initialize ( )
{
base . Initialize ( ) ;
2023-09-23 03:10:04 +01:00
SubscribeLocalEvent < LubeComponent , AfterInteractEvent > ( OnInteract , after : new [ ] { typeof ( OpenableSystem ) } ) ;
2024-03-22 10:37:46 +01:00
SubscribeLocalEvent < LubeComponent , GetVerbsEvent < UtilityVerb > > ( OnUtilityVerb ) ;
2023-06-28 05:48:06 +03:00
}
2023-12-29 04:47:43 -08:00
private void OnInteract ( Entity < LubeComponent > entity , ref AfterInteractEvent args )
2023-06-28 05:48:06 +03:00
{
if ( args . Handled )
return ;
if ( ! args . CanReach | | args . Target is not { Valid : true } target )
return ;
2023-12-29 04:47:43 -08:00
if ( TryLube ( entity , target , args . User ) )
2023-06-28 05:48:06 +03:00
args . Handled = true ;
2024-03-22 10:37:46 +01:00
}
private void OnUtilityVerb ( Entity < LubeComponent > entity , ref GetVerbsEvent < UtilityVerb > args )
{
if ( ! args . CanInteract | | ! args . CanAccess | | args . Target is not { Valid : true } target | |
_openable . IsClosed ( entity ) )
return ;
var user = args . User ;
var verb = new UtilityVerb ( )
2023-06-28 05:48:06 +03:00
{
2024-03-22 10:37:46 +01:00
Act = ( ) = > TryLube ( entity , target , user ) ,
IconEntity = GetNetEntity ( entity ) ,
Text = Loc . GetString ( "lube-verb-text" ) ,
Message = Loc . GetString ( "lube-verb-message" )
} ;
args . Verbs . Add ( verb ) ;
2023-06-28 05:48:06 +03:00
}
2024-03-22 10:37:46 +01:00
private bool TryLube ( Entity < LubeComponent > entity , EntityUid target , EntityUid actor )
2023-06-28 05:48:06 +03:00
{
if ( HasComp < LubedComponent > ( target ) | | ! HasComp < ItemComponent > ( target ) )
{
2024-03-22 10:37:46 +01:00
_popup . PopupEntity ( Loc . GetString ( "lube-failure" , ( "target" , Identity . Entity ( target , EntityManager ) ) ) , actor , actor , PopupType . Medium ) ;
2023-06-28 05:48:06 +03:00
return false ;
}
2024-03-22 10:37:46 +01:00
if ( HasComp < ItemComponent > ( target ) & & _solutionContainer . TryGetSolution ( entity . Owner , entity . Comp . Solution , out _ , out var solution ) )
2023-06-28 05:48:06 +03:00
{
2024-03-22 10:37:46 +01:00
var quantity = solution . RemoveReagent ( entity . Comp . Reagent , entity . Comp . Consumption ) ;
2023-06-28 05:48:06 +03:00
if ( quantity > 0 )
{
var lubed = EnsureComp < LubedComponent > ( target ) ;
2024-03-22 10:37:46 +01:00
lubed . SlipsLeft = _random . Next ( entity . Comp . MinSlips * quantity . Int ( ) , entity . Comp . MaxSlips * quantity . Int ( ) ) ;
lubed . SlipStrength = entity . Comp . SlipStrength ;
_adminLogger . Add ( LogType . Action , LogImpact . Medium , $"{ToPrettyString(actor):actor} lubed {ToPrettyString(target):subject} with {ToPrettyString(entity.Owner):tool}" ) ;
_audio . PlayPvs ( entity . Comp . Squeeze , entity . Owner ) ;
_popup . PopupEntity ( Loc . GetString ( "lube-success" , ( "target" , Identity . Entity ( target , EntityManager ) ) ) , actor , actor , PopupType . Medium ) ;
2023-06-28 05:48:06 +03:00
return true ;
}
}
2024-03-22 10:37:46 +01:00
_popup . PopupEntity ( Loc . GetString ( "lube-failure" , ( "target" , Identity . Entity ( target , EntityManager ) ) ) , actor , actor , PopupType . Medium ) ;
2023-06-28 05:48:06 +03:00
return false ;
}
}