void CParty::ReplaceLodestar( const CRect &rect ) { // locked CUser* pUser; for( int i = 0; i < m_nSizeofMember; i ++ ) // 극단원 모두에게 듀얼 해제를 세팅하고 클라에도 알림. { pUser = g_UserMng.GetUserByPlayerID( m_aMember[i].m_uPlayerId ); if( IsValidObj( pUser ) ) { CWorld* pWorld = pUser->GetWorld(); if( pWorld ) { POINT point = { (int)pUser->GetPos().x, (int)pUser->GetPos().z }; if( rect.PtInRect( point ) ) { PRegionElem pRgnElem = NULL; if( pWorld->GetID() != pWorld->m_dwIdWorldRevival && pWorld->m_dwIdWorldRevival != 0 ) pRgnElem = g_WorldMng.GetRevivalPos( pWorld->m_dwIdWorldRevival, pWorld->m_szKeyRevival ); if( !pRgnElem ) // Find near revival pos pRgnElem = g_WorldMng.GetNearRevivalPos( pWorld->GetID(), pUser->GetPos() ); if( pRgnElem ) pUser->REPLACE( g_uIdofMulti, pRgnElem->m_dwWorldId, pRgnElem->m_vPos, REPLACE_NORMAL, nRevivalLayer ); } } } } }
void CPartyQuestProcessor::RemoveAllDynamicObj( DWORD dwWorldID, D3DXVECTOR3 vPos, int nRange ) { CWorld* pWorld = g_WorldMng.GetWorld( dwWorldID ); if( !pWorld ) return; CObj* pObj; D3DXVECTOR3 vDist; FOR_LINKMAP( pWorld, vPos, pObj, nRange, CObj::linkDynamic, nTempLayer ) { if( pObj ) { if( pObj->GetType() == OT_MOVER && ((CMover *)pObj)->IsPeaceful() == FALSE ) { pObj->Delete(); } } } END_LINKMAP D3DXVECTOR3 vPos2 = D3DXVECTOR3( 6968.0f, 0, 3328.8f ); FOR_LINKMAP( pWorld, vPos, pObj, nRange, CObj::linkPlayer, nTempLayer ) { if( pObj ) { CUser* pUser = (CUser*)pObj; pUser->AddQuestTextTime( 0, 0, 0xffffffff ); ( (CUser*)pObj )->REPLACE( g_uIdofMulti, WI_WORLD_MADRIGAL, vPos2, REPLACE_NORMAL, nDefaultLayer ); } } END_LINKMAP }
// 입장하기 위해 NPC에게 텔레포트 void CGuildCombat1to1Mng::SetTeleportToNPC( CUser* pUser ) { if( m_nState != GC1TO1_ENTRANCE ) { pUser->AddDefinedText( TID_GAME_GUILDCOMBAT1TO1_NOENTRANCETIME ); return; } PRegionElem pRgnElem = g_WorldMng.GetRevivalPos( WI_WORLD_MADRIGAL, "flaris" ); if( pRgnElem ) pUser->REPLACE( g_uIdofMulti, WI_WORLD_MADRIGAL, D3DXVECTOR3( 6983.0f, 0.0f, 3326.0f ), REPLACE_NORMAL, nDefaultLayer ); }
CWorld* __GetWorld( int nPcId, int nSrcId, int nCaller ) { CWorld* pWorld = NULL; if( nCaller == WES_DIALOG ) { CUser* pUser = prj.GetUser( nPcId ); pWorld = pUser->GetWorld(); } else if( nCaller == WES_WORLD ) pWorld = g_WorldMng.GetWorld( nSrcId ); return pWorld; }
void CParty::Replace( DWORD dwWorldId, LPCTSTR sKey ) { CUser *pMember; for( int i = 0; i < m_nSizeofMember; i ++ ) // 극단원 모두에게 듀얼 해제를 세팅하고 클라에도 알림. { pMember = g_UserMng.GetUserByPlayerID( m_aMember[i].m_uPlayerId ); if( IsValidObj( pMember ) ) { PRegionElem pRgnElem = g_WorldMng.GetRevivalPos( dwWorldId, sKey ); if( NULL != pRgnElem ) pMember->REPLACE( g_uIdofMulti, pRgnElem->m_dwWorldId, pRgnElem->m_vPos, REPLACE_NORMAL, nRevivalLayer ); } } }
void CQuiz::CloseQuizEvent() { SetRun( FALSE ); SetNextTime( 0 ); SetState( QE_CLOSE ); m_bSelectLog = FALSE; m_nQuizCount = 0; Clear(); RemoveNPC(); g_dpDBClient.SendQuizEventState( QE_CLOSE, g_uIdofMulti, 0, m_nQuizCount ); CWorld* pWorld = g_WorldMng.GetWorld( WI_WORLD_QUIZ ); if( pWorld ) { for( DWORD i = 0; i < pWorld->m_dwObjNum; ++i ) { if( IsInQuizEventPlayer( pWorld, nDefaultLayer, i ) ) GoOut( static_cast<CUser*>( pWorld->m_apObject[i] ) ); } } }
void CQuiz::SetNPC() { CMover* pMover = (CMover*)CreateObj( D3DDEVICE, OT_MOVER, m_sNPC.dwNPCId ); if( !pMover ) { Error( "CQuiz::SetNPC() - pMover is NULL - %d, %s", m_sNPC.dwNPCId, m_sNPC.strCharKey.c_str() ); return; } lstrcpy( pMover->m_szCharacterKey, m_sNPC.strCharKey.c_str() ); pMover->InitNPCProperty(); pMover->InitCharacter( pMover->GetCharacter() ); pMover->SetPos( m_sNPC.vPos ); pMover->InitMotion( MTI_STAND ); pMover->UpdateLocalMatrix(); pMover->AddItToGlobalId(); m_sNPC.idNpc = pMover->GetId(); CWorld* pWorld = g_WorldMng.GetWorld( WI_WORLD_MADRIGAL ); if( pWorld ) pWorld->ADDOBJ( pMover, FALSE, nDefaultLayer ); }
// 대기실로 텔레포트(입장시, 대전종료시) void CGuildCombat1to1::SetTeleportToWaitStage( CUser* pUser ) { int nIndex = g_GuildCombat1to1Mng.GetTenderGuildIndexByUser( pUser ); if( !g_WorldMng.GetWorld( m_vecTenderGuild[nIndex].dwWorldId ) ) { pUser->AddText( "Not Exist World" ); return; } pUser->m_nGuildCombatState = 2; // 관전자 모드 g_UserMng.AddGuildCombatUserState( pUser ); int nRandx = xRandom(4) - 2; int nRandz = xRandom(4) - 2; if( m_vecTenderGuild[nIndex].nPosition == 0 ) { pUser->SetAngle( 0 ); pUser->REPLACE( g_uIdofMulti, m_vecTenderGuild[nIndex].dwWorldId, D3DXVECTOR3( (float)( 256+nRandx ), 90.0f, (float)( 277+nRandz ) ), REPLACE_NORMAL, nDefaultLayer ); } else { pUser->SetAngle( 180 ); pUser->REPLACE( g_uIdofMulti, m_vecTenderGuild[nIndex].dwWorldId, D3DXVECTOR3( (float)( 272+nRandx ), 90.0f, (float)( 212+nRandz ) ), REPLACE_NORMAL, nDefaultLayer ); } }
void CRunObject::Run( void ) { HANDLE hHeartbeat; if( !( hHeartbeat = CreateEvent( NULL, FALSE, FALSE, g_sHeartbeat ) ) ) hHeartbeat = OpenEvent( EVENT_MODIFY_STATE, FALSE, g_sHeartbeat ); if( NULL == hHeartbeat ) Error( "MAPI_E_NOT_ENOUGH_RESOURCES" ); DWORD dwTickHearbeat = timeGetTime() + SEC( 2 ); CTimeout timeoutObject( 67, 0 ); CTimeout timeoutReadAgent( 67, 20 ); CTimeout timeoutReadCore( 67, 40 ); CTimeout timeoutReadTrans( 67, 50 ); CTimeout timeoutReadAccount( 67, 60 ); CTimeout timeoutRespawn( 1000, 200 ); CTimeout timeout( 1000, 600 ); #ifdef __EVENT_1101 CTimeout timeoutCallTheRoll( MIN( 1 ), 70 ); #endif // __EVENT_1101 DWORD dwCur, dwOld; while( WaitForSingleObject( m_hClose, 1 ) != WAIT_OBJECT_0 ) { { _PROFILE( "CRunObject::Run()" ); g_tmCurrent = timeGetTime(); g_tCurrent = time( NULL ); dwCur = g_tmCurrent; dwOld = dwCur; if( timeoutObject.TimeoutReset( g_tmCurrent ) ) { _PROFILE( "CWorldMng::Process()" ); g_WorldMng.Process(); if( g_tmCurrent > dwTickHearbeat ) { SetEvent( hHeartbeat ); dwTickHearbeat = g_tmCurrent + SEC( 2 ); } } PROFILE_RUN( r1 ); if( timeoutReadAgent.TimeoutReset( g_tmCurrent ) ) { _PROFILE( "g_DPSrvr.ReceiveMessage()" ); g_DPSrvr.ReceiveMessage(); } PROFILE_RUN( r2 ); if( timeoutReadCore.TimeoutReset( g_tmCurrent ) ) { _PROFILE( "g_DPCoreClient.ReceiveMessage()" ); g_DPCoreClient.ReceiveMessage(); } PROFILE_RUN( r3 ); if( timeoutReadTrans.TimeoutReset( g_tmCurrent ) ) { _PROFILE( "g_dpDBClient.ReceiveMessage()" ); g_dpDBClient.ReceiveMessage(); } PROFILE_RUN( r4 ); /* #ifdef __GIFTBOX0213 if( timeoutReadAccount.TimeoutReset( g_tmCurrent ) ) CDPAccountClient::GetInstance()->ReceiveMessage(); #endif // __GIFTBOX0213 */ #ifdef __EVENTLUA_KEEPCONNECT if( timeoutReadAccount.TimeoutReset( g_tmCurrent ) ) prj.m_EventLua.KeepConnectEventProcess(); #endif // __EVENTLUA_KEEPCONNECT PROFILE_RUN( r5 ); if( timeoutRespawn.TimeoutReset( g_tmCurrent ) ) { _PROFILE( "g_WorldMng.Respawn()" ); u_long uRespawned = g_WorldMng.Respawn(); // if( uRespawned > 0 ) SetLogInfo( LOGTYPE_RESPAWN, "Respawn:%d Object:%d", uRespawned, g_WorldMng.GetObjCount() ); } PROFILE_RUN( r6 ); if( timeout.TimeoutReset( g_tmCurrent ) ) { _PROFILE( "1SEC_Process" ); g_GameTimer.Compute(); CGuildQuestProcessor::GetInstance()->Process(); CPartyQuestProcessor::GetInstance()->Process(); PROFILE_RUN( r7 ); if( g_eLocal.GetState( EVE_GUILDCOMBAT ) ) g_GuildCombatMng.Process(); #if __VER >= 11 // __GUILD_COMBAT_1TO1 if( g_eLocal.GetState( EVE_GUILDCOMBAT1TO1 ) ) g_GuildCombat1to1Mng.Process(); #endif // __GUILD_COMBAT_1TO1 #if __VER >= 12 // __SECRET_ROOM if( g_eLocal.GetState( EVE_SECRETROOM ) ) { _PROFILE( "CSecretRoomMng::Process()" ); CSecretRoomMng::GetInstance()->Process(); } #endif // __SECRET_ROOM #if __VER >= 13 // __RAINBOW_RACE if( g_eLocal.GetState( EVE_RAINBOWRACE ) ) { _PROFILE( "CRainbowRaceMng::Process()" ); CRainbowRaceMng::GetInstance()->Process(); } #endif // __RAINBOW_RACE #if __VER >= 14 // __PCBANG { _PROFILE( "CPCBang::ProcessPCBang()" ); CPCBang::GetInstance()->ProcessPCBang(); } #endif // __PCBANG #if __VER >= 14 // __INSTANCE_DUNGEON { CInstanceDungeonParty::GetInstance()->Process(); } #endif // __INSTANCE_DUNGEON #ifdef __QUIZ { if( CQuiz::GetInstance()->IsAutoMode() && CQuiz::GetInstance()->IsRun() ) CQuiz::GetInstance()->Process(); } #endif // __QUIZ PROFILE_RUN( r8 ); if( g_eLocal.GetState( ENABLE_GUILD_INVENTORY ) ) g_GuildMng.Process(); PROFILE_RUN( r9 ); if( g_eLocal.GetState( EVE_GUILDWAR ) ) g_GuildWarMng.Process(); g_PartyMng.PartyMapInfo(); PROFILE_RUN( r10 ); #if __VER >= 12 // __RANGDA_0521 // 랜덤 이벤트 몬스터 초당 1회 틱 CRangdaController::Instance()->OnTimer(); #endif // __RANGDA_0521 #ifdef __EVENTLUA_SPAWN prj.m_EventLua.EventSpawnProcess(); #endif // __EVENTLUA_SPAWN } #ifdef __EVENT_1101 if( timeoutCallTheRoll.TimeoutReset( g_tmCurrent ) ) // 1분당 { CEventGeneric::GetInstance()->CallTheRoll(); #if __VER >= 12 // __NEW_ITEMCREATEMON_SERVER CCreateMonster::GetInstance()->ProcessRemoveMonster(); #endif // __NEW_ITEMCREATEMON_SERVER } #endif // __EVENT_1101 PROFILE_RUN( r11 ); #ifdef __EVENT_0117 CEventGeneric::GetInstance()->Spawn(); #endif // __EVENT_0117 PROFILE_RUN( r12 ); } LogPerformance( timeGetTime() ); } CLOSE_HANDLE( m_hClose ); CLOSE_HANDLE( hHeartbeat ); }
void ExitInstance( void ) { CRunObject::GetInstance()->Close(); /* #ifdef __GIFTBOX0213 CDPAccountClient::GetInstance()->DeleteDPObject(); #endif // __GIFTBOX0213 */ g_DPSrvr.DeleteDPObject(); g_DPCoreClient.DeleteDPObject(); g_dpDBClient.DeleteDPObject(); g_WorldMng.Free(); #ifndef __VM_0820 #ifndef __MEM_TRACE SAFE_DELETE( CUser::m_pPool ); SAFE_DELETE( CMover::m_pPool ); SAFE_DELETE( CActionMover::m_pPool ); SAFE_DELETE( CAIMonster::m_pPool ); SAFE_DELETE( CItem::m_pPool ); #endif // __MEM_TRACE #endif // __VM_0820 g_PartyMng.Clear(); #ifndef __VM_0820 #ifndef __MEM_TRACE SAFE_DELETE( CParty::m_pPool ); #endif // __MEM_TRACE #endif // __VM_0820 g_ChattingMng.Clear(); #ifndef __VM_0820 #ifndef __MEM_TRACE SAFE_DELETE( CChatting::m_pPool ); #endif // __MEM_TRACE #endif // __VM_0820 g_GuildWarMng.Clear(); g_GuildMng.Clear(); #if __VER >= 13 // __HOUSING CHousingMng::GetInstance()->Clear(); #endif // __HOUSING #ifndef __VM_0820 #ifndef __MEM_TRACE SAFE_DELETE( CGuildMember::sm_pPool ); SAFE_DELETE( CGuild::sm_pPool ); SAFE_DELETE( CAIPet::m_pPool ); SAFE_DELETE( CAIKrrr::m_pPool ); SAFE_DELETE( CAIGuard::m_pPool ); SAFE_DELETE( CAIClockWorks::m_pPool ); SAFE_DELETE( CAIBigMuscle::m_pPool ); SAFE_DELETE( CAIBear::m_pPool ); #endif // __MEM_TRACE #endif // __VM_0820 UninitializeNetLib(); UninitializeScriptLib(); #ifndef __VM_0820 #ifndef __MEM_TRACE SAFE_DELETE( CAIPet::m_pPool ); #endif // __MEM_TRACE #endif // __VM_0820 g_Object3DMng.Destroy(); prj.m_modelMng.DeleteDeviceObjects(); #if __VER >= 12 // __LORD CSLord::Instance()->DestroyColleagues(); #endif // __LORD }
void CQuiz::DropOutWrongUser( int nQuizId, int nCorrect, int nItemId, int nItemNum ) { int nCorrectUser = 0; CWorld* pWorld = g_WorldMng.GetWorld( WI_WORLD_QUIZ ); if( pWorld ) { for( DWORD i = 0; i < pWorld->m_dwObjNum; ++i ) { if( IsInQuizEventPlayer( pWorld, nDefaultLayer, i ) ) { if( m_bSelectLog ) { int nSelect = GetUserSelectExample( static_cast<CUser*>( pWorld->m_apObject[i] ) ); if( nSelect ) g_dpDBClient.SendQuizEventSelect( static_cast<CUser*>( pWorld->m_apObject[i] )->m_idPlayer, g_uIdofMulti, nQuizId, nSelect, nCorrect ); } static_cast<CUser*>( pWorld->m_apObject[i] )->AddQuizEventMessage( prj.GetText( TID_GAME_QUIZ_DROP_OUT ), QE_DROP_OUT ); if( PtInCorrectZoneRect( static_cast<CUser*>( pWorld->m_apObject[i] ), nCorrect ) ) { ++nCorrectUser; // 091014 - mirchang : 시스템 부하 발생 가능성이 있어 보류 //if( nItemId > 0 ) // Item Id가 있을시 정답자에게 해당 아이템 지급 // g_dpDBClient.SendPostPrizeItem( static_cast<CUser*>( pWorld->m_apObject[i] )->m_idPlayer, nItemId, nItemNum ); } } } if( nCorrectUser <= LIMIT_USER_COUNT ) m_bSelectLog = TRUE; } // 정답자 수가 2명 이상이고 문제가 남아있으면 문제 풀이 단계로 이동 if( nCorrectUser > 1 && m_vecQuizList.size() > 1 ) { SetNextTime( GetTickCount() + m_dwWaitTime ); SetState( QE_QUESTION ); g_dpDBClient.SendQuizEventState( QE_QUESTION, g_uIdofMulti ); } // 우승자 상금 지급 후 진행 여부 판단 else { CString strMessage; strMessage.Format( prj.GetText( TID_GAME_QUIZ_WINNERCOUNT ), nCorrectUser ); if( pWorld ) { for( DWORD i = 0; i < pWorld->m_dwObjNum; ++i ) { if( IsInQuizEventPlayer( pWorld, nDefaultLayer, i ) ) { static_cast<CUser*>( pWorld->m_apObject[i] )->AddQuizEventMessage( strMessage, QE_CLOSE_WAIT ); // 스크립트에 정해진 아이템 지급 if( PtInCorrectZoneRect( static_cast<CUser*>( pWorld->m_apObject[i] ), nCorrect ) ) g_dpDBClient.SendPostPrizeItem( static_cast<CUser*>( pWorld->m_apObject[i] )->m_idPlayer, m_dwPrizeItemId, m_nPrizeItemNum ); } } g_dpDBClient.SendQuizEventState( QE_WINNER, g_uIdofMulti, nCorrectUser, m_nQuizCount ); } SetState( QE_CLOSE_WAIT ); } /* // 유저 이동 가능 - object pWorld->DeleteObj( m_pVObj ); m_pVObj = NULL; if( GetType() == TYPE_4C ) { pWorld->DeleteObj( m_pHObj ); m_pHObj = NULL; }*/ }
void CQuiz::Process() { DWORD dwTick = GetTickCount(); vector<QUIZLIST>::iterator it = m_vecQuizList.begin(); switch( m_nState ) { case QE_CLOSE: // 퀴즈 이벤트 종료. 모든 유저 밖으로 이동 if( dwTick > GetNextTime() ) CloseQuizEvent(); break; case QE_OPEN: { if( dwTick > GetNextTime() ) { if( !m_vecQuizList.size() ) { Error( "Quiz List Load Failed!" ); CloseQuizEvent(); return; } if( (int)( m_vecQuizList.size() ) < m_nQuizSize ) break; BOOL bAble = FALSE; int nUser = 0; CWorld* pWorld = g_WorldMng.GetWorld( WI_WORLD_QUIZ ); if( pWorld ) { for( DWORD i = 0; i < pWorld->m_dwObjNum; ++i ) { if( IsInQuizEventPlayer( pWorld, nDefaultLayer, i ) ) { static_cast<CUser*>( pWorld->m_apObject[i] )->AddQuizEventMessage( prj.GetText( TID_GAME_QUIZ_WAIT_QUESTION ) ); bAble = TRUE; ++nUser; } } } if( !bAble ) { CloseQuizEvent(); return; } if( nUser <= LIMIT_USER_COUNT ) m_bSelectLog = TRUE; SetNextTime( dwTick + m_dwWaitTime ); SetState( QE_QUESTION ); g_dpDBClient.SendQuizEventState( QE_QUESTION, g_uIdofMulti ); } } break; case QE_QUESTION: // 문제 출제 if( dwTick > GetNextTime() ) { // UI CWorld* pWorld = g_WorldMng.GetWorld( WI_WORLD_QUIZ ); if( pWorld ) { for( DWORD i = 0; i < pWorld->m_dwObjNum; ++i ) { if( IsInQuizEventPlayer( pWorld, nDefaultLayer, i ) ) { static_cast<CUser*>( pWorld->m_apObject[i] )->AddQuizEventMessage( prj.GetText( TID_GAME_QUIZ_QUESTION ), QE_QUESTION ); static_cast<CUser*>( pWorld->m_apObject[i] )->AddQuizQuestion( GetType(), it->strQuestion, m_dwQuestionTime / SEC(1) ); } } } SetNextTime( dwTick + m_dwQuestionTime ); SetState( QE_CORRECT_ANSWER ); g_dpDBClient.SendQuizEventState( QE_CORRECT_ANSWER, g_uIdofMulti ); ++m_nQuizCount; } break; case QE_CORRECT_ANSWER: // 정답 공개 if( dwTick > GetNextTime() ) { /* // 유저 이동 불가 - object DWORD dwId = NULL; if( GetType() == TYPE_OX ) dwId = 1116; else dwId = 1115; m_pVObj = CreateObj( D3DDEVICE, OT_OBJ, dwId ); if( !m_pVObj ) return; m_pVObj->SetPos( m_sQuizData.vQuizZonePos ); m_pVObj->UpdateLocalMatrix(); CWorld* pWorld = g_WorldMng.GetWorld( WI_WORLD_QUIZ ); if( pWorld ) pWorld->ADDOBJ( m_pVObj, TRUE, nDefaultLayer ); if( GetType() == TYPE_4C ) { m_pHObj = CreateObj( D3DDEVICE, OT_OBJ, dwId ); if( !m_pHObj ) return; m_pHObj->SetPos( m_sQuizData.vQuizZonePos ); m_pHObj->SetAngle( 90 ); m_pHObj->UpdateLocalMatrix(); CWorld* pWorld = g_WorldMng.GetWorld( WI_WORLD_QUIZ ); if( pWorld ) pWorld->ADDOBJ( m_pHObj, TRUE, nDefaultLayer ); }*/ // 문제 풀이 종료 메세지 CString str_Message; str_Message.Format( prj.GetText( TID_GAME_QUIZ_END_SOLVE_QUESTION ), m_nQuizCount ); // 정답 메세지 CString strMessage; if( GetType() == TYPE_OX ) { if( it->nCorrect == 1 ) strMessage.Format( prj.GetText( TID_GAME_QUIZ_CORRECT_ANSWER_OX ), 'O' ); else strMessage.Format( prj.GetText( TID_GAME_QUIZ_CORRECT_ANSWER_OX ), 'X' ); } else if( GetType() == TYPE_4C ) strMessage.Format( prj.GetText( TID_GAME_QUIZ_CORRECT_ANSWER_4C ), it->nCorrect ); D3DXVECTOR3 vPos = m_sQuizData.aExamplePos[(*it).nCorrect - 1]; g_UserMng.AddWorldCreateSfxObj( XI_QUIZCORRECTANSWER, vPos.x, vPos.y, vPos.z, FALSE, WI_WORLD_QUIZ ); CWorld* pWorld = g_WorldMng.GetWorld( WI_WORLD_QUIZ ); if( pWorld ) { for( DWORD i = 0; i < pWorld->m_dwObjNum; ++i ) { if( IsInQuizEventPlayer( pWorld, nDefaultLayer, i ) ) { static_cast<CUser*>( pWorld->m_apObject[i] )->AddQuizEventMessage( str_Message, QE_CORRECT_ANSWER ); static_cast<CUser*>( pWorld->m_apObject[i] )->AddQuizEventMessage( strMessage ); } } } SetNextTime( dwTick + m_dwWaitTime ); SetState( QE_DROP_OUT ); g_dpDBClient.SendQuizEventState( QE_DROP_OUT, g_uIdofMulti ); } break; case QE_DROP_OUT: if( dwTick > GetNextTime() ) { // 탈락자 대기존으로 이동 DropOutWrongUser( (*it).nQuizId, (*it).nCorrect ); m_vecQuizList.erase( it ); } break; case QE_CLOSE_WAIT: { // 문제가 요구치 보다 많이 남아있을 시 대기존 개방 if( m_vecQuizList.size() > REMAIN_QUIZ ) { CWorld* pWorld = g_WorldMng.GetWorld( WI_WORLD_QUIZ ); if( pWorld ) { for( DWORD i = 0; i < pWorld->m_dwObjNum; ++i ) { if( IsInQuizEventPlayer( pWorld, nDefaultLayer, i ) ) { static_cast<CUser*>( pWorld->m_apObject[i] )->AddQuizEventMessage( prj.GetText( TID_GAME_QUIZ_WATCHINGZONE_OPEN ), QE_WATCHINGZONE_OPEN ); static_cast<CUser*>( pWorld->m_apObject[i] )->AddQuizEventMessage( prj.GetText( TID_GAME_QUIZ_TELEPORT_QUIZZONE ) ); } } } SetNextTime( dwTick + m_dwWatchingZoneOpenTime ); SetState( QE_WATCHINGZONE_OPEN ); m_bSelectLog = FALSE; m_nQuizCount = 0; g_dpDBClient.SendQuizEventState( QE_WATCHINGZONE_OPEN, g_uIdofMulti ); } // 문제가 요구치 보다 적을 시 퀴즈 이벤트 종료 else { g_DPCoreClient.SendQuizSystemMessage( TID_GAME_QUIZ_CLOSING, TRUE, g_uIdofMulti ); SetNextTime( dwTick + m_dwCloseWaitTime ); SetState( QE_CLOSE ); g_dpDBClient.SendQuizEventState( QE_CLOSE_WAIT, g_uIdofMulti ); } } break; case QE_WATCHINGZONE_OPEN: // 대기존 개방 if( dwTick > GetNextTime() ) { BOOL bAble = FALSE; int nUser = 0; CWorld* pWorld = g_WorldMng.GetWorld( WI_WORLD_QUIZ ); if( pWorld ) { for( DWORD i = 0; i < pWorld->m_dwObjNum; ++i ) { if( IsInQuizEventPlayer( pWorld, nDefaultLayer, i ) ) { static_cast<CUser*>( pWorld->m_apObject[i] )->AddQuizEventMessage( prj.GetText( TID_GAME_QUIZ_WAIT_QUESTION ) ); //if( static_cast<CUser*>( pWorld->m_apObject[i] )->IsAuthHigher( AUTH_GAMEMASTER ) == FALSE ) if( GetZoneType( static_cast<CMover*>( pWorld->m_apObject[i] ) ) == ZONE_QUIZ ) { bAble = TRUE; ++nUser; } } } } if( bAble ) { SetNextTime( dwTick + m_dwWaitTime ); SetState( QE_QUESTION ); if( nUser <= LIMIT_USER_COUNT ) m_bSelectLog = TRUE; } else { CloseQuizEvent(); return; } } break; } }