void CGuildWar::Process( CTime & time ) { if( m_nFlag == WF_WARTIME ) { if( GetEndTime() < time ) { m_nFlag = WF_END; g_DPCoreClient.SendWarTimeout( m_idWar ); TRACE( "SendWarTimeout, %d\n", m_idWar ); } else { CGuild* pDecl = g_GuildMng.GetGuild( m_Decl.idGuild ); CGuild* pAcpt = g_GuildMng.GetGuild( m_Acpt.idGuild ); if( pDecl && pAcpt ) { CUser* pMaster = g_UserMng.GetUserByPlayerID( pDecl->m_idMaster ); if( IsInvalidObj( pMaster ) ) g_DPCoreClient.SendWarMasterAbsent( m_idWar, TRUE ); pMaster = g_UserMng.GetUserByPlayerID( pAcpt->m_idMaster ); if( IsInvalidObj( pMaster ) ) g_DPCoreClient.SendWarMasterAbsent( m_idWar, FALSE ); } } } }
// 입장전 대기... void CGuildCombat1to1Mng::GuildCombat1to1EntranceWait() { m_nState = GC1TO1_ENTRANCE; m_nWaitTime = (int)m_Lua.GetGlobalNumber( "EntranceWaitTime" ); m_dwTime = GetTickCount(); for( int i=0; i<(int)( m_vecTenderGuild.size() ); i++ ) { CGuild* pGuild = g_GuildMng.GetGuild( m_vecTenderGuild[i].ulGuildId ); if( pGuild ) { CUser* pUser = (CUser*)prj.GetUserByID( pGuild->m_idMaster ); if( IsValidObj( pUser ) && !IsLineUpMember( pUser ) ) SendNowState( pUser ); } for( int j=0; j<(int)( m_vecTenderGuild[i].vecMemberId.size() ); j++ ) { CUser* pUser = (CUser*)prj.GetUserByID( m_vecTenderGuild[i].vecMemberId[j] ); if( IsValidObj( pUser ) ) { pUser->AddDefinedCaption( TRUE, TID_GAME_GUILDCOMBAT1TO1_ENTRANCETIME, "" ); SendNowState( pUser ); } } } }
// 모든 대전장의 길드대전이 끝났다. void CGuildCombat1to1Mng::GuildCombat1to1AllClose() { ClearTime(); m_nState = GC1TO1_CLOSE; for( int i=0; i<(int)( m_vecTenderGuild.size() ); i++ ) { CGuild* pGuild = g_GuildMng.GetGuild( m_vecTenderGuild[i].ulGuildId ); if( pGuild ) { for( map<u_long, CGuildMember*>::iterator it=pGuild->m_mapPMember.begin(); it!=pGuild->m_mapPMember.end(); it++ ) { CUser* pUser = (CUser*)prj.GetUserByID( it->first ); if( IsValidObj(pUser) ) SendNowState( pUser ); } } } m_vecGuilCombat1to1.clear(); m_vecTenderGuild.clear(); g_dpDBClient.SendGC1to1StateToDBSrvr(); }
void ExitInstance( void ) { g_dpCoreSrvr.DeleteDPObject(); g_DPCacheSrvr.DeleteDPObject(); g_dpLoginSrvr.DeleteDPObject(); g_dpDatabaseClient.DeleteDPObject(); g_PartyMng.Clear(); g_PlayerMng.Free(); SAFE_DELETE( CParty::m_pPool ); SAFE_DELETE( CPlayer::m_pPool ); g_GuildMng.m_AddRemoveLock.Enter( theLineFile ); g_GuildWarMng.Clear(); g_GuildMng.m_AddRemoveLock.Leave( theLineFile ); g_GuildMng.Clear(); SAFE_DELETE( CGuildMember::sm_pPool ); SAFE_DELETE( CGuild::sm_pPool ); UninitializeNetLib(); }
// 1대1 길드대전 오픈 void CGuildCombat1to1Mng::GuildCombat1to1Open( BOOL bGMText ) { if( !g_eLocal.GetState( EVE_GUILDCOMBAT1TO1 ) ) return; vector<__GC1TO1TENDER>::iterator it; if( !bGMText ) { for( it=m_vecTenderFailGuild.begin(); it!=m_vecTenderFailGuild.end(); it++ ) { // 이전 1:1길드대전에 입찰 실패 길드가 신청금을 수령하지 않았을 경우 g_dpDBClient.SendGC1to1Tender( 'U', (*it).ulGuildId, (*it).nPenya, 'N' ); } m_vecTenderFailGuild.clear(); } // 신청한 길드수가 최소 참여 길드수보다 적을 때 if( (int)( m_vecTenderGuild.size() ) < m_nMinJoinGuild ) { // 1대1 길드대전 취소 및 연장 처리 CString strTemp; strTemp.Format( prj.GetText( TID_GAME_GUILDCOMBAT1TO1_NOGAME ), m_nMinJoinGuild ); g_DPCoreClient.SendCaption( strTemp ); ClearTime(); m_nState = GC1TO1_CLOSE; return; } // 1:1길드대전 오픈 메세지.. g_DPCoreClient.SendCaption( prj.GetText( TID_GAME_GUILDCOMBAT1TO1_OPEN ) ); g_DPCoreClient.SendCaption( prj.GetText( TID_GAME_GUILDCOMBAT1TO1_LINEUP ) ); // 참가자 구성 시간 설정 m_nState = GC1TO1_OPEN; m_nWaitTime = (int)m_Lua.GetGlobalNumber( "MemberLineUpTime" ); m_dwTime = GetTickCount(); // 입찰 순위에 들지 못한 길드 제거 int nCount = 0; for( it=m_vecTenderGuild.begin(); it!=m_vecTenderGuild.end(); ) { nCount++; if( nCount <= m_nMaxJoinGuild ) it++; else // 입찰 순위에서 밀려난 경우 { CGuild* pGuild = g_GuildMng.GetGuild( (*it).ulGuildId ); if( pGuild ) { CUser* pUser = (CUser*)prj.GetUserByID( pGuild->m_idMaster ); if( IsValidObj( pUser ) ) pUser->AddDefinedText( TID_GAME_GUILDCOMBAT1TO1_FAILTENDER ); } g_dpDBClient.SendGC1to1Tender( 'U', (*it).ulGuildId, (*it).nPenya, 'F' ); m_vecTenderFailGuild.push_back( (*it) ); it = m_vecTenderGuild.erase( it ); } } // 입찰 순위에는 들어갔지만 상대 길드가 없는 경우(홀수) if( m_vecTenderGuild.size() % 2 != 0 ) { it = m_vecTenderGuild.end(); it--; // 마지막 순위 // 노트 : rbegin()을 사용하시오. CGuild* pGuild = g_GuildMng.GetGuild( (*it).ulGuildId ); if( pGuild ) { CUser* pUser = (CUser*)prj.GetUserByID( pGuild->m_idMaster ); if( IsValidObj( pUser ) ) pUser->AddDefinedText( TID_GAME_GUILDCOMBAT1TO1_FAILTENDER ); } g_dpDBClient.SendGC1to1Tender( 'U', (*it).ulGuildId, (*it).nPenya, 'F' ); m_vecTenderFailGuild.push_back( (*it) ); m_vecTenderGuild.erase( it ); } // 출전 가능한 길드의 모든 길드원에게 OPEN STATE 알림(길드 마스터는 참가자 구성 시간 출력) for( it=m_vecTenderGuild.begin(); it!=m_vecTenderGuild.end(); it++ ) { CGuild* pGuild = g_GuildMng.GetGuild( (*it).ulGuildId ); if( pGuild ) { for( map<u_long, CGuildMember*>::iterator it2=pGuild->m_mapPMember.begin(); it2!=pGuild->m_mapPMember.end(); it2++ ) { CUser* pUser = (CUser*)prj.GetUserByID( it2->first ); if( IsValidObj( pUser ) ) SendNowState( pUser ); } } } g_dpDBClient.SendGC1to1StateToDBSrvr(); // 1:1길드대전이 오픈되었다고 DBServer에 알림 }
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 }