Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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;
    }
}
Exemplo n.º 5
0
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;
}