public void AddRecruitedMember(Character newMember, Character recruiterMember) { IsActive.ThrowIfFalse(ErrorCodes.AccessDenied); IsAvailableFreeSlot.ThrowIfFalse(ErrorCodes.CorporationMaxMembersReached); var oldCorporation = newMember.GetCorporation(); //this protects the alliance board member complication and default corp situation var role = GetRoleFromSql(newMember); role.ThrowIfNotEqual(CorporationRole.NotDefined, ErrorCodes.MemberHasRolesError); CorporationManager.IsJoinAllowed(newMember).ThrowIfFalse(ErrorCodes.CorporationChangeTooOften); AddMember(newMember, CorporationRole.NotDefined, oldCorporation); oldCorporation.RemoveMember(newMember); newMember.GetCorporationApplications().DeleteAll(); _channelManager.LeaveChannel(oldCorporation.ChannelName, newMember); _channelManager.JoinChannel(ChannelName, newMember, GetMemberRole(newMember)); Transaction.Current.OnCommited(() => { CorporationManager.InformCorporationMemberTransferred(oldCorporation, this, newMember); newMember.GetPlayerRobotFromZone()?.UpdateCorporationOnZone(Eid); var info = new Dictionary <string, object> { { k.@from, oldCorporation.Eid }, { k.to, Eid }, { k.characterID, newMember.Id }, }; ZoneManager.Value.Zones.ForEach(z => z.UpdateCorporation(CorporationCommand.TransferMember, info)); CorporationData.RemoveFromCache(oldCorporation.Eid); CorporationData.RemoveFromCache(Eid); if (_characterProfiles is CachedReadOnlyRepository <int, CharacterProfile> c) { c.Remove(newMember.Id); } }); }