예제 #1
0
//----------------------------------------------------------------------------
void cbClientGroupAbandonMission( NLNET::CMessage& msgin, const std::string &serviceName, NLNET::TServiceId serviceId )
{
    CEntityId userId;
    uint8 index;
    msgin.serial(userId,index);

    if (!checkPlayer(userId, "cbClientGroupAbandonMission")) return;
    CCharacter * user = PlayerManager.getChar( userId );

    user->setAfkState(false);
    CTeam * team = TeamManager.getRealTeam( user->getTeamId() );
    if ( !team )
    {
        MISLOG("user:%s cbClientGroupAbandonMission : Invalid team", userId.toString().c_str());
        return;
    }
    if ( team->getLeader() != userId )
    {
        CCharacter::sendDynamicSystemMessage( user->getEntityRowId(), "REQ_LEADER_TO_ABANDON_MISSION" );
        return;
    }

    if ( index >=  team->getMissions().size() )
    {
        MISLOG("user:%s cbClientGroupAbandonMission : Invalid group mission %u ( count %u )",
               userId.toString().c_str(), index, team->getMissions().size());
        return;
    }


    CMissionTeam* mission = team->getMissions()[index];
    nlassert(mission);

    if ( mission->getFinished() == false )
    {
        CMissionTemplate * templ = CMissionManager::getInstance()->getTemplate( mission->getTemplateId() );
        if ( !templ )
        {
            MISLOG("user:%s cbClientGroupAbandonMission : invalid group mission alias %u",
                   userId.toString().c_str(), mission->getTemplateId());
            return;
        }
        if ( templ->Tags.NonAbandonnable )
        {
            MISLOG("user:%s cbClientGroupAbandonMission : group mission alias %u is not abandonnable but user tries to abandon it",
                   userId.toString().c_str(), mission->getTemplateId());
            return;
        }
        set<CEntityId> excluded;
        excluded.insert( userId );

        team->sendDynamicMessageToMembers( "ABANDON_GROUP_MISSION",TVectorParamCheck(), excluded );
    }
    team->removeMission( index, mr_abandon );
}
예제 #2
0
bool CTeam::processTeamMissionStepEvent(std::list< CMissionEvent* > & eventList, TAIAlias missionAlias, uint32 stepIndex )
{
	CMissionTeam * mission = getMissionByAlias( missionAlias );
	if (!mission )
	{
		nlwarning("invalid missionAlias");
		return false;
	}
	CMissionEvent::TResult result = mission->processEvent( TheDataset.getDataSetRow( _LeaderId) ,eventList,stepIndex );
	if ( result == CMissionEvent::Nothing )
		return false;
	else if ( result == CMissionEvent::MissionFailed )
		return true;
	
	CMissionTemplate * templ = CMissionManager::getInstance()->getTemplate( mission->getTemplateId() );
	nlassert( templ );
	if ( result == CMissionEvent::MissionEnds )
	{
		CMissionEventMissionDone * event = new CMissionEventMissionDone(templ->Alias);
		eventList.push_back(event);
		for (std::list<CEntityId>::const_iterator it = _TeamMembers.begin() ; it != _TeamMembers.end() ; ++it)
		{
			CCharacter* user = PlayerManager.getOnlineChar( *it );
			if (user != NULL)
			{
				user->addSuccessfulMissions( *templ );
				if ( templ->Tags.NoList == false )
					CCharacter::sendDynamicSystemMessage( user->getEntityRowId(),"EGS_MISSION_SUCCESS");
			}
		}

		CMissionManager::getInstance()->missionDoneOnce(templ);
		mission->stopChildren();
		
		// only remove no list missions, other must be manually removed by user
		if ( templ->Tags.NoList || mission->isChained() || templ->Tags.AutoRemove )
		{
			mission->updateEncyclopedia();
			removeMission(mission, mr_success);
		}
		else
		{
			mission->setSuccessFlag();
			mission->updateUsersJournalEntry();
		}
		return true;
	}
	else if ( result == CMissionEvent::StepEnds )
	{
		if ( templ->Tags.NoList == false )
		{
			for (std::list<CEntityId>::const_iterator it = _TeamMembers.begin() ; it != _TeamMembers.end() ; ++it)
			{
				CCharacter::sendDynamicSystemMessage( *it,"EGS_MISSION_STEP_SUCCESS");
			}
		}
	}
	mission->updateUsersJournalEntry();
	return true;
}// CTeam::processTeamMissionStepEvent
예제 #3
0
//----------------------------------------------------------------------------
void cbClientMissionGroupWake( NLNET::CMessage& msgin, const std::string & serviceName, NLNET::TServiceId serviceId )
{
    CEntityId userId;
    msgin.serial(userId);

    uint8 missionGroupIndex;
    msgin.serial(missionGroupIndex);

    CCharacter * user = PlayerManager.getChar(userId);
    if ( !user || !user->getEnterFlag() )
        return;

    user->setAfkState(false);

    CTeam * team = TeamManager.getRealTeam( user->getTeamId() );
    if ( !team )
    {
        MISLOG("user:%s cbClientMissionGroupWake : Invalid team", userId.toString().c_str());
        return;
    }
    if ( team->getLeader() != userId )
    {
        return;
    }

    if ( missionGroupIndex >=  team->getMissions().size() )
    {
        MISLOG("user:%s cbClientMissionGroupWake : Invalid group mission %u ( count %u )",
               userId.toString().c_str(), missionGroupIndex, team->getMissions().size());
        return;
    }


    CMissionTeam* mission = team->getMissions()[missionGroupIndex];
    nlassert(mission);

    if ( mission->getFinished() == false )
    {
        CMissionTemplate * templ = CMissionManager::getInstance()->getTemplate( mission->getTemplateId() );
        if ( !templ )
        {
            MISLOG("user:%s cbClientGroupAbandonMission : invalid group mission alias %u",
                   userId.toString().c_str(), mission->getTemplateId());
            return;
        }

        CMissionQueueManager::getInstance()->playerWakesUp (userId, templ->Alias );
    }
}