#3846 - fix for ControlMobVerb not working for ghosts (#4131)

* #3846 - fix for ControlMobVerb not working for ghosts

* #3846 - small improvents from CR

* #3846 incorpated suggested changes

* #3846 simplified visiting entity check in mind.cs
This commit is contained in:
Galactic Chimp
2021-06-12 06:51:04 +02:00
committed by GitHub
parent 1b429cd8b6
commit ca4e665296
3 changed files with 12 additions and 4 deletions

View File

@@ -49,7 +49,7 @@ namespace Content.Server.Cloning
mindComp.Mind != null)
return;
mind.TransferTo(entity);
mind.TransferTo(entity, ghostCheckOverride: true);
mind.UnVisit();
ClonesWaitingForMind.Remove(mind);
}

View File

@@ -235,10 +235,13 @@ namespace Content.Server.Mind
/// The entity to control.
/// Can be null, in which case it will simply detach the mind from any entity.
/// </param>
/// <param name="ghostCheckOverride">
/// If true, skips ghost check for Visiting Entity
/// </param>
/// <exception cref="ArgumentException">
/// Thrown if <paramref name="entity"/> is already owned by another mind.
/// </exception>
public void TransferTo(IEntity? entity)
public void TransferTo(IEntity? entity, bool ghostCheckOverride = false)
{
MindComponent? component = null;
var alreadyAttached = false;
@@ -272,8 +275,13 @@ namespace Content.Server.Mind
OwnedComponent = component;
OwnedComponent?.InternalAssignMind(this);
if (VisitingEntity?.HasComponent<GhostComponent>() == false)
if (IsVisitingEntity
&& (ghostCheckOverride // to force mind transfer, for example from ControlMobVerb
|| !VisitingEntity!.TryGetComponent(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 = null;
}
// Player is CURRENTLY connected.
if (Session != null && !alreadyAttached && VisitingEntity == null)

View File

@@ -56,7 +56,7 @@ namespace Content.Server.Mind.Verbs
var targetMind = target.GetComponent<MindComponent>();
targetMind.Mind?.TransferTo(null);
userMind?.TransferTo(target);
userMind?.TransferTo(target, ghostCheckOverride: true);
}
}
}