Predicted movement opening lockers (#24937)

Relay wasn't really networked properly and this annoys me.

EntityStorage is still pretty skrunkly but this fixes the main issue I think.
This commit is contained in:
metalgearsloth
2024-02-04 13:23:16 +11:00
committed by GitHub
parent 7d1567281f
commit 042feae2e9
4 changed files with 20 additions and 6 deletions

View File

@@ -17,6 +17,7 @@ public sealed class EntityStorageSystem : SharedEntityStorageSystem
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
SubscribeLocalEvent<EntityStorageComponent, EntityUnpausedEvent>(OnEntityUnpausedEvent);
SubscribeLocalEvent<EntityStorageComponent, ComponentInit>(OnComponentInit); SubscribeLocalEvent<EntityStorageComponent, ComponentInit>(OnComponentInit);
SubscribeLocalEvent<EntityStorageComponent, ComponentStartup>(OnComponentStartup); SubscribeLocalEvent<EntityStorageComponent, ComponentStartup>(OnComponentStartup);
SubscribeLocalEvent<EntityStorageComponent, ActivateInWorldEvent>(OnInteract, after: new[] { typeof(LockSystem) }); SubscribeLocalEvent<EntityStorageComponent, ActivateInWorldEvent>(OnInteract, after: new[] { typeof(LockSystem) });

View File

@@ -33,6 +33,7 @@ public sealed class EntityStorageSystem : SharedEntityStorageSystem
base.Initialize(); base.Initialize();
/* CompRef things */ /* CompRef things */
SubscribeLocalEvent<EntityStorageComponent, EntityUnpausedEvent>(OnEntityUnpausedEvent);
SubscribeLocalEvent<EntityStorageComponent, ComponentInit>(OnComponentInit); SubscribeLocalEvent<EntityStorageComponent, ComponentInit>(OnComponentInit);
SubscribeLocalEvent<EntityStorageComponent, ComponentStartup>(OnComponentStartup); SubscribeLocalEvent<EntityStorageComponent, ComponentStartup>(OnComponentStartup);
SubscribeLocalEvent<EntityStorageComponent, ActivateInWorldEvent>(OnInteract, after: new[] { typeof(LockSystem) }); SubscribeLocalEvent<EntityStorageComponent, ActivateInWorldEvent>(OnInteract, after: new[] { typeof(LockSystem) });

View File

@@ -14,7 +14,7 @@ public abstract partial class SharedEntityStorageComponent : Component
public readonly float MaxSize = 1.0f; // maximum width or height of an entity allowed inside the storage. 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 static readonly TimeSpan InternalOpenAttemptDelay = TimeSpan.FromSeconds(0.5);
public TimeSpan LastInternalOpenAttempt; public TimeSpan NextInternalOpenAttempt;
/// <summary> /// <summary>
/// Collision masks that get removed when the storage gets opened. /// Collision masks that get removed when the storage gets opened.
@@ -139,13 +139,16 @@ public sealed class EntityStorageComponentState : ComponentState
public float EnteringRange; 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; Open = open;
Capacity = capacity; Capacity = capacity;
IsCollidableWhenOpen = isCollidableWhenOpen; IsCollidableWhenOpen = isCollidableWhenOpen;
OpenOnMove = openOnMove; OpenOnMove = openOnMove;
EnteringRange = enteringRange; EnteringRange = enteringRange;
NextInternalOpenAttempt = nextInternalOpenAttempt;
} }
} }

View File

@@ -48,13 +48,19 @@ public abstract class SharedEntityStorageSystem : EntitySystem
public const string ContainerName = "entity_storage"; 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) protected void OnGetState(EntityUid uid, SharedEntityStorageComponent component, ref ComponentGetState args)
{ {
args.State = new EntityStorageComponentState(component.Open, args.State = new EntityStorageComponentState(component.Open,
component.Capacity, component.Capacity,
component.IsCollidableWhenOpen, component.IsCollidableWhenOpen,
component.OpenOnMove, component.OpenOnMove,
component.EnteringRange); component.EnteringRange,
component.NextInternalOpenAttempt);
} }
protected void OnHandleState(EntityUid uid, SharedEntityStorageComponent component, ref ComponentHandleState args) protected void OnHandleState(EntityUid uid, SharedEntityStorageComponent component, ref ComponentHandleState args)
@@ -66,6 +72,7 @@ public abstract class SharedEntityStorageSystem : EntitySystem
component.IsCollidableWhenOpen = state.IsCollidableWhenOpen; component.IsCollidableWhenOpen = state.IsCollidableWhenOpen;
component.OpenOnMove = state.OpenOnMove; component.OpenOnMove = state.OpenOnMove;
component.EnteringRange = state.EnteringRange; component.EnteringRange = state.EnteringRange;
component.NextInternalOpenAttempt = state.NextInternalOpenAttempt;
} }
protected virtual void OnComponentInit(EntityUid uid, SharedEntityStorageComponent component, ComponentInit args) protected virtual void OnComponentInit(EntityUid uid, SharedEntityStorageComponent component, ComponentInit args)
@@ -123,10 +130,12 @@ public abstract class SharedEntityStorageSystem : EntitySystem
if (!HasComp<HandsComponent>(args.Entity)) if (!HasComp<HandsComponent>(args.Entity))
return; return;
if (_timing.CurTime < component.LastInternalOpenAttempt + SharedEntityStorageComponent.InternalOpenAttemptDelay) if (_timing.CurTime < component.NextInternalOpenAttempt)
return; return;
component.LastInternalOpenAttempt = _timing.CurTime; component.NextInternalOpenAttempt = _timing.CurTime + SharedEntityStorageComponent.InternalOpenAttemptDelay;
Dirty(uid, component);
if (component.OpenOnMove) if (component.OpenOnMove)
{ {
TryOpenStorage(args.Entity, uid); TryOpenStorage(args.Entity, uid);
@@ -259,7 +268,7 @@ public abstract class SharedEntityStorageSystem : EntitySystem
ModifyComponents(uid, component); ModifyComponents(uid, component);
if (_net.IsClient && _timing.IsFirstTimePredicted) if (_net.IsClient && _timing.IsFirstTimePredicted)
_audio.PlayPvs(component.CloseSound, uid); _audio.PlayPvs(component.CloseSound, uid);
component.LastInternalOpenAttempt = default;
var afterev = new StorageAfterCloseEvent(); var afterev = new StorageAfterCloseEvent();
RaiseLocalEvent(uid, ref afterev); RaiseLocalEvent(uid, ref afterev);
} }