Exemple #1
0
bool Party::setSharedExperience(Player* player, bool _sharedExpActive)
{
	if (!player || getLeader() != player)
	{
		return false;
	}

	if (sharedExpActive == _sharedExpActive)
	{
		return true;
	}

	sharedExpActive = _sharedExpActive;

	if (sharedExpActive)
	{
		sharedExpEnabled = canEnableSharedExperience();

		if (sharedExpEnabled)
		{
			getLeader()->sendTextMessage(MSG_INFO_DESCR, "Shared Experience is now active.");
		}
		else
		{
			getLeader()->sendTextMessage(MSG_INFO_DESCR, "Shared Experience has been activated," \
			                             " but some members of your party are inactive.");
		}
	}
	else
	{
		getLeader()->sendTextMessage(MSG_INFO_DESCR, "Shared Experience has been deactivated.");
	}

	updateAllPartyIcons();
	return true;
}
Exemple #2
0
void Party::broadcastMessage(MessageClasses messageClass, const std::string& text, bool sendToInvitations/* = false*/)
{
    PlayerVector::iterator it;
    if(!memberList.empty())
    {
        for(it = memberList.begin(); it != memberList.end(); ++it)
            (*it)->sendTextMessage(messageClass, text);
    }

    getLeader()->sendTextMessage(messageClass, text);
    if(sendToInvitations && !inviteList.empty())
    {
        for(it = inviteList.begin(); it != inviteList.end(); ++it)
            (*it)->sendTextMessage(messageClass, text);
    }
}
Exemple #3
0
bool Party::canEnableSharedExperience()
{
	if (!canUseSharedExperience(getLeader()))
	{
		return false;
	}

	for (PlayerVector::iterator it = memberList.begin(); it != memberList.end(); ++it)
	{
		if (!canUseSharedExperience(*it))
		{
			return false;
		}
	}

	return true;
}
Exemple #4
0
void Party::shareExperience(const uint64_t& experience, bool fromMonster)
{
	double member_factor = g_config.getNumber(ConfigManager::PARTY_MEMBER_EXP_BONUS);
	double xpgained = (experience + (experience * (member_factor / 100.))) / (memberList.size() + 1);

	if (xpgained < 0)
	{
		return;
	}

	uint64_t shareExp = (uint64_t)std::ceil(xpgained);

	for (PlayerVector::iterator it = memberList.begin(); it != memberList.end(); ++it)
	{
		(*it)->onGainSharedExperience(shareExp, fromMonster);
	}

	getLeader()->onGainSharedExperience(shareExp, fromMonster);
}
void GroupObjectImplementation::removeGroupModifiers(CreatureObject* player) {
	if (player == NULL)
		return;

	Reference<CreatureObject*> leader = getLeader();

	if (leader == NULL)
		return;

	if (!leader->isPlayerCreature())
		return;

	Locker clocker(player, _this.getReferenceUnsafeStaticCast());
	String action = "squadleader";

	if (player->hasBuff(action.hashCode()))
		player->removeBuff(action.hashCode());

	player->updateTerrainNegotiation();
}
Exemple #6
0
bool TeamManager::canPutSkill()
{
	SceneUser *leader = SceneUserManager::getMe().getUserByTempID(getLeader());
	if (leader)
	{
		CheckAllInOneScreenExec exec(leader);
		execEveryOne(exec);
		if (!exec.isOk)
		{
			if (!giveupstatus)
			{
				giveupstatus = true;
				giveuptime.now();
				giveuptime.addDelay(120000);
				return true;
			}
			else
			{
				if (SceneTimeTick::currentTime.msecs() > giveuptime.msecs())
				{
					giveupstatus = false;///将状态初始化回去。
					return false;
				}
				else
					return true;
			}
		}
		else
		{
			giveupstatus = false;
			return true;
		}
	}

	return false;
}
Exemple #7
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;
    }
}
Exemple #8
0
/**
 * Create a VG grpah from a pinch thread set.
 */
