void OnQuestNPCList( void* pBlobNPCList, CCMATCH_GAMETYPE eGameType )
{
	ZBaseQuest* pBaseQuest = NULL;
	if (ZGetGameTypeManager()->IsQuestOnly(eGameType))
		pBaseQuest = ZGetQuestExactly();
	else if (ZGetGameTypeManager()->IsSurvivalOnly(eGameType))
		pBaseQuest = ZGetSurvivalExactly();
	else
	{
		ASSERT(0);
		return;
	}

	const int					nNPCCount		= CCGetBlobArrayCount( pBlobNPCList );
	CCTD_NPCINFO*				pQuestNPCInfo	= NULL;
	ZNPCInfoFromServerManager&	NPCMgr			= pBaseQuest->GetNPCInfoFromServerMgr();

	NPCMgr.Clear();

	for( int i = 0; i < nNPCCount; ++i )
	{
		pQuestNPCInfo = reinterpret_cast< CCTD_NPCINFO* >( CCGetBlobArrayElement(pBlobNPCList, i) );
		if( NULL == pQuestNPCInfo )
		{
			_ASSERT( 0 );
			NPCMgr.Clear();
			return;
		}
		
		NPCMgr.CreateNPCInfo( pQuestNPCInfo );
	}
}
Ejemplo n.º 2
0
void ZSurvival::OnGameUpdate(float fElapsed)
{
	if (!ZGetGameTypeManager()->IsQuestDerived(ZGetGameClient()->GetMatchStageSetting()->GetGameType())) return;

	UpdateNavMeshWeight(fElapsed);

}
Ejemplo n.º 3
0
void ZSurvival::OnGameCreate()
{
	if (!ZGetGameTypeManager()->IsQuestDerived(ZGetGameClient()->GetMatchStageSetting()->GetGameType())) return;


	// 여기서 npc.xml 등 퀘스트에 필요한 파일을 읽는다. 만약 이미 이전에 읽었었다면 읽지 않는다.
	// 때문에 ZSurvival::OnDestroyOnce()는 명시적으로 호출하지 않음.
	OnCreateOnce();
	Create();

	// 라운드별 보상 XP BP 카운터를 초기화
	m_nRewardBP = 0;
	m_nRewardXP = 0;

	m_nReachedRound = 0;
	m_nPoint = 0;

	// 서바이벌맵 해킹 감지
	if (m_MapCatalogue.IsHacked())
	{
		ZGetGameInterface()->ShowDisconnectMsg( MERR_FIND_HACKER, 30000 );
		mlog(ZMsg(MSG_HACKING_DETECTED));
		mlog("\nhacked XML.\n");
	}
}
Ejemplo n.º 4
0
bool ZObserver::IsVisibleSetTarget(ZCharacter* pCharacter)
{
	if(pCharacter->IsDie()) return false;
	if (pCharacter->IsAdminHide()) return false;
	if (pCharacter->GetTeamID() == MMT_SPECTATOR) return false;

	if(g_pGame->IsReplay()) return true;

	if(ZGetGameClient()->GetMatchStageSetting()->GetGameType() == MMATCH_GAMETYPE_DUEL)
	{
		ZRuleDuel* pDuel = (ZRuleDuel*)ZGetGameInterface()->GetGame()->GetMatch()->GetRule();
		if (pDuel->GetQueueIdx(pCharacter->GetUID()) <= 1)
			return true;
		else
			return false;
	}

	if (ZGetGameTypeManager()->IsQuestDerived(ZGetGameClient()->GetMatchStageSetting()->GetGameType())) {
		if(!pCharacter->IsVisible()) return false;
	}

	if(m_nType==ZOM_ANYONE) return true;

	if(m_nType==ZOM_RED && pCharacter->GetTeamID()==MMT_RED)
		return true;

	if(m_nType==ZOM_BLUE && pCharacter->GetTeamID()==MMT_BLUE)
		return true;

	return false;

}
Ejemplo n.º 5
0
void ZSurvival::OnGameDestroy()
{
	if (!ZGetGameTypeManager()->IsQuestDerived(ZGetGameClient()->GetMatchStageSetting()->GetGameType())) return;

	Destroy();
	
	ZGetEffectManager()->EnableDraw(true);
	ZGetGame()->m_WeaponManager.EnableRender(true);
	ZGetWorldItemManager()->EnableDraw(true);
}
Ejemplo n.º 6
0
bool ZModule_HPAP::CheckQuestCheet()
{
#ifdef _PUBLISH
	return false;
#endif

	if (IsMyCharacter((ZObject*)m_pContainer))
	{
		if ((ZIsLaunchDevelop()) && (ZGetGameClient()->GetServerMode() == MSM_TEST))
		{
			if (ZGetGameTypeManager()->IsQuestDerived(ZGetGameClient()->GetMatchStageSetting()->GetGameType()))
			{
				if (ZGetQuest()->GetCheet(ZQUEST_CHEET_GOD) == true) return true;
			}
		}
	}

	return false;
}
Ejemplo n.º 7
0
void ZBrain::ProcessBuildPath( float fDelta)
{
	// Update timer
	if ( !m_PathFindingTimer.Update( fDelta))
		return;
	
	// Check status
	ZTASK_ID nTaskID = m_pBody->m_TaskManager.GetCurrTaskID();
	if ( (nTaskID == ZTID_ATTACK_MELEE) || (nTaskID == ZTID_ATTACK_RANGE) || (nTaskID == ZTID_ROTATE_TO_DIR) || (nTaskID == ZTID_SKILL))
		return;

	// 맵에 끼었다면 벗어난다
	// 워프해서 끼임을 탈출하는 건 서바이벌일때만으로 제한한다 (워프는 눈에 크게 띄고 조악한 해결법이다. 기존 퀘스트에서 없던 몹워프가 일어나 유저 불만이 있음)
	if (ZGetGameTypeManager()->IsSurvivalOnly( ZGetGame()->GetMatch()->GetMatchType()))
	{
		if (EscapeFromStuckIn(m_WayPointList))
			return;
	}

	// Get target
	ZObject* pTarget = GetTarget();
	if ( !pTarget)
	{
		m_pBody->m_TaskManager.Clear();
		m_pBody->Stop();

		return;
	}


	// 원거리 공격이거나 우호적이면 넘 가까이 다가가지 않고 바라만 본다.
	if ( ( m_Behavior.GetOffenseType() == ZOFFENSETYPE_RANGE) || m_Behavior.IsFriendly())
	{
		// 거리를 구한다.
		float dist = MagnitudeSq( pTarget->GetPosition() - m_pBody->GetPosition());

		bool bStop = false;

		// Friendly type
		if ( m_Behavior.IsFriendly())
		{
			if ( dist < m_fDistForcedIn)
				bStop = true;
		}
		// Else type
		else
		{
			// 직선 거리를 본다.
			if ( ( dist > DIST_FORCEDIN) && (dist < m_fDistIn))
			{
				// 직선 거리는 가까운데 높이가 많이 차이가 나는지 본다.
				dist = pTarget->GetPosition().z - m_pBody->GetPosition().z;

				// 높이가 넘 많이 차이 안나면 정지
				if ( (dist > -DIST_HEIGHT) && (dist < DIST_HEIGHT))
					bStop = true;
			}
		}

		// Stop
		if ( bStop)
		{
			// 볼 수 있는 위치여야지 정지가 가능하다. 만약 안보인다면 뛰어가서 근접공격을 하도록 한다
			if ( m_pBody->CanSee( pTarget) && m_pBody->CanAttackRange( pTarget))
			{
				m_pBody->Stop();
				m_pBody->m_TaskManager.Clear();

				return;
			}
		}
	}


	// Make path
	RNavigationMesh* pNavMesh = ZGetGame()->GetWorld()->GetBsp()->GetNavigationMesh();
	if ( pNavMesh == NULL)
		return;

	// Make navigation path
	rvector tarpos = pTarget->GetPosition();
	if ( !pNavMesh->BuildNavigationPath( m_pBody->GetPosition(), tarpos))
		return;

	m_WayPointList.clear();
	for ( list<rvector>::iterator itor = pNavMesh->GetWaypointList().begin();  itor != pNavMesh->GetWaypointList().end();  ++itor)
		m_WayPointList.push_back( (*itor));


	AdjustWayPointWithBound(m_WayPointList, pNavMesh);

	PushWayPointsToTask();
}