private void OnRemoveItemBuiMessage(Entity<CryostorageComponent> ent, ref CryostorageRemoveItemBuiMessage args)
{
- var comp = ent.Comp;
+ var (_, comp) = ent;
if (args.Session.AttachedEntity is not { } attachedEntity)
return;
- var cryoContained = GetEntity(args.Entity);
+ var cryoContained = GetEntity(args.StoredEntity);
- if (!comp.StoredPlayers.Contains(cryoContained))
+ if (!comp.StoredPlayers.Contains(cryoContained) || !IsInPausedMap(cryoContained))
return;
if (!HasComp<HandsComponent>(attachedEntity))
if (comp.GracePeriodEndTime != null)
comp.GracePeriodEndTime = Timing.CurTime + cryostorageComponent.NoMindGracePeriod;
+ comp.AllowReEnteringBody = false;
comp.UserId = args.Mind.Comp.UserId;
}
if (args.NewStatus is SessionStatus.Disconnected or SessionStatus.Zombie)
{
- if (CryoSleepRejoiningEnabled)
- containedComponent.StoredWhileDisconnected = true;
-
+ containedComponent.AllowReEnteringBody = true;
var delay = CompOrNull<CryostorageComponent>(containedComponent.Cryostorage)?.NoMindGracePeriod ?? TimeSpan.Zero;
containedComponent.GracePeriodEndTime = Timing.CurTime + delay;
containedComponent.UserId = args.Session.UserId;
return;
}
- if (!comp.StoredWhileDisconnected &&
- userId != null &&
- Mind.TryGetMind(userId.Value, out var mind) &&
- mind.Value.Comp.Session?.AttachedEntity == ent)
+ if (!CryoSleepRejoiningEnabled || !comp.AllowReEnteringBody)
{
- _gameTicker.OnGhostAttempt(mind.Value, false);
+ if (userId != null && Mind.TryGetMind(userId.Value, out var mind))
+ {
+ _gameTicker.OnGhostAttempt(mind.Value, false);
+ }
}
+ comp.AllowReEnteringBody = false;
_transform.SetParent(ent, PausedMap.Value);
cryostorageComponent.StoredPlayers.Add(ent);
+ Dirty(ent, comp);
UpdateCryostorageUIState((cryostorageEnt.Value, cryostorageComponent));
AdminLog.Add(LogType.Action, LogImpact.High, $"{ToPrettyString(ent):player} was entered into cryostorage inside of {ToPrettyString(cryostorageEnt.Value)}");
}
private void HandleCryostorageReconnection(Entity<CryostorageContainedComponent> entity)
{
var (uid, comp) = entity;
- if (!CryoSleepRejoiningEnabled || !comp.StoredWhileDisconnected)
+ if (!CryoSleepRejoiningEnabled || !IsInPausedMap(uid))
return;
// how did you destroy these? they're indestructible.
if (comp.Cryostorage is not { } cryostorage ||
TerminatingOrDeleted(cryostorage) ||
- !TryComp<CryostorageComponent>(comp.Cryostorage, out var cryostorageComponent))
+ !TryComp<CryostorageComponent>(cryostorage, out var cryostorageComponent))
{
QueueDel(entity);
return;
}
comp.GracePeriodEndTime = null;
- comp.StoredWhileDisconnected = false;
- cryostorageComponent.StoredPlayers.Remove(entity);
+ cryostorageComponent.StoredPlayers.Remove(uid);
AdminLog.Add(LogType.Action, LogImpact.High, $"{ToPrettyString(entity):player} re-entered the game from cryostorage {ToPrettyString(cryostorage)}");
UpdateCryostorageUIState((cryostorage, cryostorageComponent));
}
var query = EntityQueryEnumerator<CryostorageContainedComponent>();
while (query.MoveNext(out var uid, out var containedComp))
{
- if (containedComp.GracePeriodEndTime == null || containedComp.StoredWhileDisconnected)
+ if (containedComp.GracePeriodEndTime == null)
continue;
if (Timing.CurTime < containedComp.GracePeriodEndTime)
/// will delete their body and redistribute their items.
/// </summary>
[RegisterComponent, NetworkedComponent]
+[AutoGenerateComponentState]
public sealed partial class CryostorageComponent : Component
{
[DataField, ViewVariables(VVAccess.ReadWrite)]
/// How long a player can remain inside Cryostorage before automatically being taken care of, given that they have no mind.
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite)]
+ [AutoNetworkedField]
public TimeSpan NoMindGracePeriod = TimeSpan.FromSeconds(30f);
/// <summary>
/// How long a player can remain inside Cryostorage before automatically being taken care of.
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite)]
+ [AutoNetworkedField]
public TimeSpan GracePeriod = TimeSpan.FromMinutes(5f);
/// <summary>
/// A list of players who have actively entered cryostorage.
/// </summary>
[DataField]
+ [AutoNetworkedField]
public List<EntityUid> StoredPlayers = new();
/// <summary>
[Serializable, NetSerializable]
public sealed class CryostorageRemoveItemBuiMessage : BoundUserInterfaceMessage
{
- public NetEntity Entity;
+ public NetEntity StoredEntity;
public string Key;
Inventory
}
- public CryostorageRemoveItemBuiMessage(NetEntity entity, string key, RemovalType type)
+ public CryostorageRemoveItemBuiMessage(NetEntity storedEntity, string key, RemovalType type)
{
- Entity = entity;
+ StoredEntity = storedEntity;
Key = key;
Type = type;
}
SubscribeLocalEvent<RoundRestartCleanupEvent>(OnRoundRestart);
- _configuration.OnValueChanged(CCVars.GameCryoSleepRejoining, OnCvarChanged);
+ _configuration.OnValueChanged(CCVars.GameCryoSleepRejoining, OnCvarChanged, true);
}
public override void Shutdown()
private void OnRemovedContained(Entity<CryostorageContainedComponent> ent, ref EntGotRemovedFromContainerMessage args)
{
- var (_, comp) = ent;
- if (!comp.StoredWhileDisconnected)
+ var (uid, comp) = ent;
+ if (!IsInPausedMap(uid))
RemCompDeferred(ent, comp);
}
_mapManager.SetMapPaused(map, true);
PausedMap = _mapManager.GetMapEntityId(map);
}
+
+ public bool IsInPausedMap(Entity<TransformComponent?> entity)
+ {
+ var (_, comp) = entity;
+ comp ??= Transform(entity);
+
+ return comp.MapUid != null && comp.MapUid == PausedMap;
+ }
}