2023-05-03 01:38:03 -04:00
using Content.Shared.DoAfter ;
2025-04-16 17:33:02 -04:00
using Content.Shared.IdentityManagement ;
2023-05-03 01:38:03 -04:00
using Content.Shared.Interaction ;
using Content.Shared.Popups ;
using Content.Shared.Wires ;
namespace Content.Shared.VendingMachines ;
public abstract partial class SharedVendingMachineSystem
{
public bool TryAccessMachine ( EntityUid uid ,
VendingMachineRestockComponent restock ,
VendingMachineComponent machineComponent ,
EntityUid user ,
EntityUid target )
{
if ( ! TryComp < WiresPanelComponent > ( target , out var panel ) | | ! panel . Open )
{
2025-04-18 00:01:46 -04:00
Popup . PopupPredictedCursor ( Loc . GetString ( "vending-machine-restock-needs-panel-open" ,
2025-04-17 05:39:14 +10:00
( "this" , uid ) ,
( "user" , user ) ,
( "target" , target ) ) ,
user ) ;
2023-05-03 01:38:03 -04:00
return false ;
}
return true ;
}
public bool TryMatchPackageToMachine ( EntityUid uid ,
VendingMachineRestockComponent component ,
VendingMachineComponent machineComponent ,
EntityUid user ,
EntityUid target )
{
if ( ! component . CanRestock . Contains ( machineComponent . PackPrototypeId ) )
{
2025-04-18 00:01:46 -04:00
Popup . PopupPredictedCursor ( Loc . GetString ( "vending-machine-restock-invalid-inventory" , ( "this" , uid ) , ( "user" , user ) ,
2025-04-17 05:39:14 +10:00
( "target" , target ) ) , user ) ;
2023-05-03 01:38:03 -04:00
return false ;
}
return true ;
}
2025-09-11 14:27:54 -04:00
public void TryRestockInventory ( EntityUid uid , VendingMachineComponent ? vendComponent = null )
{
if ( ! Resolve ( uid , ref vendComponent ) )
return ;
RestockInventoryFromPrototype ( uid , vendComponent ) ;
Dirty ( uid , vendComponent ) ;
TryUpdateVisualState ( ( uid , vendComponent ) ) ;
}
2023-05-03 01:38:03 -04:00
private void OnAfterInteract ( EntityUid uid , VendingMachineRestockComponent component , AfterInteractEvent args )
{
if ( args . Target is not { } target | | ! args . CanReach | | args . Handled )
return ;
if ( ! TryComp < VendingMachineComponent > ( args . Target , out var machineComponent ) )
return ;
if ( ! TryMatchPackageToMachine ( uid , component , machineComponent , args . User , target ) )
return ;
if ( ! TryAccessMachine ( uid , component , machineComponent , args . User , target ) )
return ;
args . Handled = true ;
2025-09-11 14:27:54 -04:00
var doAfterArgs = new DoAfterArgs ( EntityManager ,
args . User ,
component . RestockDelay ,
new RestockDoAfterEvent ( ) ,
target ,
target : target ,
used : uid )
2023-05-03 01:38:03 -04:00
{
2024-03-19 12:09:00 +02:00
BreakOnMove = true ,
2023-05-03 01:38:03 -04:00
BreakOnDamage = true ,
2024-08-08 04:39:46 -07:00
NeedHand = true ,
2023-05-03 01:38:03 -04:00
} ;
if ( ! _doAfter . TryStartDoAfter ( doAfterArgs ) )
return ;
2025-04-16 17:33:02 -04:00
var selfMessage = Loc . GetString ( "vending-machine-restock-start-self" , ( "target" , target ) ) ;
2025-09-11 14:27:54 -04:00
var othersMessage = Loc . GetString ( "vending-machine-restock-start-others" ,
( "user" , Identity . Entity ( args . User , EntityManager ) ) ,
( "target" , target ) ) ;
Popup . PopupPredicted ( selfMessage , othersMessage , target , args . User , PopupType . Medium ) ;
if ( ! Timing . IsFirstTimePredicted )
return ;
Audio . Stop ( machineComponent . RestockStream ) ;
machineComponent . RestockStream = Audio . PlayPredicted ( component . SoundRestockStart , target , args . User ) ? . Entity ;
}
private void OnRestockDoAfter ( Entity < VendingMachineComponent > ent , ref RestockDoAfterEvent args )
{
if ( args . Cancelled )
{
// Future predicted ticks can clobber the RestockStream with null while not stopping anything
if ( Timing . IsFirstTimePredicted )
ent . Comp . RestockStream = Audio . Stop ( ent . Comp . RestockStream ) ;
return ;
}
if ( args . Handled | | args . Used = = null )
return ;
if ( ! TryComp < VendingMachineRestockComponent > ( args . Used , out var restockComponent ) )
{
Log . Error ( $"{ToPrettyString(args.User)} tried to restock {ToPrettyString(ent)} with {ToPrettyString(args.Used.Value)} which did not have a VendingMachineRestockComponent." ) ;
return ;
}
TryRestockInventory ( ent , ent . Comp ) ;
var userMessage = Loc . GetString ( "vending-machine-restock-done-self" , ( "target" , ent ) ) ;
var othersMessage = Loc . GetString ( "vending-machine-restock-done-others" ,
( "user" , Identity . Entity ( args . User , EntityManager ) ) ,
( "target" , ent ) ) ;
Popup . PopupPredicted ( userMessage , othersMessage , ent , args . User , PopupType . Medium ) ;
Audio . PlayPredicted ( restockComponent . SoundRestockDone , ent , args . User ) ;
2023-05-03 01:38:03 -04:00
2025-09-11 14:27:54 -04:00
PredictedQueueDel ( args . Used . Value ) ;
2023-05-03 01:38:03 -04:00
}
}