vg::VG pinchToVG(stPinchThreadSet* threadSet, std::map<int64_t, std::string>& threadSequences) {
    // Make an empty graph
    vg::VG graph;
    
    // Remember what nodes have been created for what segments. Only the first
    // segment in a block (the "leader") gets a node. Segments without blocks
    // are also themselves leaders and get nodes.
    std::map<stPinchSegment*, vg::Node*> nodeForLeader;
    
    std::cerr << "Making pinch graph into vg graph with " << threadSequences.size() << " relevant threads" << std::endl;
    
    // This is the cleverest way to loop over Benedict's iterators.
    auto segmentIterator = stPinchThreadSet_getSegmentIt(threadSet);
    while(auto segment = stPinchThreadSetSegmentIt_getNext(&segmentIterator)) {
        // For every segment, we need to make a VG node for it or its block (if
        // it has one).
        
#ifdef debug
        std::cerr << "Found segment " << segment << std::endl;
#endif
        
        // See if the segment is in a block
        auto block = stPinchSegment_getBlock(segment);
        
        // Get the leader segment: first in the block, or this segment if no block
        auto leader = getLeader(segment);
        
        if(nodeForLeader.count(leader)) {
            // A node has already been made for this block.
            continue;
        }
        
        // Otherwise, we need the sequence
        std::string sequence;
        
        if(block) {
            // Get the sequence by scanning through the block for the first sequence
            // that isn't all Ns, if any.
            auto segmentIterator = stPinchBlock_getSegmentIterator(block);
            while(auto sequenceSegment = stPinchBlockIt_getNext(&segmentIterator)) {
                if(!threadSequences.count(stPinchSegment_getName(sequenceSegment))) {
                    // This segment is part of a staple. Pass it up
                    continue;
                }
                
                // Go get the sequence of the thread, and clip out the part relevant to this segment.
                sequence = threadSequences.at(stPinchSegment_getName(sequenceSegment)).substr(
                    stPinchSegment_getStart(sequenceSegment), stPinchSegment_getLength(sequenceSegment));
                    
                // If necessary, flip the segment around
                if(getOrientation(sequenceSegment)) {
                    sequence = vg::reverse_complement(sequence);
                }
                
                if(std::count(sequence.begin(), sequence.end(), 'N') +
                    std::count(sequence.begin(), sequence.end(), 'n') < sequence.size()) {\
                    
                    // The sequence has some non-N characters
                    // If it's not all Ns, break
                    break;
                }
                
                // Otherwise try the next segment
            }
        } else {
            // Just pull the sequence from the lone segment
            sequence = threadSequences.at(stPinchSegment_getName(segment)).substr(
                stPinchSegment_getStart(segment), stPinchSegment_getLength(segment));
                
            // It doesn't need to flip, since it can't be backwards in a block
        }
        
            
        // Make a node in the graph to represent the block
        vg::Node* node = graph.create_node(sequence);
        
        // Remember it
        nodeForLeader[leader] = node;
#ifdef debug
        std::cerr << "Made node: " << pb2json(*node) << std::endl;
#endif
            
    }
    
    // Now go through the segments again and wire them up.
    segmentIterator = stPinchThreadSet_getSegmentIt(threadSet);
    while(auto segment = stPinchThreadSetSegmentIt_getNext(&segmentIterator)) {
        // See if the segment is in a block
        auto block = stPinchSegment_getBlock(segment);
        
        // Get the leader segment: first in the block, or this segment if no block
        auto leader = getLeader(segment);
        
        // We know we have a node already
        auto node = nodeForLeader.at(leader);
        
        // What orientation is this node in for the purposes of this edge
        // TODO: ought to always be false if the segment isn't in a block. Is this true?
        auto orientation = getOrientation(segment);
#ifdef debug
        std::cerr << "Revisited segment: " << segment << " for node " << node->id() <<
            " in orientation " << (orientation ? "reverse" : "forward") << std::endl;
#endif
        
        // Look at the segment 5' of here. We know it's not a staple and
        // thus has a vg node.
        auto prevSegment = stPinchSegment_get5Prime(segment);
        
        if(prevSegment) {
            // Get the node IDs and orientations
            auto prevNode = nodeForLeader.at(getLeader(prevSegment));
            auto prevOrientation = getOrientation(prevSegment);
#ifdef debug
            std::cerr << "Found prev node " << prevNode->id() << " in orientation " << 
                (prevOrientation ? "reverse" : "forward") << std::endl;
#endif
            
            // Make an edge
            vg::Edge prevEdge;
            prevEdge.set_from(prevNode->id());
            prevEdge.set_from_start(prevOrientation);
            prevEdge.set_to(node->id());
            prevEdge.set_to_end(orientation);
            
            // Add it in. vg::VG deduplicates for us
            graph.add_edge(prevEdge);
#ifdef debug
            std::cerr << "Made edge: " << pb2json(prevEdge) << std::endl;
#endif
        }
        
        // Now do the same thing for the 3' side
        auto nextSegment = stPinchSegment_get3Prime(segment);
        
        if(nextSegment) {
            // Get the node IDs and orientations
            auto nextNode = nodeForLeader.at(getLeader(nextSegment));
            auto nextOrientation = getOrientation(nextSegment);
#ifdef debug
            std::cerr << "Found next node " << nextNode->id() << " in orientation " << 
                (nextOrientation ? "reverse" : "forward") << std::endl;
#endif
            
            // Make an edge
            vg::Edge nextEdge;
            nextEdge.set_from(node->id());
            nextEdge.set_from_start(orientation);
            nextEdge.set_to(nextNode->id());
            nextEdge.set_to_end(nextOrientation);
            
            // Add it in. vg::VG deduplicates for us
            graph.add_edge(nextEdge);
#ifdef debug
            std::cerr << "Made edge: " << pb2json(nextEdge) << std::endl;
#endif
        }
    }
    
    // Spit out the graph.
    return graph;

}
Exemple #9
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;
}