Fix aghost crashes (#8556)

There's still some oddity around MobObserver / AdminObserver where if you move after suicide then aghost you return to your original body, but at least you won't spawn a billion AdminObservers anymore or crash if you controlmob one.
This commit is contained in:
metalgearsloth
2022-06-03 07:17:58 +10:00
committed by GitHub
parent cebe78394c
commit 5d75539c7e

View File

@@ -264,6 +264,13 @@ namespace Content.Server.Mind
/// </exception>
public void TransferTo(EntityUid? entity, bool ghostCheckOverride = false)
{
// Looks like caller just wants us to go back to normal.
if (entity == OwnedEntity)
{
UnVisit();
return;
}
var entMan = IoCManager.Resolve<IEntityManager>();
MindComponent? component = null;
@@ -306,11 +313,11 @@ namespace Content.Server.Mind
|| !entMan.TryGetComponent(VisitingEntity!, out GhostComponent? ghostComponent) // visiting entity is not a Ghost
|| !ghostComponent.CanReturnToBody)) // it is a ghost, but cannot return to body anyway, so it's okay
{
VisitingEntity = default;
RemoveVisitingEntity();
}
// Player is CURRENTLY connected.
if (Session != null && !alreadyAttached && VisitingEntity == default)
if (Session != null && !alreadyAttached && VisitingEntity == null)
{
Session.AttachToEntity(entity);
Logger.Info($"Session {Session.Name} transferred to entity {entity}.");
@@ -370,17 +377,26 @@ namespace Content.Server.Mind
Logger.Info($"Session {Session?.Name} visiting entity {entity}.");
}
/// <summary>
/// Returns the mind to its original entity.
/// </summary>
public void UnVisit()
{
if (VisitingEntity == null)
{
return;
}
Session?.AttachToEntity(OwnedEntity);
RemoveVisitingEntity();
}
/// <summary>
/// Cleans up the VisitingEntity.
/// </summary>
private void RemoveVisitingEntity()
{
if (VisitingEntity == null)
return;
var oldVisitingEnt = VisitingEntity.Value;
// Null this before removing the component to avoid any infinite loops.
VisitingEntity = default;
VisitingEntity = null;
DebugTools.AssertNotNull(oldVisitingEnt);