bool Party::removeInvite(Player* player) { if (!player || player->isRemoved() || !isPlayerInvited(player)) { return false; } PlayerVector::iterator it = std::find(inviteList.begin(), inviteList.end(), player); if (it != inviteList.end()) { inviteList.erase(it); } player->removePartyInvitation(this); getLeader()->sendPlayerPartyIcons(player); player->sendPlayerPartyIcons(getLeader()); if (disbandParty()) { disband(); } return true; }
bool Party::leaveParty(Player* player) { if (!player) { return false; } if (player->getParty() != this && leader != 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); for (Player* member : memberList) { member->sendCreatureSkull(player); player->sendPlayerPartyIcons(member); } leader->sendCreatureSkull(player); player->sendCreatureSkull(player); player->sendPlayerPartyIcons(leader); player->sendTextMessage(MSG_INFO_DESCR, "You have left the party."); updateSharedExperience(); clearPlayerPoints(player); std::ostringstream ss; ss << player->getName() << " has left the party."; broadcastPartyMessage(MSG_INFO_DESCR, ss.str()); if (missingLeader || disbandParty()) { disband(); } return true; }
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 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; }