#include "StdAfx.h" #include "Util.h" #include "DNGuildWarManager.h" #include "DNDivisionManager.h" #include "DNVillageConnection.h" #include "MtRandom.h" #include "TimeSet.h" #include "DNExtManager.h" #include "DNPvP.h" CDNGuildWarManager * g_pGuildWarManager = NULL; extern TMasterConfig g_Config; CDNGuildWarManager::CDNGuildWarManager() { memset (m_pWarEventStep, 0x00, sizeof(m_pWarEventStep)); m_pWarEventStep[GUILDWAR_STEP_PREPARATION] = new CDNGuildWarPreparation; m_pWarEventStep[GUILDWAR_STEP_TRIAL] = new CDNGuildWarTrial; m_pWarEventStep[GUILDWAR_STEP_REWARD] = new CDNGuildWarReward; Clear(); } void CDNGuildWarManager::Clear() { // ½ºÅÜ ÃʱâÈ­ ResetStep(); m_bSendGuildWarInfo = false; m_eSettingStep = REQ_NONE; m_wWinersWeightRate = 0; m_wScheduleID = GUILDWARSCHEDULE_DEF; m_TickCheckGuildWar = 0; memset(&m_GuildWarFinalInfo, 0, sizeof(m_GuildWarFinalInfo)); memset(&m_sGuildWarSchedule, 0, sizeof(m_sGuildWarSchedule)); memset(&m_sGuildWarFinalSchedule, 0, sizeof(m_sGuildWarFinalSchedule)); memset(&m_bTournamentGroup, 0, sizeof(m_bTournamentGroup)); memset(&m_GuildWarOpeningPoints, 0, sizeof(m_GuildWarOpeningPoints)); m_nFinalTeamCount = 0; m_bFinalTeamSetting = false; m_cSecretTeam = 0; m_nSecretRandomSeed = 0; m_bCheatFlag = false; m_nBlueTeamPoint = 0; m_nRedTeamPoint = 0; m_dwPreWinSkillCoolTime = 0; m_bFinalWinGuild = false; m_bResetSchedule = false; m_bFinalStart = false; memset(&m_sGuildWarPointTrialRanking, 0, sizeof(m_sGuildWarPointTrialRanking)); m_wPreWinScheduleID = 0; m_bFrinalProgress = false; m_tRewardExpireDate = 0; m_PreWinGuildUID.Reset(); #if defined(PRE_FIX_75807) m_bFarmForceHarbest = false; #endif //#if defined(PRE_FIX_75807) } CDNGuildWarManager::~CDNGuildWarManager() { CDNGuildWar** pWarEventStep = m_pWarEventStep; for (int j=GUILDWAR_STEP_NONE; jbForce) { m_bWarEvent = false; m_bCheatFlag = true; } if (!pData->bForce && tCurrentTime > pData->EventInfo[GUILDWAR_STEP_REWARD].tEndTime) { // ÀÌ¹Ì Áö³­ À̺¥Æ®À̰ųª ¼ÂÆÃÀÌ ¾ÈµÈ°ÅÀÓ //g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] LoadScheduleInfo Failed !!! TimeOut or Schedule empty\n"); #if defined(PRE_FIX_75807) // ¿©±â¼­ Ȥ½Ã Áö³­ ±æµåÀü ¿ì½ÂÀÚÀÇ °ªÀÌ ÇöÀ縦 ¾È³Ñ¾ú´ÂÁö º»´Ù. if( pData->tRewardExpireDate > 0 && !GetPreWinGuild().IsSet() ) { __time64_t tCurrentTime; time(&tCurrentTime); if( tCurrentTime < pData->tRewardExpireDate ) { m_tRewardExpireDate = pData->tRewardExpireDate; // ¾ÆÁ÷ º¸»ó ±â°£ÀÌ ³²¾Æ ÀÖÀ¸¸é ¿ì½Â±æµå »Ì¾Æ¿À±â m_eSettingStep = REQ_PRE_WIN; SendGuildWarInfoReq(); // º»¼± ½ºÄÉÁì Á¤º¸ °¡Á®¿À±â ¿äû g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] Send GetPrewinGuild Schedule Empty!!!\n"); return true; } } else if( pData->tRewardExpireDate == 0 && !m_bFarmForceHarbest ) { // ¿©±â¼­ °ÔÀÓ¼­¹ö ¿ì½Â³óÀå ÃʱâÈ­ ÁøÇà MAGuildWarPreWinGuild GuildWarPreWinGuild; GuildWarPreWinGuild.GuildUID.Reset(); GuildWarPreWinGuild.bPreWin = false; m_bFarmForceHarbest = true; g_pDivisionManager->SendSetGuildWarPreWinGuildGameServer(&GuildWarPreWinGuild); } m_bSendGuildWarInfo = false; #endif //#if defined(PRE_FIX_75807) return true; } if( pData->tRewardExpireDate > 0) m_tRewardExpireDate = pData->tRewardExpireDate; ////////////////////////////////////////////////////////////////////////////////////////////////// bool bResult = false; m_wWinersWeightRate = pData->wWinersWeightRate; memcpy(m_sGuildWarSchedule, pData->EventInfo, sizeof(m_sGuildWarSchedule)); // À̺¥Æ® ÁøÇàÁßÀ̸é if (m_bWarEvent) { // µ¿ÀÏÂ÷¼ö¿¡ ÇÑÇØ ±â°£ ¾÷µ¥ÀÌÆ® °¡´É if (m_wScheduleID != pData->wScheduleID) { g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] LoadScheduleInfo Failed !!! Wrong ScheduleID Old(%d)<->New(%d) \n", m_wScheduleID, pData->wScheduleID); return false; } else { bResult = UpdateScheduleGroup(pData->wScheduleID, pData->EventInfo); } } else // À̺¥Æ® ÁøÇàÁßÀÌ ¾Æ´Ï¶ó¸é ½Å±Ô µî·Ï { bResult = RegisterScheduleGroup(pData->wScheduleID, pData->EventInfo); } if (bResult) { // µî·ÏÀ» ÇÏµç ¾÷µ¥ÀÌÆ®¸¦ ÇÏµç ¿©±â¼­ Á¤º¸¸¦ »õ·Î ¾÷µ¥ÀÌÆ®ÇÑ´Ù. m_wScheduleID = pData->wScheduleID; m_eSettingStep = REQ_FINAL_SCHEDULE; SendGuildWarInfoReq(); // º»¼± ½ºÄÉÁì Á¤º¸ °¡Á®¿À±â ¿äû SetFinalProgress(pData->bFinalProgress); return true; } return false; } bool CDNGuildWarManager::LoadFinalScheduleInfo(MASetGuildWarFinalSchedule* pData) { __time64_t tCurrentTime; time(&tCurrentTime); ////////////////////////////////////////////////////////////////////////////////////////////////// __time64_t tCheckPeriod = 0; // ÀÌ¹Ì º»¼±ÀÌ ÁøÇàÁßÀÌ¸ç ½ºÄÉÁìÀÌ ¼ÂÆÃµÇ¾î ÀÖ´ÂÁö üũ.. // °¢ ½Ã°£Ã¼Å© for( int i=GUILDWAR_FINALPART_MAX-1; i>GUILDWAR_FINALPART_NONE; --i) { if( tCheckPeriod > pData->GuildWarFinalSchedule[i].tBeginTime || pData->GuildWarFinalSchedule[i].tBeginTime > pData->GuildWarFinalSchedule[i].tEndTime ) { g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] LoadFinalScheduleInfo Failed !!! Wrong Time Schedule Begin(%d) End(%d) Check(%d)\n" , pData->GuildWarFinalSchedule[i].tBeginTime, pData->GuildWarFinalSchedule[i].tEndTime, tCheckPeriod); return false; } tCheckPeriod = pData->GuildWarFinalSchedule[i].tBeginTime; } CDNGuildWarReward* pGuildWarReward = (CDNGuildWarReward*)m_pWarEventStep[GUILDWAR_STEP_REWARD]; if( !pGuildWarReward ) { g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] LoadFinalScheduleInfo Failed !!! CDNGuildWarReward Null\n"); return false; } memcpy(m_sGuildWarFinalSchedule, pData->GuildWarFinalSchedule, sizeof(m_sGuildWarFinalSchedule)); pGuildWarReward->SetFinalScheduleInfo(pData); g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] LoadFinalScheduleInfo ScheduleID:%d\n", m_wScheduleID); // º»¼± ½ºÄÉÁì µ¹¾Æ¶ó.. StartStep(); // Àüü ½ºÄÉÁì º¸³»ÁÖ±â MASetGuildWarEventTime SetGuildWarEventTime; memset(&SetGuildWarEventTime, 0, sizeof(SetGuildWarEventTime)); memcpy(SetGuildWarEventTime.sGuildWarTime, m_sGuildWarSchedule, sizeof(SetGuildWarEventTime.sGuildWarTime)); memcpy(SetGuildWarEventTime.sFinalPartTime, m_sGuildWarFinalSchedule, sizeof(SetGuildWarEventTime.sFinalPartTime)); SetGuildWarEventTime.bFinalProgress = GetFinalProgress(); g_pDivisionManager->SendSetGuildWarSchedule(&SetGuildWarEventTime); if( (m_cStepIndex != GUILDWAR_STEP_REWARD || !GetFinalStart() ) && m_wScheduleID != 1) // ¸Ç óÀ½ Â÷¼ö°¡ ¾Æ´Ï¸é. { // º»¼±ÀÌ ¾Æ´Ï°Å³ª ¾ÆÁ÷ ½ÃÀÛÀ» ¾ÈÇßÀ¸¸é Áö³­ Â÷¼ö ¿ì½ÂÆÀ °¡Á®¿À±â.. m_eSettingStep = REQ_PRE_WIN; SendGuildWarInfoReq(); return true; } else if( m_cStepIndex == GUILDWAR_STEP_TRIAL || m_cStepIndex == GUILDWAR_STEP_REWARD ) { // ¿¹¼±À̰ųª º»¼±À̸é ûÆÀ, È«ÆÀ Æ÷ÀÎÆ® °¡Á®¿À±â m_eSettingStep = REQ_TEAM_POINT; SendGuildWarInfoReq(); return true; } m_bSendGuildWarInfo = false; m_eSettingStep = REQ_ALL_COMPLETE; g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] LoadFinalScheduleInfo REQ_ALL_COMPLETE !!!\n"); return true; } void CDNGuildWarManager::SendGuildWarInfoReq() { // Äݷμ¼¿ò ºô¸®ÁöÇÑÅ× ¿äû CDNVillageConnection* pVillageConnection = g_pDivisionManager->GetVillageConnectionByVillageID( g_pDivisionManager->GetPvPLobbyVillageID() ); if( pVillageConnection == NULL || pVillageConnection->GetActive() == false ) return; if( pVillageConnection ) { switch(m_eSettingStep) { case REQ_NONE : case REQ_SCHEDULE : { pVillageConnection->SendGetGuildWarSchedule(); // ½ºÄÉÁì Á¤º¸ °¡Á®¿À±â ¿äû m_eSettingStep = REQ_SCHEDULE; } break; case REQ_FINAL_SCHEDULE : { pVillageConnection->SendGetGuildWarFinalSchedule(m_wScheduleID); // º»¼± ½ºÄÉÁì Á¤º¸ °¡Á®¿À±â ¿äû } break; case REQ_PRE_WIN : { pVillageConnection->SendGetGuildWarPreWinGuild(); // ¿ì½ÂÆÀ °¡Á®¿À±â } break; case REQ_TEAM_POINT : { pVillageConnection->SendGetGuildWarPoint(); // ûÆÀ, È«ÆÀ Æ÷ÀÎÆ® °¡Á®¿À±â } break; } m_bSendGuildWarInfo = true; m_TickCheckGuildWar = timeGetTime(); } } void CDNGuildWarManager::SetGuildWarPoint(int nBlueTeam, int nRedTeam) { InterlockedExchange(&m_nBlueTeamPoint, nBlueTeam); InterlockedExchange(&m_nRedTeamPoint, nRedTeam); CalcTeamSecret(); m_bSendGuildWarInfo = false; m_eSettingStep = REQ_ALL_COMPLETE; g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] SetGuildWarPoint REQ_ALL_COMPLETE !!!\n"); } void CDNGuildWarManager::AddGuildWarPoint(char cTeamType, int nAddPoint) { if( cTeamType == GUILDWAR_TEAM_BLUE) InterlockedExchangeAdd(&m_nBlueTeamPoint, nAddPoint); else if( cTeamType == GUILDWAR_TEAM_RED ) InterlockedExchangeAdd(&m_nRedTeamPoint, nAddPoint); CalcTeamSecret(); } void CDNGuildWarManager::SetGuildWarPreWinGuild(TGuildUID GuildUID) { m_PreWinGuildUID = GuildUID; if( m_cStepIndex == GUILDWAR_STEP_TRIAL || m_cStepIndex == GUILDWAR_STEP_REWARD ) { // ¿¹¼±À̰ųª º»¼±À̸é ÀüÀ̸é ûÆÀ, È«ÆÀ Æ÷ÀÎÆ® °¡Á®¿À±â m_eSettingStep = REQ_TEAM_POINT; SendGuildWarInfoReq(); return; } m_bSendGuildWarInfo = false; m_eSettingStep = REQ_ALL_COMPLETE; g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] SetGuildWarPreWinGuild REQ_ALL_COMPLETE !!!\n"); } UINT CDNGuildWarManager::GetGuildDBIDWithFinal(const UINT uiPvPIndex, const WCHAR * pGuildName) { if (pGuildName == NULL) return 0; for( int i=0; i 0 && m_bTournamentGroup[i].BTeam.nTeamNum > 0) { if (wcscmp(m_GuildWarFinalInfo[m_bTournamentGroup[i].ATeam.nTeamNum-1].wszGuildName, pGuildName) == 0 && m_bTournamentGroup[i].unPvPIndex == uiPvPIndex) return m_GuildWarFinalInfo[m_bTournamentGroup[i].ATeam.nTeamNum-1].GuildUID.nDBID; if (wcscmp(m_GuildWarFinalInfo[m_bTournamentGroup[i].BTeam.nTeamNum-1].wszGuildName, pGuildName) == 0 && m_bTournamentGroup[i].unPvPIndex == uiPvPIndex) return m_GuildWarFinalInfo[m_bTournamentGroup[i].BTeam.nTeamNum-1].GuildUID.nDBID; } } return 0; } bool CDNGuildWarManager::IsTrialStats() { if( m_cStepIndex == GUILDWAR_STEP_REWARD) { CDNGuildWarReward* pReward = (CDNGuildWarReward*)m_pWarEventStep[m_cStepIndex]; return pReward->m_bTrialStatsRequest; } return false; } void CDNGuildWarManager::SetTrialStats() { CDNGuildWarReward* pReward = (CDNGuildWarReward*)m_pWarEventStep[GUILDWAR_STEP_REWARD]; pReward->m_bTrialStatsRequest = true; g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] SetTrialStats!!!\n"); } void CDNGuildWarManager::CalcGuildWarTournament(VIMASetGuildWarFinalTeam* pData) { // ÀÚ¸®´Â °íÁ¤ÀÔ´Ï´Ù¿ä...ÀÚ¼¼ÇÑ°Ç [DN]±æµåÀü_º»¼±´ëÁøÇ¥¹èÄ¡_1_.pptx ÂüÁ¶ int MatchSequence[]={0,8,14,6,4,12,10,2,3,11,13,5,7,15,9,1}; sTournamentGroup Groups[GUILDWAR_TOURNAMENT_GROUP_MAX]; memset(Groups, 0, sizeof(Groups)); for( int i=0; inCount; ++i ) { int nGroupIndex = MatchSequence[i]/2; if( MatchSequence[i]%2 ) Groups[nGroupIndex].BTeam.nTeamNum = i+1; else Groups[nGroupIndex].ATeam.nTeamNum = i+1; } for( int i=0; inTotalPoint[Groups[i].ATeam.nTeamNum-1]; m_GuildWarFinalInfo[i*2].GuildUID = pData->GuidUID[Groups[i].ATeam.nTeamNum-1]; m_GuildWarOpeningPoints[i*2] = pData->nTotalPoint[Groups[i].ATeam.nTeamNum-1]; memcpy(m_GuildWarFinalInfo[i*2].wszGuildName, pData->wszGuildName[Groups[i].ATeam.nTeamNum-1], sizeof(m_GuildWarFinalInfo[Groups[i].ATeam.nTeamNum-1].wszGuildName)); } if( Groups[i].BTeam.nTeamNum ) { //m_bTournamentGroup[i].BTeam.nTeamNum = (i*2)+2; //m_bTournamentGroup[i].BTeam.nOpeningPoint = pData->nTotalPoint[Groups[i].BTeam.nTeamNum-1]; m_GuildWarFinalInfo[(i*2)+1].GuildUID = pData->GuidUID[Groups[i].BTeam.nTeamNum-1]; m_GuildWarOpeningPoints[(i*2)+1] = pData->nTotalPoint[Groups[i].BTeam.nTeamNum-1]; memcpy(m_GuildWarFinalInfo[(i*2)+1].wszGuildName, pData->wszGuildName[Groups[i].BTeam.nTeamNum-1], sizeof(m_GuildWarFinalInfo[Groups[i].BTeam.nTeamNum-1].wszGuildName)); } } m_nFinalTeamCount = pData->nCount; SetGuildWarTournamentGroup(); m_bFinalTeamSetting = true; // ¿©±â¼­ ±æµå Á¤º¸ ¾÷µ¥ÀÌÆ® MAChangeGuildInfo ChangeGuildInfo; memset(&ChangeGuildInfo, 0, sizeof(ChangeGuildInfo)); // º»¼± ÁøÃâ Ƚ¼ö 1ȸ Ãß°¡~~ ChangeGuildInfo.btGuildUpdate = GUILDUPDATE_TYPE_GUILDWAR; ChangeGuildInfo.Int1 = 1; for(int i=0; iSendChangeGuildInfo(&ChangeGuildInfo); } g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] CalcGuildWarTournament Success TeamCount:%d !!!\n", m_nFinalTeamCount); } void CDNGuildWarManager::DoUpdate(DWORD CurTick) { // Reset È®ÀÎ if ( m_bResetSchedule ) { if( g_pGuildWarManager->GetFinalProgress() && g_pGuildWarManager->GetFinalStart() ) { // º»¼± ÁøÇàÁßÀ̸é..À̶§´Â °­Á¦ Áß´ÜÀ¸·Î ¿©±â°í ¸ðµç ±æµåÀü °­Á¦ Á¾·á.. g_pDivisionManager->SendGuildWarAllStop(); g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] Emergence GuilWar Stop Process!!!\n"); } g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] Reset Schedule GuilWar Progress:%d, Start:%d\n",g_pGuildWarManager->GetFinalProgress(),g_pGuildWarManager->GetFinalStart() ); Clear(); // ÀüºÎ ÃʱâÈ­Çϰí SendGuildWarInfoReq(); // ´Ù½Ã ÷ºÎÅÍ ·Îµù ¤¡¤¡ return; } //¿ì½Â ±æµå°¡ ¼ÂÆÃµÇ¾î ÀÖÀ¸¸é º¸»óÀÌ Áö±ÞµÆ´ÂÁö °¡Á®¿ÀÀÚ..´ë·« 1ºÐ ¸¶´Ù Çѹø¾¿.. DWORD dwTick = timeGetTime(); static DWORD SendTick = 60*1000; if( GetPreWinGuild().IsSet() && !GetFinalWinGuildReward() && SendTick+(60*1000) < dwTick) { //CDNVillageConnection *pVillageConnection = g_pDivisionManager->GetFirstEnableVillageServer(); CDNVillageConnection* pVillageConnection = g_pDivisionManager->GetVillageConnectionByVillageID( g_pDivisionManager->GetPvPLobbyVillageID() ); if( pVillageConnection ) { pVillageConnection->SendGetGuildWarPreWindGuildReward(GetPreWinScheduleID(), GetPreWinGuild().nDBID); } SendTick = dwTick; } if ( m_eSettingStep != REQ_ALL_COMPLETE && (!m_bSendGuildWarInfo || (m_bSendGuildWarInfo && CurTick > m_TickCheckGuildWar+REQ_GUILDWARINFO_TICK_MAX)) ) // Ȱ¼ºÈ­ µÇ¾î ÀÖÁö ¾Ê°í ºô¸®Áö¿¡°Ô Á¤º¸ ¿äûÇÏÁö ¾ÊÀº »óŰųª ŸÀÓ¿À¹ÙÀ̸é { SendGuildWarInfoReq(); return; } // ¿ì½Â±æµå ÇØÁ¦..Á¦½ºÃÄ, ³óÀå if( m_PreWinGuildUID.IsSet() && m_bFinalWinGuild && m_tRewardExpireDate > 0 ) { __time64_t tCurrentTime; time(&tCurrentTime); if( tCurrentTime > m_tRewardExpireDate ) { // ¿ì½Â±æµå ÇØÁ¦ MAGuildWarPreWinGuild pPacket; memset(&pPacket, 0, sizeof(MAGuildWarPreWinGuild)); pPacket.GuildUID = GetPreWinGuild(); pPacket.bPreWin = false; g_pDivisionManager->SendSetGuildWarPreWinGuild(&pPacket); // Àüü °ÔÀÓ ¹× ºô¸®Áö¿¡ Å뺸. m_PreWinGuildUID.Reset(); m_tRewardExpireDate = 0; g_pGuildWarManager->SetFinalWinGuild(false); g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] PreWinGuild ExpireDate!!!\n"); } } if (m_bWarEvent && CheckStep(m_cStepIndex) && m_eSettingStep == REQ_ALL_COMPLETE) { CDNGuildWar** pWarEventStep = m_pWarEventStep; CDNGuildWar* pCurrentEvent = pWarEventStep[m_cStepIndex]; if (pCurrentEvent) { // ÇØ´ç À̺¥Æ®°´Ã¼¸¦ È£ÃâÇÏ¿© ó¸®! pCurrentEvent->Process(); // ¸ðµç À̺¥Æ®°¡ ³¡³µÀ»¶§ ´ÙÀ½½ºÅÜÀ¸·Î ÁøÇà if (pCurrentEvent->IsFinishPeriod()) NextStep(); } } // º»¼± ÁøÇàÀ϶§¸¸.. if( GetFinalProgress() ) { CDNVillageConnection* pVillageCon = g_pDivisionManager->GetVillageConnectionByVillageID( g_pDivisionManager->GetPvPLobbyVillageID() ); if( pVillageCon == NULL || pVillageCon->GetActive() == false ) return; //À̰оîÄÉÇØ¾ßÇÔ? // º»¼±ÀÌ°í ¹æÀÌ ¸¸µé¾îÁø ¾ÖµéÀº ½Ã°£ÀÌ µÇ¸é ½ºÅ¸Æ® ³¯·ÁÁÖÀÚ.. CDNPvP* pPvP = NULL; VIMAPVP_START Packet; memset(&Packet, 0, sizeof(Packet)); Packet.sCSPVP_START.unCheck = PvPCommon::Check::AllCheck; for( int i=0; i 0) { if( CurTick > m_bTournamentGroup[i].dwStartTick+GUILDWAR_FINAL_ROOMSTRAT_TICK_MAX ) { if( g_pDivisionManager->GetGameConnectionCount() <= 0 ) { g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] StartPvP Failed !!! Not GameConnection \n"); return; } pPvP = g_pDivisionManager->GetPvPRoomByIdx(m_bTournamentGroup[i].unPvPIndex); if( pPvP ) { short wRet = pPvP->StartPvP(pVillageCon, &Packet); if( wRet != ERROR_NONE ) g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] StartPvP Failed !!! %d \n", wRet); else { g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] StartPvP Success PvPIndex:%u !!! \n", m_bTournamentGroup[i].unPvPIndex); m_bTournamentGroup[i].dwStartTick = 0; } } } } } } } CDNGuildWar* CDNGuildWarManager::GetWarEvent(char cStep) { if (!CheckStep(cStep)) return NULL; return m_pWarEventStep[cStep]; } int CDNGuildWarManager::SetGuildTournamentInfo(SGuildTournamentInfo* pGuildTournamentInfo) { // Ä«¿îÆ® ¼¿·Á°í ·çÇÁµ¼.¤Ð¤Ð int nCount = 0; for( int i=0; i 0) { memcpy(m_GuildWarFinalInfo, pGuildTournamentInfo, sizeof(m_GuildWarFinalInfo)); m_nFinalTeamCount = nCount; SetGuildWarTournamentGroup(); m_bFinalTeamSetting = true; } return nCount; } void CDNGuildWarManager::SetGuildWarPointTrialRanking(const MASetGuildWarPointRunningTotal* pData) { memcpy(m_sGuildWarPointTrialRanking, pData, sizeof(m_sGuildWarPointTrialRanking)); } void CDNGuildWarManager::CalcGuildWarTournamentResult() { for( int i=0; i 0 && m_bTournamentGroup[i].BTeam.nTeamNum > 0) { BYTE ATeamIndex = m_bTournamentGroup[i].ATeam.nTeamNum-1; BYTE BTeamIndex = m_bTournamentGroup[i].BTeam.nTeamNum-1; // µÑ´Ù Áø »óÅ·ΠµÇ¾î ÀÖÀ¸¸é.. if( ATeamIndex < GUILDWAR_FINALS_TEAM_MAX && BTeamIndex < GUILDWAR_FINALS_TEAM_MAX && !m_GuildWarFinalInfo[ATeamIndex].bWin && !m_GuildWarFinalInfo[BTeamIndex].bWin ) { // ±×³É °áÆÇ ³»¹ö¸®ÀÚ.. CalcGuildWarTournamentWin(i); } } } } void CDNGuildWarManager::SetGuildWarTournamentGroup() { memset(m_bTournamentGroup, 0, sizeof(m_bTournamentGroup)); char cCurFinalPart = GetCurFinalPart(); int nCount = 0; int nDefaultWinMax = 0; //ºÎÀü½Â °Ç³Ê¶ç±â switch(cCurFinalPart) { case GUILDWAR_FINALPART_NONE : case GUILDWAR_FINALPART_16 : nDefaultWinMax = 1; break; case GUILDWAR_FINALPART_8 : nDefaultWinMax = 3; break; case GUILDWAR_FINALPART_4 : nDefaultWinMax = 7; break; case GUILDWAR_FINALPART_FINAL : nDefaultWinMax = 15; break; } for( int i=0; i= GUILDWAR_FINALS_TEAM_MAX ) break; if( !m_GuildWarFinalInfo[i+j].GuildUID.IsSet() ) continue; if( m_GuildWarFinalInfo[i+j].cMatchTypeCode != GUILDWAR_FINALPART_NONE && m_GuildWarFinalInfo[i+j].bWin == false ) continue; // °á½ÂÀüÀ» Á¦¿ÜÇÏ°í ¿ÞÂÊ ÆÀÀÌ ¿À¸¥ÂÊ ÆÀ°ú ºÙÀ» ÀÏÀº ¾ø´Ù. if( cCurFinalPart != GUILDWAR_FINALPART_FINAL && i < GUILDWAR_TOURNAMENT_GROUP_MAX && i+j >= GUILDWAR_TOURNAMENT_GROUP_MAX ) break; bDefaltWin = false; break; } if( bDefaltWin ) ++nCount; m_GuildWarFinalInfo[i].cMatchTypeCode = cCurFinalPart; m_GuildWarFinalInfo[i].bWin = false; } else if( m_bTournamentGroup[nCount].BTeam.nTeamNum == 0) { m_bTournamentGroup[nCount].BTeam.nTeamNum = i+1; m_bTournamentGroup[nCount].BTeam.nOpeningPoint = m_GuildWarOpeningPoints[i]; ++nCount; m_GuildWarFinalInfo[i].cMatchTypeCode = cCurFinalPart; m_GuildWarFinalInfo[i].bWin = false; } } g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] SetGuildWarTournamentGroup FinalPart:%d !!!\n", cCurFinalPart); } // ±æµåÀü ¹æ »ý¼º void CDNGuildWarManager::GuildWarCreateRoom() { CDNVillageConnection* pVillageCon = g_pDivisionManager->GetVillageConnectionByVillageID( g_pDivisionManager->GetPvPLobbyVillageID() ); if( pVillageCon == NULL || pVillageCon->GetActive() == false ) return; //À̰оîÄÉÇØ¾ßÇÔ? CTimeSet CurTime; CurTime.GetMonth(); // MapID ¾ò¾î¿À±â UINT uiMapIndex = g_pExtManager->GetGuildWarMapInfoID((char)CurTime.GetMonth()); if( uiMapIndex == 0 ) { g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] GuildWarCreateRoom Failed !!! GuildWarMapID is Zero\n"); return; } // MapID·Î PvPMapTable ¾ò¾î¿À±â const TPvPMapTable* pMapTable = g_pExtManager->GetPvPMapTable(uiMapIndex); if( pMapTable == NULL ) { g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] GuildWarCreateRoom Failed !!! pMapTable is NULL\n"); return; } // PvPMapTable¿¡¼­ GameMode Á¤º¸ °¡Á®¿À±â const TPvPGameModeTable* pPvPGameModeTable = g_pExtManager->GetPvPGameModeTable( pMapTable->vGameModeTableID[0] ); if( pPvPGameModeTable == NULL ) { g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] GuildWarCreateRoom Failed !!! pPvPGameModeTable is NULL\n"); return; } for( int i=0; iSendSetGuildWarFinalResultDB(m_wScheduleID, m_bTournamentGroup[i].ATeam.nTeamNum, m_GuildWarFinalInfo[m_bTournamentGroup[i].ATeam.nTeamNum-1].GuildUID.nDBID, GetCurFinalPart(), true); } else { // ¿©±â¼­ ¹æ¸¸µé±â.. VIMAPVP_CREATEROOM sCreateRoom; memset(&sCreateRoom, 0, sizeof(sCreateRoom)); sCreateRoom.unVillageChannelID = g_pDivisionManager->GetPvPLobbyChannelID(); sCreateRoom.uiVillageMapIndex = g_pDivisionManager->GetPvPLobbyMapIndex(); sCreateRoom.cGameMode = PvPCommon::GameMode::PvP_GuildWar; sCreateRoom.nGuildDBID[0] = m_GuildWarFinalInfo[m_bTournamentGroup[i].ATeam.nTeamNum-1].GuildUID.nDBID; sCreateRoom.nGuildQualifyingScore[0] = m_GuildWarOpeningPoints[m_bTournamentGroup[i].ATeam.nTeamNum-1]; sCreateRoom.nGuildDBID[1] = m_GuildWarFinalInfo[m_bTournamentGroup[i].BTeam.nTeamNum-1].GuildUID.nDBID; sCreateRoom.nGuildQualifyingScore[1] = m_GuildWarOpeningPoints[m_bTournamentGroup[i].BTeam.nTeamNum-1]; sCreateRoom.sCSPVP_CREATEROOM.uiMapIndex = uiMapIndex; sCreateRoom.sCSPVP_CREATEROOM.uiGameModeTableID = pMapTable->vGameModeTableID[0]; sCreateRoom.sCSPVP_CREATEROOM.uiSelectWinCondition = pPvPGameModeTable->vWinCondition[0]; // ¿ä°Å Á¡¼öÀε¥ ¿¡¶ó ¸ð¸£°Ú´Ù. sCreateRoom.sCSPVP_CREATEROOM.uiSelectPlayTimeSec = pPvPGameModeTable->vPlayTimeSec[0]; sCreateRoom.sCSPVP_CREATEROOM.cMaxUser = pPvPGameModeTable->uiNumOfPlayersMax; sCreateRoom.sCSPVP_CREATEROOM.cMinUser = 0; sCreateRoom.sCSPVP_CREATEROOM.cRoomPWLen = 0; sCreateRoom.sCSPVP_CREATEROOM.cMinLevel = 1; sCreateRoom.sCSPVP_CREATEROOM.cMaxLevel = 100; sCreateRoom.sCSPVP_CREATEROOM.unRoomOptionBit |= (PvPCommon::RoomOption::BreakInto|PvPCommon::RoomOption::NoRegulation); // ³­ÀÔ,¹«Á¶Á¤ Çã¿ë sCreateRoom.sCSPVP_CREATEROOM.uiEventItemID = 0; #ifdef PRE_ADD_COLOSSEUM_BEGINNER sCreateRoom.sCSPVP_CREATEROOM.cRoomType = PvPCommon::RoomType::regular; #endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER wsprintf(sCreateRoom.sCSPVP_CREATEROOM.wszBuf, L"%s vs %s", m_GuildWarFinalInfo[m_bTournamentGroup[i].ATeam.nTeamNum-1].wszGuildName, m_GuildWarFinalInfo[m_bTournamentGroup[i].BTeam.nTeamNum-1].wszGuildName); sCreateRoom.sCSPVP_CREATEROOM.cRoomNameLen = (BYTE)wcslen(sCreateRoom.sCSPVP_CREATEROOM.wszBuf); short nRetCode = g_pDivisionManager->CreatePvPRoom( pVillageCon, &sCreateRoom, &m_bTournamentGroup[i].unPvPIndex ); if( nRetCode != ERROR_NONE ) g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] GuildWarCreateRoom Failed !!! CreatePvPRoom %s \n", sCreateRoom.sCSPVP_CREATEROOM.wszBuf); else { m_bTournamentGroup[i].dwStartTick = timeGetTime(); g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] GuildWarCreateRoom !!! CreatePvPRoom PvPIndex:%u %s \n", m_bTournamentGroup[i].unPvPIndex, sCreateRoom.sCSPVP_CREATEROOM.wszBuf); } } } } } void CDNGuildWarManager::SetGuildWarTournamentResult(GAMAPvPGuildWarResult* pGuildWarResult) { char cWinGuildIndex =-1, cLoseGuildIndex = -1; for(char i=0; inWinGuildDBID ) { SetGuildTournamentInfoWin(i, true); cWinGuildIndex = i; continue; } if( m_GuildWarFinalInfo[i].GuildUID.nDBID == pGuildWarResult->nLoseGuildDBID ) { SetGuildTournamentInfoWin(i, false); cLoseGuildIndex = i; continue; } } SendSetGuildWarFinalResult(cWinGuildIndex, cLoseGuildIndex); SendSetGuildWarTournamentWin(cWinGuildIndex, m_GuildWarFinalInfo[cWinGuildIndex].cMatchTypeCode); //°á½ÂÀÌ¸é ¿ì½Â±æµå·Î ¼ÂÆÃÇØ ÁÖÀÚ~ if( m_GuildWarFinalInfo[cWinGuildIndex].cMatchTypeCode == GUILDWAR_FINALPART_FINAL ) { SetPreWinGuild( m_GuildWarFinalInfo[cWinGuildIndex].GuildUID); SetPreWinScheduleID(m_wScheduleID); } g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] TournamentResult !!! FinalPart:%d, WinGuildDBID:%d, LosGuildDBID:%d \n", GetCurFinalPart(), pGuildWarResult->nWinGuildDBID, pGuildWarResult->nLoseGuildDBID); } void CDNGuildWarManager::SendSetGuildWarFinalResult(char cWinGuildIndex, char cLoseGuildIndex ) { MAVISetGuildWarFinalResult FinalResult; memset(&FinalResult, 0, sizeof(FinalResult)); FinalResult.cMatchTypeCode = GetCurFinalPart(); FinalResult.cWinGuildIndex = cWinGuildIndex; FinalResult.cLoseGuildIndex = cLoseGuildIndex; g_pDivisionManager->SendSetGuildWarFinalResult(&FinalResult); } void CDNGuildWarManager::SetGuildTournamentInfoWin(char cIndex, bool bWin) { if( cIndex < 0 || cIndex >= GUILDWAR_FINALS_TEAM_MAX ) return; m_GuildWarFinalInfo[cIndex].bWin = bWin; // ¸¸¾à °á½ÂÀü ½ÂÀÚ À̸é.. if( m_GuildWarFinalInfo[cIndex].cMatchTypeCode == GUILDWAR_FINALPART_FINAL && bWin ) { // ¿©±â¼­ ±æµå Á¤º¸ ¾÷µ¥ÀÌÆ® MAChangeGuildInfo ChangeGuildInfo; memset(&ChangeGuildInfo, 0, sizeof(ChangeGuildInfo)); // º»¼± ¿ì½Â Ƚ¼ö 1ȸ Ãß°¡~~ ChangeGuildInfo.btGuildUpdate = GUILDUPDATE_TYPE_GUILDWAR; ChangeGuildInfo.Int2 = 1; ChangeGuildInfo.GuildUID = m_GuildWarFinalInfo[cIndex].GuildUID; g_pDivisionManager->SendChangeGuildInfo(&ChangeGuildInfo); } } void CDNGuildWarManager::SetGuildWarOpenningPoint(VIMASetGuildWarFinalTeam* pData ) { for( int i=0; inCount; ++i) { for( int j=0; jGuidUID[i] == m_GuildWarFinalInfo[j].GuildUID ) { m_GuildWarOpeningPoints[j] = pData->nTotalPoint[i]; break; } } } } void CDNGuildWarManager::SetGuildWarTournamentPoint(GAMAPvPGuildWarScore* pGuildWarPoint) { for( int i=0; inGuildDBID) { m_bTournamentGroup[i].ATeam.nTournamentPoint = pGuildWarPoint->nScore; break; } if( m_bTournamentGroup[i].BTeam.nTeamNum && m_GuildWarFinalInfo[m_bTournamentGroup[i].BTeam.nTeamNum-1].GuildUID.nDBID == pGuildWarPoint->nGuildDBID) { m_bTournamentGroup[i].BTeam.nTournamentPoint = pGuildWarPoint->nScore; break; } } } void CDNGuildWarManager::SendSetGuildWarTournamentWin(char cWinGuildIndex, char cFinalPart) { if( cWinGuildIndex < 0 || cWinGuildIndex >= GUILDWAR_FINALS_TEAM_MAX ) return; MASetGuildWarTournamentWin SetGuildWarTournamentWin; memset(&SetGuildWarTournamentWin, 0, sizeof(SetGuildWarTournamentWin)); SetGuildWarTournamentWin.cMatchTypeCode = cFinalPart; memcpy(SetGuildWarTournamentWin.wszGuildName, m_GuildWarFinalInfo[cWinGuildIndex].wszGuildName, sizeof(SetGuildWarTournamentWin.wszGuildName) ); g_pDivisionManager->SendSetGuildWarTournamentWin(&SetGuildWarTournamentWin); } char CDNGuildWarManager::GetCurFinalPart() { CDNGuildWarReward* pGuildWarReward = (CDNGuildWarReward*)m_pWarEventStep[GUILDWAR_STEP_REWARD]; if( pGuildWarReward ) return pGuildWarReward->GetCurFinalPart(); return 0; } time_t CDNGuildWarManager::GetCurFinalPartBeginTime() { CDNGuildWarReward* pGuildWarReward = (CDNGuildWarReward*)m_pWarEventStep[GUILDWAR_STEP_REWARD]; if( pGuildWarReward ) return pGuildWarReward->GetCurFinalPartBeginTime(); return 0; } void CDNGuildWarManager::SetDBJobSend(bool bSend) { CDNGuildWar* pGuildWar = m_pWarEventStep[m_cStepIndex]; if( pGuildWar ) pGuildWar->SetDBJobSend(bSend); } void CDNGuildWarManager::SetDBJobSeq(int nJobSeq) { CDNGuildWar* pGuildWar = m_pWarEventStep[m_cStepIndex]; if( pGuildWar ) pGuildWar->SetDBJobSeq(nJobSeq); } void CDNGuildWarManager::SetDBJobSuccess(bool bSuccess) { CDNGuildWar* pGuildWar = m_pWarEventStep[m_cStepIndex]; if( pGuildWar ) pGuildWar->SetDBJobSuccess(bSuccess); } bool CDNGuildWarManager::GetDBJobSuccess() { CDNGuildWar* pGuildWar = m_pWarEventStep[m_cStepIndex]; if( pGuildWar ) return pGuildWar->GetDBJobSuccess(); return false; } // ¹æÀÌ »Ç»çÁö°Å³ª °ÔÀÓ¼­¹ö°¡ ƨ°åÀ»¶§ È£Ãâ¹Ù¶÷.. void CDNGuildWarManager::SetDropTournament(UINT unPvPIndex) { for( int i=0; i= GUILDWAR_TOURNAMENT_GROUP_MAX) return; char cWinGuildIndex = -1, cLoseGuildIndex = -1; // ¸ÕÀú Áß°£ Á¡¼ö º¸°í if( m_bTournamentGroup[cGroupIndex].ATeam.nTournamentPoint != m_bTournamentGroup[cGroupIndex].BTeam.nTournamentPoint ) { cWinGuildIndex = m_bTournamentGroup[cGroupIndex].ATeam.nTournamentPoint > m_bTournamentGroup[cGroupIndex].BTeam.nTournamentPoint ? m_bTournamentGroup[cGroupIndex].ATeam.nTeamNum-1 : m_bTournamentGroup[cGroupIndex].BTeam.nTeamNum-1; cLoseGuildIndex = m_bTournamentGroup[cGroupIndex].ATeam.nTournamentPoint > m_bTournamentGroup[cGroupIndex].BTeam.nTournamentPoint ? m_bTournamentGroup[cGroupIndex].BTeam.nTeamNum-1 : m_bTournamentGroup[cGroupIndex].ATeam.nTeamNum-1; } // ¾ÈµÇ¸é ¿¹¼±Á¡¼ö º¸°í else if( m_bTournamentGroup[cGroupIndex].ATeam.nOpeningPoint != m_bTournamentGroup[cGroupIndex].BTeam.nOpeningPoint ) { cWinGuildIndex = m_bTournamentGroup[cGroupIndex].ATeam.nOpeningPoint > m_bTournamentGroup[cGroupIndex].BTeam.nOpeningPoint ? m_bTournamentGroup[cGroupIndex].ATeam.nTeamNum-1 : m_bTournamentGroup[cGroupIndex].BTeam.nTeamNum-1; cLoseGuildIndex = m_bTournamentGroup[cGroupIndex].ATeam.nOpeningPoint > m_bTournamentGroup[cGroupIndex].BTeam.nOpeningPoint ? m_bTournamentGroup[cGroupIndex].BTeam.nTeamNum-1 : m_bTournamentGroup[cGroupIndex].ATeam.nTeamNum-1; } else { //ÀÌ°Ç ¿îÀÌ´Ù..µÈÀå.. cWinGuildIndex = m_bTournamentGroup[cGroupIndex].ATeam.nTeamNum-1; cLoseGuildIndex = m_bTournamentGroup[cGroupIndex].BTeam.nTeamNum-1; } char cMatchTypeCode = m_GuildWarFinalInfo[cWinGuildIndex].cMatchTypeCode; SetGuildTournamentInfoWin(cWinGuildIndex, true); //À̱ä°É·Î Ç¥½Ã SetGuildTournamentInfoWin(cLoseGuildIndex, false); //Áø°É·Î Ç¥½Ã SendSetGuildWarFinalResult(cWinGuildIndex, cLoseGuildIndex); // °á°ú º¸³»ÁÖ°í.. SendSetGuildWarTournamentWin(cWinGuildIndex, cMatchTypeCode); // ½Â¸® ±æµå ¾Ë¸². //º¸»óÁö±ÞÇØÁà¾ßÇÔ.. //CDNVillageConnection* pVillage = g_pDivisionManager->GetFirstEnableVillageServer(); CDNVillageConnection* pVillage = g_pDivisionManager->GetVillageConnectionByVillageID( g_pDivisionManager->GetPvPLobbyVillageID() ); if( pVillage ) { //À̱ä³Ñ Áø³Ñ µÑ´Ù DB¿¡ °á°ú ÀúÀå pVillage->SendSetGuildWarFinalResultDB(m_wScheduleID, cWinGuildIndex+1, m_GuildWarFinalInfo[cWinGuildIndex].GuildUID.nDBID, cMatchTypeCode, true); pVillage->SendSetGuildWarFinalResultDB(m_wScheduleID, cLoseGuildIndex+1, m_GuildWarFinalInfo[cLoseGuildIndex].GuildUID.nDBID, cMatchTypeCode, false); } else { // ¿ä°Ç º¸»óµµ ¸øÁÖ°í °á°ú ±â·Ïµµ ¸øÇÔ.¤Ð¤Ð g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] SetDropTournament Failed !!! WinGuildDBID:%d, LosGuildDBID:%d \n", m_GuildWarFinalInfo[cWinGuildIndex].GuildUID.nDBID, m_GuildWarFinalInfo[cLoseGuildIndex].GuildUID.nDBID); } //°á½ÂÀÌ¸é ¿ì½Â±æµå·Î ¼ÂÆÃÇØ ÁÖÀÚ~ if( cMatchTypeCode == GUILDWAR_FINALPART_FINAL ) { g_pGuildWarManager->SetPreWinGuild( m_GuildWarFinalInfo[cWinGuildIndex].GuildUID); g_pGuildWarManager->SetPreWinScheduleID(m_wScheduleID); } g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] SetDropTournament !!! WinGuildDBID:%d, LosGuildDBID:%d \n", m_GuildWarFinalInfo[cWinGuildIndex].GuildUID.nDBID, m_GuildWarFinalInfo[cLoseGuildIndex].GuildUID.nDBID); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Private Function bool CDNGuildWarManager::CheckStep(char cStep) { if (GUILDWAR_STEP_NONE < cStep && cStep < GUILDWAR_STEP_END) return true; return false; } void CDNGuildWarManager::ResetStep() { // ½ºÄÉÁì ID¸®¼Â m_wScheduleID = GUILDWARSCHEDULE_DEF; // ½ºÅÜ ÃʱâÈ­ m_cStepIndex = GUILDWAR_STEP_NONE; m_bWarEvent = false; for (int i=GUILDWAR_STEP_NONE; iReset(); } } void CDNGuildWarManager::StartStep() { m_bWarEvent = true; m_cStepIndex = GUILDWAR_STEP_PREPARATION; // ÇöÀç ¾î¶² À̺¥Æ®°¡ ÁøÇàµÇ´ÂÁö ¿©±â¼­ ¸ÂÃç¹ö¸®ÀÚ. for( int i=GUILDWAR_STEP_PREPARATION; iProcess(); // ¸ðµç À̺¥Æ®°¡ ³¡³µÀ»¶§ ´ÙÀ½½ºÅÜÀ¸·Î ÁøÇà if (pWarEventStep[i]->IsFinishPeriod()) NextStep(); } } void CDNGuildWarManager::NextStep() { // Ȥ½Ã ¸ð¸£´Ï ŸÀÔüũ Çѹø´õ! if (!CheckStep(m_cStepIndex)) return; char cNextStepIndex = m_cStepIndex + 1; if (cNextStepIndex >= GUILDWAR_STEP_END) { // ´ÙÀ½½ºÅÜÀÌ ¸¶Áö¸·À̸é Á¾·áÇÑ´Ù. FinalStep(); // ´ÙÀ½ Â÷¼ö °¡Á®¿À±â~ m_eSettingStep = REQ_SCHEDULE; SendGuildWarInfoReq(); return; } time_t tNextEvent = m_pWarEventStep[cNextStepIndex]->GetEventTime (GUILDWAR_EVENT_START); time_t tCurrentTime; time(&tCurrentTime); // ´ÙÀ½ À̺¥Æ® ½Ã°£ÀÌ ÇöÀç½Ã°¢º¸´Ù ¸¹À¸¸é ´ÙÀ½ ½ºÅÜÀ¸·Î ÁøÇàÇÑ´Ù. if (tCurrentTime > tNextEvent) m_cStepIndex++; } void CDNGuildWarManager::FinalStep() { Clear(); //ResetStep(); } bool CDNGuildWarManager::RegisterScheduleGroup(short wScheduleID, const TGuildWarEventInfo vEventInfo[]) { ResetStep(); time_t tCheckPeriod = 0; time_t tBeginTime = 0; time_t tEndTime = 0; for (char i=GUILDWAR_STEP_PREPARATION; i= tEndTime) { ResetStep(); // ¿¬¼ÓµÈ ±â°£ÀÌ ¾Æ´Ï¶ó¸é ¿¡·¯Ã³¸®ÇÏ°í ¸®¼Â! g_Log.Log(LogType::_FILELOG, L"CDNGuildWarManager::RegisterScheduleGroup Failed !!! Wrong Time Schedule Begin(%d) End(%d) Check(%d)\n", tBeginTime, tEndTime, tCheckPeriod); return false; } m_pWarEventStep[cStep]->UpdateTime(wScheduleID, tBeginTime, tEndTime, m_wWinersWeightRate); // ¸¶Áö¸· ½Ã°£À» ÀúÀåÇØ¼­ ´ÙÀ½ ±â°£¿¡ ´ëÇÑ °Ë»çÁ¶°ÇÀ¸·Î »ç¿ëÇÑ´Ù. tCheckPeriod = tEndTime; } m_wScheduleID = wScheduleID; g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] RegisterScheduleGroup Success ScheduleID:%d!!!\n", wScheduleID); return true; } bool CDNGuildWarManager::UpdateScheduleGroup(short wScheduleID, const TGuildWarEventInfo vEventInfo[]) { time_t tCurrentTime; time(&tCurrentTime); // ÇöÀç½Ã°£ // µ¥ÀÌÅÍ»óÀÇ ÇöÀç ½ºÅÜ char cStepIndex = GUILDWAR_STEP_NONE; time_t tCheckPeriod = 0; time_t tBeginTime = 0; time_t tEndTime = 0; // º»¼± ÁøÇàÁßÀ϶§´Â ½ºÄÉÁì ¾÷µ¥ÀÌÆ® ÇÏÁö¸»ÀÚ..ÀÌ·³ Hell µÉ°Í °°À½. if( m_cStepIndex == GUILDWAR_STEP_REWARD ) { g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] UpdateScheduleGroup Failed !!! Already Reward Step On\n"); return false; } // µ¥ÀÌÅÍ Ã¼Å© for (char i=GUILDWAR_STEP_PREPARATION; i= tEndTime) { g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] UpdateScheduleGroup Failed !!! Wrong Time Schedule Begin(%d) End(%d) Check(%d)\n", tBeginTime, tEndTime, tCheckPeriod); return false; } // µ¥ÀÌÅÍ»ó ÇöÀç ½ºÅÜÀ» ±¸ÇÑ´Ù. if (tCurrentTime > tBeginTime && tCurrentTime < tEndTime) cStepIndex = i; // ¸¶Áö¸· ½Ã°£À» ÀúÀåÇØ¼­ ´ÙÀ½ ±â°£¿¡ ´ëÇÑ °Ë»çÁ¶°ÇÀ¸·Î »ç¿ëÇÑ´Ù. tCheckPeriod = tEndTime; } // ÇöÀç ½ºÅܰú ¸ÂÁö ¾ÊÀ¸¸é ¿¡·¯Ã³¸® if (m_cStepIndex != cStepIndex) { g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] UpdateScheduleGroup Failed !!! Wrong Step Index[%d]<->[%d]\n", m_cStepIndex, cStepIndex); return false; } // µ¥ÀÌÅÍ ÀÔ·Â for (char i=GUILDWAR_STEP_PREPARATION; iUpdateTime(wScheduleID, tBeginTime, tEndTime, m_wWinersWeightRate); else { _DANGER_POINT(); // À§¿¡¼­ Çѹø üũÇߴµ¥ ŸÀÔüũ ½ÇÆÐÇÏ¸é ¸»ÀÌ ¾ÈµÊ! return false; } } g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] UpdateScheduleGroup Success ScheduleID:%d!!!\n", wScheduleID); return true; } void CDNGuildWarManager::CalcTeamSecret() { // ºí·ç : 1 // ·¹µå : 2 if (m_nBlueTeamPoint == m_nRedTeamPoint) { m_cSecretTeam = 0; return; } BYTE cTeamCode = 0; float fSecretRate = 0.0f; if (m_nBlueTeamPoint > m_nRedTeamPoint) { fSecretRate = (float)m_nRedTeamPoint / (float)m_nBlueTeamPoint; cTeamCode = 2; // ·¹µåÆÀ ÇýÅà } else { fSecretRate = (float)m_nBlueTeamPoint / (float)m_nRedTeamPoint; cTeamCode = 1; // ºí·çÆÀ ÇýÅà } if (fSecretRate < 0) { DN_ASSERT( false, "fSecretRate < 0" ); return; } fSecretRate = 1.0f - fSecretRate; float nSecretStartRate = GUILDWAR_SECRET_SATRT_RATE; float nSecretEndRate = GUILDWAR_SECRET_END_RATE; time_t tCurrentTime; time(&tCurrentTime); time_t tStartTime = m_pWarEventStep[GUILDWAR_STEP_TRIAL]->GetEventTime(GUILDWAR_EVENT_START); time_t tEndTime = m_pWarEventStep[GUILDWAR_STEP_TRIAL]->GetEventTime(GUILDWAR_EVENT_END); //¿¹¼± Á¾·á ½Ã°£ ¸ÕÀú üũ if( tEndTime - tCurrentTime <= GUILDWAR_SECRET_TERM_SECOND ) // 24½Ã°£ ÀÌÇÏ·Î ³²¾ÒÀ¸¸é ºñÀ²À» ¹ÝÀ¸·Î ÁÙÀÓ { nSecretStartRate = nSecretStartRate*0.5f; nSecretEndRate = nSecretEndRate*0.5f; } else if( tCurrentTime - tStartTime < GUILDWAR_SECRET_TERM_SECOND ) // ½ÃÀÛµÈÁö 24½Ã°£ ¾È Áö³µÀ¸¸é ½ÃÅ©¸´ ¹ßµ¿ ¾ÈµÊ. return; if (fSecretRate >= nSecretStartRate) { if (m_cSecretTeam != cTeamCode) { m_cSecretTeam = cTeamCode; // Àû¿ë CMtRandom rand; rand.srand( timeGetTime() ); m_nSecretRandomSeed = rand.rand(); MASetGuildWarSecretMission packet = {0,}; packet.cTeamCode = m_cSecretTeam; packet.nRandomSeed = m_nSecretRandomSeed; g_pDivisionManager->SendSetGuildWarSecretMission(&packet); g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] SecretStart Seed:%d, Team:%d, Rate:%f!!!\n", packet.nRandomSeed, packet.cTeamCode, fSecretRate ); } } else if (fSecretRate <= nSecretEndRate && m_cSecretTeam != 0) { m_cSecretTeam = 0; // ÇØÁ¦ MASetGuildWarSecretMission packet = {0,}; packet.cTeamCode = m_cSecretTeam; packet.nRandomSeed = -1; g_pDivisionManager->SendSetGuildWarSecretMission(&packet); g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] SecretEnd Rate:%f!!!\n", fSecretRate ); } }