public override void Initialize()
{
base.Initialize();
+ SubscribeLocalEvent<EntityStorageComponent, EntityUnpausedEvent>(OnEntityUnpausedEvent);
SubscribeLocalEvent<EntityStorageComponent, ComponentInit>(OnComponentInit);
SubscribeLocalEvent<EntityStorageComponent, ComponentStartup>(OnComponentStartup);
SubscribeLocalEvent<EntityStorageComponent, ActivateInWorldEvent>(OnInteract, after: new[] { typeof(LockSystem) });
public readonly float MaxSize = 1.0f; // maximum width or height of an entity allowed inside the storage.
public static readonly TimeSpan InternalOpenAttemptDelay = TimeSpan.FromSeconds(0.5);
- public TimeSpan LastInternalOpenAttempt;
+ public TimeSpan NextInternalOpenAttempt;
/// <summary>
/// Collision masks that get removed when the storage gets opened.
public float EnteringRange;
- public EntityStorageComponentState(bool open, int capacity, bool isCollidableWhenOpen, bool openOnMove, float enteringRange)
+ public TimeSpan NextInternalOpenAttempt;
+
+ public EntityStorageComponentState(bool open, int capacity, bool isCollidableWhenOpen, bool openOnMove, float enteringRange, TimeSpan nextInternalOpenAttempt)
{
Open = open;
Capacity = capacity;
IsCollidableWhenOpen = isCollidableWhenOpen;
OpenOnMove = openOnMove;
EnteringRange = enteringRange;
+ NextInternalOpenAttempt = nextInternalOpenAttempt;
}
}
public const string ContainerName = "entity_storage";
+ protected void OnEntityUnpausedEvent(EntityUid uid, SharedEntityStorageComponent component, EntityUnpausedEvent args)
+ {
+ component.NextInternalOpenAttempt += args.PausedTime;
+ }
+
protected void OnGetState(EntityUid uid, SharedEntityStorageComponent component, ref ComponentGetState args)
{
args.State = new EntityStorageComponentState(component.Open,
component.Capacity,
component.IsCollidableWhenOpen,
component.OpenOnMove,
- component.EnteringRange);
+ component.EnteringRange,
+ component.NextInternalOpenAttempt);
}
protected void OnHandleState(EntityUid uid, SharedEntityStorageComponent component, ref ComponentHandleState args)
component.IsCollidableWhenOpen = state.IsCollidableWhenOpen;
component.OpenOnMove = state.OpenOnMove;
component.EnteringRange = state.EnteringRange;
+ component.NextInternalOpenAttempt = state.NextInternalOpenAttempt;
}
protected virtual void OnComponentInit(EntityUid uid, SharedEntityStorageComponent component, ComponentInit args)
if (!HasComp<HandsComponent>(args.Entity))
return;
- if (_timing.CurTime < component.LastInternalOpenAttempt + SharedEntityStorageComponent.InternalOpenAttemptDelay)
+ if (_timing.CurTime < component.NextInternalOpenAttempt)
return;
- component.LastInternalOpenAttempt = _timing.CurTime;
+ component.NextInternalOpenAttempt = _timing.CurTime + SharedEntityStorageComponent.InternalOpenAttemptDelay;
+ Dirty(uid, component);
+
if (component.OpenOnMove)
{
TryOpenStorage(args.Entity, uid);
ModifyComponents(uid, component);
if (_net.IsClient && _timing.IsFirstTimePredicted)
_audio.PlayPvs(component.CloseSound, uid);
- component.LastInternalOpenAttempt = default;
+
var afterev = new StorageAfterCloseEvent();
RaiseLocalEvent(uid, ref afterev);
}