/// <summary> /// Transfer this mind's control over to a new entity. /// </summary> /// <param name="entity"> /// The entity to control. /// Can be null, in which case it will simply detach the mind from any entity. /// </param> /// <exception cref="ArgumentException"> /// Thrown if <paramref name="entity"/> is already owned by another mind. /// </exception> public void TransferTo(IEntity entity) { MindComponent component = null; if (entity != null) { if (!entity.TryGetComponent(out component)) { component = entity.AddComponent <MindComponent>(); } else if (component.HasMind) { // TODO: Kick them out, maybe? throw new ArgumentException("That entity already has a mind.", nameof(entity)); } } OwnedMob?.InternalEjectMind(); OwnedMob = component; OwnedMob?.InternalAssignMind(this); // Player is CURRENTLY connected. if (Session != null && OwnedMob != null) { Session.AttachToEntity(entity); } VisitingEntity = null; }
/// <summary> /// Transfer this mind's control over to a new entity. /// </summary> /// <param name="entity"> /// The entity to control. /// Can be null, in which case it will simply detach the mind from any entity. /// </param> /// <exception cref="ArgumentException"> /// Thrown if <paramref name="entity"/> is already owned by another mind. /// </exception> public void TransferTo(IEntity entity) { MindComponent component = null; bool alreadyAttached = false; if (entity != null) { if (!entity.TryGetComponent(out component)) { component = entity.AddComponent <MindComponent>(); } else if (component.HasMind) { // TODO: Kick them out, maybe? throw new ArgumentException("That entity already has a mind.", nameof(entity)); } if (entity.TryGetComponent(out IActorComponent actor)) { // Happens when transferring to your currently visited entity. if (actor.playerSession != Session) { throw new ArgumentException("Visit target already has a session.", nameof(entity)); } alreadyAttached = true; } } OwnedMob?.InternalEjectMind(); OwnedMob = component; OwnedMob?.InternalAssignMind(this); // Player is CURRENTLY connected. if (Session != null && OwnedMob != null && !alreadyAttached) { Session.AttachToEntity(entity); } VisitingEntity = null; }