protected virtual bool DoLeave(string rawParameters, params CommandParameter[] parameters) { // Member leaving if (Leader != null && Leader.GroupMembers.Any(x => x == this)) { Leader.RemoveGroupMember(this, false); } // Leader leaving -> change leader else if (GroupMembers.Any()) { ICharacter newLeader = GroupMembers.FirstOrDefault(); if (newLeader == null) { Log.Default.WriteLine(LogLevels.Error, "DoLeave: problem with group, leader leaving but no other group member found."); return(true); } // New leader has no leader newLeader.ChangeLeader(null); // Remove member from old leader and add it to new leader IReadOnlyCollection <ICharacter> members = new ReadOnlyCollection <ICharacter>(GroupMembers.Where(x => x != newLeader).ToList()); // clone because RemoveGroupMember will modify GroupMembers foreach (ICharacter member in members) { RemoveGroupMember(member, true); newLeader.AddGroupMember(member, true); } // Warn members about leader change newLeader.Send("You are the new group leader."); //foreach (ICharacter member in newLeader.GroupMembers) // member.Act(ActOptions.ToCharacter, "{0} is the new group leader.", newLeader); Act(ActOptions.ToGroup, "{0} is the new group leader.", newLeader); } else { Send("You are not in a group."); } return(true); }