Ejemplo n.º 1
0
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 );
				}
			}
		}
	}
}
Ejemplo n.º 2
0
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
}
Ejemplo n.º 3
0
// 입장하기 위해 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 );
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
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 );
		}
	}
}
Ejemplo n.º 6
0
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] ) );
		}
	}
}
Ejemplo n.º 7
0
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 );
}
Ejemplo n.º 8
0
// 대기실로 텔레포트(입장시, 대전종료시)
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 );
	}
}
Ejemplo n.º 9
0
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 );
}
Ejemplo n.º 10
0
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
}
Ejemplo n.º 11
0
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;
	}*/
}
Ejemplo n.º 12
0
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;
	}
}