bool Party::removeInvite(Player& player, bool removeFromPlayer/* = true*/) { auto it = std::find(inviteList.begin(), inviteList.end(), &player); if (it == inviteList.end()) { return false; } inviteList.erase(it); leader->sendCreatureShield(&player); player.sendCreatureShield(leader); if (removeFromPlayer) { player.removePartyInvitation(this); } if (disbandParty()) { disband(); } return true; }
bool MoverGroup::remove(MoverPtr mover) { GameObjectWatchID moverWID = mover->getWatchID(); if (moverWID == pointWID) { disband(); return (true); } else { for (size_t i = 0; i < numMovers; i++) if (moverWIDs[i] == moverWID) { mover->setGroupId(-1, true); moverWIDs[i] = moverWIDs[numMovers - 1]; moverWIDs[numMovers - 1] = 0; numMovers--; return (true); } } return (false); }
bool Party::leaveParty(Player* player) { if (!player) { return false; } if (player->getParty() != this && leader != player) { return false; } if (!g_events->eventPartyOnLeave(this, player)) { return false; } bool missingLeader = false; if (leader == player) { if (!memberList.empty()) { if (memberList.size() == 1 && inviteList.empty()) { missingLeader = true; } else { passPartyLeadership(memberList.front()); } } else { missingLeader = true; } } //since we already passed the leadership, we remove the player from the list auto it = std::find(memberList.begin(), memberList.end(), player); if (it != memberList.end()) { memberList.erase(it); } player->setParty(nullptr); player->sendClosePrivate(CHANNEL_PARTY); g_game.updatePlayerShield(player); g_game.updatePlayerHelpers(*player); for (Player* member : memberList) { member->sendCreatureSkull(player); player->sendPlayerPartyIcons(member); g_game.updatePlayerHelpers(*member); } leader->sendCreatureSkull(player); player->sendCreatureSkull(player); player->sendPlayerPartyIcons(leader); player->sendTextMessage(MESSAGE_INFO_DESCR, "You have left the party."); updateSharedExperience(); updateVocationsList(); clearPlayerPoints(player); std::ostringstream ss; ss << player->getName() << " has left the party."; broadcastPartyMessage(MESSAGE_INFO_DESCR, ss.str()); if (missingLeader || empty()) { disband(); } return true; }
void GroupObject::removeMember(Player* player) { PlayerList::iterator listIt = mMembers.begin(); while(listIt != mMembers.end()) { // find the player to remove if((*listIt) == player) { // remove player from the group channel if(mChannel) { mChannel->removeUser(player); gChatMessageLib->sendChatOnDestroyRoom(player->getClient(), mChannel, 0); } player->setGroupId(0); // if he is the last member if(mMembers.size() <= 2) { disband(); break; } // tell the zone to send the groupId delta // FIXME: player's network client is already dead!! gChatMessageLib->sendIsmGroupCREO6deltaGroupId(0, player); // remove from list mMembers.erase(listIt); broadcastDeltaRemove(player); // if player was the leader if(player->getGroupMemberIndex() == 0) { // TODO: delegate zone for handling inrange sys messages gChatMessageLib->sendGroupSystemMessage(getLeader()->getName(), BString("new_leader"), NULL, this, true); } else // if he wasnt leader, { // but was Master Looter if(player->getCharId() == mMasterLooter) { // give MasterLootership to the new leader this->changeMasterLooter(getLeader()); } } // recalculate indexes resetIndexes(); gChatMessageLib->sendSystemMessage(player,L"@group:removed"); // minus minus mMemberCount--; // lets get out of this! break; } ++listIt; } }
bool Party::leaveParty(Player* player) { if(!player){ return false; } if(!isPlayerMember(player) && getLeader() != player){ return false; } // Remove from chat PrivateChatChannel* pcc = static_cast<PrivateChatChannel*>(g_chat.getChannel(this)); if(pcc){ pcc->removeUser(player, true); } bool hasNoLeader = false; if(getLeader() == player){ if(!memberList.empty()){ if(memberList.size() == 1 && inviteList.empty()){ //just one member left, disband instead of passing leadership hasNoLeader = true; } else{ passPartyLeadership(memberList.front()); } } else{ hasNoLeader = true; } } //since we already passed the leadership, we remove the player from the list PlayerVector::iterator it = std::find(memberList.begin(), memberList.end(), player); if(it != memberList.end()){ memberList.erase(it); } it = std::find(inviteList.begin(), inviteList.end(), player); if(it != inviteList.end()){ inviteList.erase(it); } player->setParty(NULL); player->sendTextMessage(MSG_INFO_DESCR, "You have left the party."); player->sendPlayerPartyIcons(player); updateSharedExperience(); updatePartyIcons(player); clearPlayerPoints(player); std::stringstream ss; ss << player->getName() << " has left the party."; broadcastPartyMessage(MSG_INFO_DESCR, ss.str()); if(hasNoLeader || disbandParty()){ disband(); } return true; }