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 ); } }
void ZSurvival::OnGameUpdate(float fElapsed) { if (!ZGetGameTypeManager()->IsQuestDerived(ZGetGameClient()->GetMatchStageSetting()->GetGameType())) return; UpdateNavMeshWeight(fElapsed); }
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"); } }
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; }
void ZSurvival::OnGameDestroy() { if (!ZGetGameTypeManager()->IsQuestDerived(ZGetGameClient()->GetMatchStageSetting()->GetGameType())) return; Destroy(); ZGetEffectManager()->EnableDraw(true); ZGetGame()->m_WeaponManager.EnableRender(true); ZGetWorldItemManager()->EnableDraw(true); }
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; }
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(); }