using System; using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.EntitySystems; using Content.Server.Players; using Robust.Server.Player; using Robust.Shared.GameObjects; using Robust.Shared.Utility; namespace Content.Server.GameObjects.Components.Observer.GhostRoles { /// /// Allows a ghost to take over the Owner entity. /// [RegisterComponent, ComponentReference(typeof(GhostRoleComponent))] public class GhostTakeoverAvailableComponent : GhostRoleComponent { public override string Name => "GhostTakeoverAvailable"; public override bool Take(IPlayerSession session) { if (Taken) return false; Taken = true; var mind = Owner.EnsureComponent(); if (mind.HasMind) throw new Exception("MindComponent already has a mind!"); var sessionMind = session.ContentData()?.Mind; DebugTools.AssertNotNull(sessionMind); sessionMind!.TransferTo(Owner); EntitySystem.Get().UnregisterGhostRole(this); return true; } } }