void GroupManager::leaveGroup(ManagedReference<GroupObject*> group, CreatureObject* player) { // Pre: player locked // Post: player locked if (group == NULL) return; try { Locker clocker(group, player); ChatRoom* groupChannel = group->getGroupChannel(); if (groupChannel != NULL && player->isPlayerCreature()) { CreatureObject* playerCreature = cast<CreatureObject*>( player); groupChannel->removePlayer(playerCreature, false); groupChannel->sendDestroyTo(playerCreature); ChatRoom* room = groupChannel->getParent(); room->sendDestroyTo(playerCreature); } if (!group->isOtherMemberPlayingMusic(player)) group->setBandSong(""); player->updateGroup(NULL); //if (player != NULL && player->isOnline() && !player->isLoggingOut()) if (player->isPlayerCreature()) player->sendSystemMessage("@group:removed"); player->unlock(); group->removeMember(player); if (player->isPlayerCreature()) group->sendDestroyTo(player); player->info("leaving group"); if (group->getGroupSize() < 2) { group->disband(); } } catch (Exception& e) { System::out << e.getMessage(); e.printStackTrace(); } catch (...) { player->wlock(); throw; } player->wlock(); }
void GroupObjectImplementation::disband() { // this locked ManagedReference<ChatRoom* > chat = chatRoom; for (int i = 0; i < groupMembers.size(); i++) { if (groupMembers.get(i) == NULL) { continue; } Reference<CreatureObject*> groupMember = getGroupMember(i).castTo<CreatureObject*>(); try { Locker clocker(groupMember, _this.get()); if (groupMember->isPlayerCreature()) { if (chat != NULL) { chat->removePlayer(groupMember, false); chat->sendDestroyTo(groupMember); ChatRoom* room = chat->getParent(); room->sendDestroyTo(groupMember); } if (groupMember->getPlayerObject() != NULL) { PlayerObject* ghost = groupMember->getPlayerObject(); ghost->removeWaypointBySpecialType(WaypointObject::SPECIALTYPE_NEARESTMISSIONFORGROUP); } } groupMember->updateGroup(NULL); //play->updateGroupId(0); //sendClosestWaypointDestroyTo(play); //removeSquadLeaderBonuses(play); } catch (Exception& e) { System::out << "Exception in GroupObject::disband(Player* player)\n"; } } destroyChatRoom(); if (hasSquadLeader()) removeGroupModifiers(); groupMembers.removeAll(); //The mission waypoints should not be destroyed. They belong to the players. //missionWaypoints.removeAll(); }