2024-08-25 22:18:42 +10:00
using System.Diagnostics.CodeAnalysis ;
2025-03-10 13:00:49 +11:00
using Content.Shared.Administration.Logs ;
using Content.Shared.Database ;
2024-07-29 00:28:17 -07:00
using Content.Shared.Power.Components ;
2025-03-10 13:00:49 +11:00
using Robust.Shared.Audio ;
using Robust.Shared.Audio.Systems ;
2025-05-13 21:49:43 +10:00
using Robust.Shared.Network ;
2024-07-29 00:28:17 -07:00
namespace Content.Shared.Power.EntitySystems ;
2024-05-29 23:46:22 -07:00
public abstract class SharedPowerReceiverSystem : EntitySystem
{
2025-05-13 21:49:43 +10:00
[Dependency] private readonly INetManager _netMan = default ! ;
2025-03-10 13:00:49 +11:00
[Dependency] private readonly ISharedAdminLogManager _adminLogger = default ! ;
[Dependency] private readonly SharedAudioSystem _audio = default ! ;
2025-05-13 21:49:43 +10:00
[Dependency] private readonly SharedPowerNetSystem _net = default ! ;
2025-03-10 13:00:49 +11:00
2024-08-25 22:18:42 +10:00
public abstract bool ResolveApc ( EntityUid entity , [ NotNullWhen ( true ) ] ref SharedApcPowerReceiverComponent ? component ) ;
2025-03-10 13:00:49 +11:00
public void SetNeedsPower ( EntityUid uid , bool value , SharedApcPowerReceiverComponent ? receiver = null )
{
if ( ! ResolveApc ( uid , ref receiver ) | | receiver . NeedsPower = = value )
return ;
receiver . NeedsPower = value ;
Dirty ( uid , receiver ) ;
}
public void SetPowerDisabled ( EntityUid uid , bool value , SharedApcPowerReceiverComponent ? receiver = null )
{
if ( ! ResolveApc ( uid , ref receiver ) | | receiver . PowerDisabled = = value )
return ;
receiver . PowerDisabled = value ;
Dirty ( uid , receiver ) ;
}
/// <summary>
/// Turn this machine on or off.
/// Returns true if we turned it on, false if we turned it off.
/// </summary>
public bool TogglePower ( EntityUid uid , bool playSwitchSound = true , SharedApcPowerReceiverComponent ? receiver = null , EntityUid ? user = null )
{
if ( ! ResolveApc ( uid , ref receiver ) )
return true ;
// it'll save a lot of confusion if 'always powered' means 'always powered'
if ( ! receiver . NeedsPower )
{
2025-05-13 21:49:43 +10:00
var powered = _net . IsPoweredCalculate ( receiver ) ;
// Server won't raise it here as it can raise the load event later with NeedsPower?
// This is mostly here for clientside predictions.
if ( receiver . Powered ! = powered )
{
RaisePower ( ( uid , receiver ) ) ;
}
2025-03-10 13:00:49 +11:00
SetPowerDisabled ( uid , false , receiver ) ;
return true ;
}
SetPowerDisabled ( uid , ! receiver . PowerDisabled , receiver ) ;
if ( user ! = null )
_adminLogger . Add ( LogType . Action , LogImpact . Low , $"{ToPrettyString(user.Value):player} hit power button on {ToPrettyString(uid)}, it's now {(!receiver.PowerDisabled ? " on " : " off ")}" ) ;
if ( playSwitchSound )
{
_audio . PlayPredicted ( new SoundPathSpecifier ( "/Audio/Machines/machine_switch.ogg" ) , uid , user : user ,
AudioParams . Default . WithVolume ( - 2f ) ) ;
}
2025-05-13 21:49:43 +10:00
if ( _netMan . IsClient & & receiver . PowerDisabled )
{
var powered = _net . IsPoweredCalculate ( receiver ) ;
// Server won't raise it here as it can raise the load event later with NeedsPower?
// This is mostly here for clientside predictions.
if ( receiver . Powered ! = powered )
{
receiver . Powered = powered ;
RaisePower ( ( uid , receiver ) ) ;
}
}
2025-03-10 13:00:49 +11:00
return ! receiver . PowerDisabled ; // i.e. PowerEnabled
}
2025-04-19 16:20:40 +10:00
protected virtual void RaisePower ( Entity < SharedApcPowerReceiverComponent > entity )
{
// NOOP on server because client has 0 idea of load so we can't raise it properly in shared.
}
/// <summary>
/// Checks if entity is APC-powered device, and if it have power.
2024-09-27 10:22:17 +03:00
/// </summary>
2024-08-25 22:18:42 +10:00
public bool IsPowered ( Entity < SharedApcPowerReceiverComponent ? > entity )
{
if ( ! ResolveApc ( entity . Owner , ref entity . Comp ) )
return true ;
return entity . Comp . Powered ;
}
2024-07-29 00:28:17 -07:00
protected string GetExamineText ( bool powered )
{
return Loc . GetString ( "power-receiver-component-on-examine-main" ,
( "stateText" , Loc . GetString ( powered
? "power-receiver-component-on-examine-powered"
: "power-receiver-component-on-examine-unpowered" ) ) ) ;
}
2024-05-29 23:46:22 -07:00
}