bool Party::passPartyLeadership(Player* player) { if(!player || getLeader() == player || !isPlayerMember(player)){ return false; } //Remove it before to broadcast the message correctly PlayerVector::iterator it = std::find(memberList.begin(), memberList.end(), player); if(it != memberList.end()){ memberList.erase(it); } std::stringstream ss; ss << player->getName() << " is now the leader of the party."; broadcastPartyMessage(MSG_INFO_DESCR, ss.str(), true); Player* oldLeader = getLeader(); setLeader(player); memberList.insert(memberList.begin(), oldLeader); updateSharedExperience(); updatePartyIcons(oldLeader); updatePartyIcons(getLeader()); updatePartyIcons(player); player->sendTextMessage(MSG_INFO_DESCR, "You are now the leader of the party."); return true; }
bool Party::joinParty(Player* player) { if(!player || player->isRemoved()){ return false; } std::stringstream ss; ss << player->getName() << " has joined the party."; broadcastPartyMessage(MSG_INFO_DESCR, ss.str()); memberList.push_back(player); player->setParty(this); PlayerVector::iterator it = std::find(inviteList.begin(), inviteList.end(), player); if(it != inviteList.end()){ inviteList.erase(it); } player->removePartyInvitation(this); updateSharedExperience(); updatePartyIcons(player); ss.str(""); ss << "You have joined " << getLeader()->getName() << "'s party. Open the party channel to communicate with your companions."; player->sendTextMessage(MSG_INFO_DESCR, ss.str()); 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); 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(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 || empty()) { disband(); } return true; }
bool Party::joinParty(Player& player) { if (!g_events->eventPartyOnJoin(this, &player)) { return false; } auto it = std::find(inviteList.begin(), inviteList.end(), &player); if (it == inviteList.end()) { return false; } inviteList.erase(it); std::ostringstream ss; ss << player.getName() << " has joined the party."; broadcastPartyMessage(MESSAGE_INFO_DESCR, ss.str()); player.setParty(this); g_game.updatePlayerShield(&player); for (Player* member : memberList) { member->sendCreatureSkull(&player); player.sendPlayerPartyIcons(member); } player.sendCreatureSkull(&player); leader->sendCreatureSkull(&player); player.sendPlayerPartyIcons(leader); memberList.push_back(&player); g_game.updatePlayerHelpers(player); player.removePartyInvitation(this); updateSharedExperience(); updateVocationsList(); const std::string& leaderName = leader->getName(); ss.str(std::string()); ss << "You have joined " << leaderName << "'" << (leaderName.back() == 's' ? "" : "s") << " party. Open the party channel to communicate with your companions."; player.sendTextMessage(MESSAGE_INFO_DESCR, ss.str()); return true; }
bool Party::passPartyLeadership(Player* player) { if (!player || leader == player || player->getParty() != this) { return false; } //Remove it before to broadcast the message correctly auto it = std::find(memberList.begin(), memberList.end(), player); if (it != memberList.end()) { memberList.erase(it); } std::ostringstream ss; ss << player->getName() << " is now the leader of the party."; broadcastPartyMessage(MESSAGE_INFO_DESCR, ss.str(), true); Player* oldLeader = leader; leader = player; memberList.insert(memberList.begin(), oldLeader); updateSharedExperience(); for (Player* member : memberList) { member->sendCreatureShield(oldLeader); member->sendCreatureShield(leader); } for (Player* invitee : inviteList) { invitee->sendCreatureShield(oldLeader); invitee->sendCreatureShield(leader); } leader->sendCreatureShield(oldLeader); leader->sendCreatureShield(leader); player->sendTextMessage(MESSAGE_INFO_DESCR, "You are now the leader of the party."); 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; }