DragonNest/Server/DNMasterServer/DNGuildWarManager.cpp

1223 lines
42 KiB
C++
Raw Permalink Normal View History

#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()
{
// <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
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; j<GUILDWAR_STEP_END; j++)
if (pWarEventStep[j]) SAFE_DELETE(pWarEventStep[j])
}
bool CDNGuildWarManager::LoadScheduleInfo(const VIMASetGuildWarSchedule* pData)
{
// <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>Ѵ<EFBFBD>
time_t tCurrentTime;
time(&tCurrentTime);
if (pData->bForce)
{
m_bWarEvent = false;
m_bCheatFlag = true;
}
if (!pData->bForce && tCurrentTime > pData->EventInfo[GUILDWAR_STEP_REWARD].tEndTime)
{
// <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD>̰ų<CCB0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵȰ<C8B5><C8B0><EFBFBD>
//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)
// <20><><EFBFBD>⼭ Ȥ<><C8A4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20>ȳѾ<C8B3><D1BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
if( pData->tRewardExpireDate > 0 && !GetPreWinGuild().IsSet() )
{
__time64_t tCurrentTime;
time(&tCurrentTime);
if( tCurrentTime < pData->tRewardExpireDate )
{
m_tRewardExpireDate = pData->tRewardExpireDate;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><E2B0A3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>±<EFBFBD><C2B1><EFBFBD> <20>̾ƿ<CCBE><C6BF><EFBFBD>
m_eSettingStep = REQ_PRE_WIN;
SendGuildWarInfoReq(); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û
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 )
{
// <20><><EFBFBD><20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD>³<EFBFBD><C2B3><EFBFBD> <20>ʱ<EFBFBD>ȭ <20><><EFBFBD><EFBFBD>
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));
// <20>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD>
if (m_bWarEvent)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
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 // <20>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD> <20>ű<EFBFBD> <20><><EFBFBD><EFBFBD>
{
bResult = RegisterScheduleGroup(pData->wScheduleID, pData->EventInfo);
}
if (bResult)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ϵ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>.
m_wScheduleID = pData->wScheduleID;
m_eSettingStep = REQ_FINAL_SCHEDULE;
SendGuildWarInfoReq(); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û
SetFinalProgress(pData->bFinalProgress);
return true;
}
return false;
}
bool CDNGuildWarManager::LoadFinalScheduleInfo(MASetGuildWarFinalSchedule* pData)
{
__time64_t tCurrentTime;
time(&tCurrentTime);
//////////////////////////////////////////////////////////////////////////////////////////////////
__time64_t tCheckPeriod = 0;
// <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>õǾ<C3B5> <20>ִ<EFBFBD><D6B4><EFBFBD> üũ..
// <20><> <20>ð<EFBFBD>üũ
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);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ƶ<EFBFBD>..
StartStep();
// <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>
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) // <20><> ó<><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϸ<C6B4>.
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϰų<CFB0> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
m_eSettingStep = REQ_PRE_WIN;
SendGuildWarInfoReq();
return true;
}
else if( m_cStepIndex == GUILDWAR_STEP_TRIAL || m_cStepIndex == GUILDWAR_STEP_REWARD )
{
// <20><><EFBFBD><EFBFBD><EFBFBD>̰ų<CCB0> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> û<><C3BB>, ȫ<><C8AB> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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()
{
// <20>ݷμ<DDB7><CEBC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û
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(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û
m_eSettingStep = REQ_SCHEDULE;
}
break;
case REQ_FINAL_SCHEDULE :
{
pVillageConnection->SendGetGuildWarFinalSchedule(m_wScheduleID); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û
}
break;
case REQ_PRE_WIN :
{
pVillageConnection->SendGetGuildWarPreWinGuild(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
break;
case REQ_TEAM_POINT :
{
pVillageConnection->SendGetGuildWarPoint(); // û<><C3BB>, ȫ<><C8AB> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
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 )
{
// <20><><EFBFBD><EFBFBD><EFBFBD>̰ų<CCB0> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20><><EFBFBD≯<EFBFBD> û<><C3BB>, ȫ<><C8AB> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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<GUILDWAR_TOURNAMENT_GROUP_MAX; ++i)
{
if( m_bTournamentGroup[i].ATeam.nTeamNum > 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)
{
// <20>ڸ<EFBFBD><DAB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴٿ<CFB4>...<2E>ڼ<EFBFBD><DABC>Ѱ<EFBFBD> [DN]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_<EFBFBD><5F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǥ<EFBFBD><C7A5>ġ_1_.pptx <20><><EFBFBD><EFBFBD>
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; i<pData->nCount; ++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; i<GUILDWAR_TOURNAMENT_GROUP_MAX; ++i )
{
if( Groups[i].ATeam.nTeamNum )
{
//m_bTournamentGroup[i].ATeam.nTeamNum = (i*2)+1;
//m_bTournamentGroup[i].ATeam.nOpeningPoint = pData->nTotalPoint[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;
// <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
MAChangeGuildInfo ChangeGuildInfo;
memset(&ChangeGuildInfo, 0, sizeof(ChangeGuildInfo));
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ƚ<><C8BD><20>߰<EFBFBD>~~
ChangeGuildInfo.btGuildUpdate = GUILDUPDATE_TYPE_GUILDWAR;
ChangeGuildInfo.Int1 = 1;
for(int i=0; i<GUILDWAR_FINALS_TEAM_MAX; ++i)
{
if( !m_GuildWarFinalInfo[i].GuildUID.IsSet() )
continue;
ChangeGuildInfo.GuildUID = m_GuildWarFinalInfo[i].GuildUID;
g_pDivisionManager->SendChangeGuildInfo(&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 Ȯ<><C8AE>
if ( m_bResetSchedule )
{
if( g_pGuildWarManager->GetFinalProgress() && g_pGuildWarManager->GetFinalStart() )
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD>..<2E>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..
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(); // <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ<EFBFBD>ϰ<EFBFBD>
SendGuildWarInfoReq(); // <20>ٽ<EFBFBD> ÷<><C3B7><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD>
return;
}
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD>õǾ<C3B5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>޵ƴ<DEB5><C6B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..<2E>뷫 1<><31> <20><><EFBFBD><EFBFBD> <20>ѹ<EFBFBD><D1B9><EFBFBD>..
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)) ) // Ȱ<><C8B0>ȭ <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>°ų<C2B0> Ÿ<>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD≯<EFBFBD>
{
SendGuildWarInfoReq();
return;
}
// <20><><EFBFBD>±<EFBFBD><C2B1><EFBFBD> <20><><EFBFBD><EFBFBD>..<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>
if( m_PreWinGuildUID.IsSet() && m_bFinalWinGuild && m_tRewardExpireDate > 0 )
{
__time64_t tCurrentTime;
time(&tCurrentTime);
if( tCurrentTime > m_tRewardExpireDate )
{
// <20><><EFBFBD>±<EFBFBD><C2B1><EFBFBD> <20><><EFBFBD><EFBFBD>
MAGuildWarPreWinGuild pPacket;
memset(&pPacket, 0, sizeof(MAGuildWarPreWinGuild));
pPacket.GuildUID = GetPreWinGuild();
pPacket.bPreWin = false;
g_pDivisionManager->SendSetGuildWarPreWinGuild(&pPacket); // <20><>ü <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>뺸.
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)
{
// <20>ش<EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE>ü<EFBFBD><C3BC> ȣ<><C8A3><EFBFBD>Ͽ<EFBFBD> ó<><C3B3>!
pCurrentEvent->Process();
// <20><><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (pCurrentEvent->IsFinishPeriod())
NextStep();
}
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD>..
if( GetFinalProgress() )
{
CDNVillageConnection* pVillageCon = g_pDivisionManager->GetVillageConnectionByVillageID( g_pDivisionManager->GetPvPLobbyVillageID() );
if( pVillageCon == NULL || pVillageCon->GetActive() == false )
return; //<2F>̰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>?
// <20><><EFBFBD><EFBFBD><EFBFBD>̰<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֵ<EFBFBD><D6B5><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20>Ǹ<EFBFBD> <20><>ŸƮ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
CDNPvP* pPvP = NULL;
VIMAPVP_START Packet;
memset(&Packet, 0, sizeof(Packet));
Packet.sCSPVP_START.unCheck = PvPCommon::Check::AllCheck;
for( int i=0; i<GUILDWAR_TOURNAMENT_GROUP_MAX; ++i )
{
if( m_bTournamentGroup[i].ATeam.nTeamNum && m_bTournamentGroup[i].BTeam.nTeamNum
&& m_bTournamentGroup[i].unPvPIndex && m_bTournamentGroup[i].dwStartTick > 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)
{
// ī<><C4AB>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.<2E>Ф<EFBFBD>
int nCount = 0;
for( int i=0; i<GUILDWAR_FINALS_TEAM_MAX; ++i)
{
if( pGuildTournamentInfo[i].GuildUID.IsSet() )
++nCount;
}
if( nCount > 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<GUILDWAR_TOURNAMENT_GROUP_MAX; ++i)
{
if( m_bTournamentGroup[i].ATeam.nTeamNum > 0 && m_bTournamentGroup[i].BTeam.nTeamNum > 0)
{
BYTE ATeamIndex = m_bTournamentGroup[i].ATeam.nTeamNum-1;
BYTE BTeamIndex = m_bTournamentGroup[i].BTeam.nTeamNum-1;
// <20>Ѵ<EFBFBD> <20><> <20><><EFBFBD>·<EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
if( ATeamIndex < GUILDWAR_FINALS_TEAM_MAX && BTeamIndex < GUILDWAR_FINALS_TEAM_MAX
&& !m_GuildWarFinalInfo[ATeamIndex].bWin && !m_GuildWarFinalInfo[BTeamIndex].bWin )
{
// <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
CalcGuildWarTournamentWin(i);
}
}
}
}
void CDNGuildWarManager::SetGuildWarTournamentGroup()
{
memset(m_bTournamentGroup, 0, sizeof(m_bTournamentGroup));
char cCurFinalPart = GetCurFinalPart();
int nCount = 0;
int nDefaultWinMax = 0;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>dzʶ<C7B3><CAB6><EFBFBD>
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; ++i )
{
if( !m_GuildWarFinalInfo[i].GuildUID.IsSet() )
continue;
if( m_GuildWarFinalInfo[i].cMatchTypeCode != GUILDWAR_FINALPART_NONE && m_GuildWarFinalInfo[i].bWin == false )
continue;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ŵ..
if( m_GuildWarFinalInfo[i].cMatchTypeCode == GUILDWAR_FINALPART_FINAL && m_GuildWarFinalInfo[i].bWin == true)
continue;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if( m_GuildWarFinalInfo[i].cMatchTypeCode != GUILDWAR_FINALPART_NONE && m_GuildWarFinalInfo[i].cMatchTypeCode != cCurFinalPart+1)
continue;
if( m_bTournamentGroup[nCount].ATeam.nTeamNum == 0)
{
m_bTournamentGroup[nCount].ATeam.nTeamNum = i+1;
m_bTournamentGroup[nCount].ATeam.nOpeningPoint = m_GuildWarOpeningPoints[i];
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ..<2E><> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..<2E>Ф<EFBFBD>
bool bDefaltWin = true;
for( int j=1; j<= nDefaultWinMax; ++j )
{
if( i+j >= 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;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
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);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
void CDNGuildWarManager::GuildWarCreateRoom()
{
CDNVillageConnection* pVillageCon = g_pDivisionManager->GetVillageConnectionByVillageID( g_pDivisionManager->GetPvPLobbyVillageID() );
if( pVillageCon == NULL || pVillageCon->GetActive() == false )
return; //<2F>̰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>?
CTimeSet CurTime;
CurTime.GetMonth();
// MapID <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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<49><44> PvPMapTable <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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<6C><65><EFBFBD><EFBFBD> GameMode <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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; i<GUILDWAR_FINALS_TEAM_MAX/2; ++i)
{
if( m_bTournamentGroup[i].ATeam.nTeamNum )
{
if( m_bTournamentGroup[i].BTeam.nTeamNum == 0)
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>..DB<44><42><EFBFBD><EFBFBD> <20>ؾ<EFBFBD><D8BE><EFBFBD>..
SetGuildTournamentInfoWin(m_bTournamentGroup[i].ATeam.nTeamNum-1, true); //<2F>̱<EFBFBD><CCB1>ɷ<EFBFBD> ǥ<><C7A5>
SendSetGuildWarFinalResult(m_bTournamentGroup[i].ATeam.nTeamNum-1);
pVillageCon->SendSetGuildWarFinalResultDB(m_wScheduleID, m_bTournamentGroup[i].ATeam.nTeamNum, m_GuildWarFinalInfo[m_bTournamentGroup[i].ATeam.nTeamNum-1].GuildUID.nDBID, GetCurFinalPart(), true);
}
else
{
// <20><><EFBFBD><20><EFBFBD><E6B8B8><EFBFBD><EFBFBD>..
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]; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD> <20><><EFBFBD><EFBFBD> <20>𸣰ڴ<F0B8A3B0>.
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); // <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
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; i<GUILDWAR_FINALS_TEAM_MAX; ++i)
{
if( !m_GuildWarFinalInfo[i].GuildUID.IsSet() )
continue;
if( m_GuildWarFinalInfo[i].GuildUID.nDBID == pGuildWarResult->nWinGuildDBID )
{
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);
//<2F><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20><><EFBFBD>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>~
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;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD>..
if( m_GuildWarFinalInfo[cIndex].cMatchTypeCode == GUILDWAR_FINALPART_FINAL && bWin )
{
// <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
MAChangeGuildInfo ChangeGuildInfo;
memset(&ChangeGuildInfo, 0, sizeof(ChangeGuildInfo));
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ƚ<><C8BD><20>߰<EFBFBD>~~
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; i<pData->nCount; ++i)
{
for( int j=0; j<GUILDWAR_FINALS_TEAM_MAX; ++j)
{
if( pData->GuidUID[i] == m_GuildWarFinalInfo[j].GuildUID )
{
m_GuildWarOpeningPoints[j] = pData->nTotalPoint[i];
break;
}
}
}
}
void CDNGuildWarManager::SetGuildWarTournamentPoint(GAMAPvPGuildWarScore* pGuildWarPoint)
{
for( int i=0; i<GUILDWAR_TOURNAMENT_GROUP_MAX; ++i )
{
if( m_bTournamentGroup[i].ATeam.nTeamNum
&& m_GuildWarFinalInfo[m_bTournamentGroup[i].ATeam.nTeamNum-1].GuildUID.nDBID == pGuildWarPoint->nGuildDBID)
{
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;
}
// <20><><EFBFBD><EFBFBD> <20>ǻ<EFBFBD><C7BB><EFBFBD><EFBFBD>ų<EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD> ƨ<><C6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>ٶ<EFBFBD>..
void CDNGuildWarManager::SetDropTournament(UINT unPvPIndex)
{
for( int i=0; i<GUILDWAR_TOURNAMENT_GROUP_MAX; ++i )
{
if( m_bTournamentGroup[i].unPvPIndex == unPvPIndex )
{
CalcGuildWarTournamentWin(i);
break;
}
}
}
void CDNGuildWarManager::CalcGuildWarTournamentWin(BYTE cGroupIndex)
{
if( cGroupIndex >= GUILDWAR_TOURNAMENT_GROUP_MAX)
return;
char cWinGuildIndex = -1, cLoseGuildIndex = -1;
// <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
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;
}
// <20>ȵǸ<C8B5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
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
{
//<2F>̰<EFBFBD> <20><><EFBFBD>̴<EFBFBD>..<2E><><EFBFBD><EFBFBD>..
cWinGuildIndex = m_bTournamentGroup[cGroupIndex].ATeam.nTeamNum-1;
cLoseGuildIndex = m_bTournamentGroup[cGroupIndex].BTeam.nTeamNum-1;
}
char cMatchTypeCode = m_GuildWarFinalInfo[cWinGuildIndex].cMatchTypeCode;
SetGuildTournamentInfoWin(cWinGuildIndex, true); //<2F>̱<EFBFBD><CCB1>ɷ<EFBFBD> ǥ<><C7A5>
SetGuildTournamentInfoWin(cLoseGuildIndex, false); //<2F><><EFBFBD>ɷ<EFBFBD> ǥ<><C7A5>
SendSetGuildWarFinalResult(cWinGuildIndex, cLoseGuildIndex); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ְ<EFBFBD>..
SendSetGuildWarTournamentWin(cWinGuildIndex, cMatchTypeCode); // <20>¸<EFBFBD> <20><><EFBFBD><EFBFBD> <20>˸<EFBFBD>.
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
//CDNVillageConnection* pVillage = g_pDivisionManager->GetFirstEnableVillageServer();
CDNVillageConnection* pVillage = g_pDivisionManager->GetVillageConnectionByVillageID( g_pDivisionManager->GetPvPLobbyVillageID() );
if( pVillage )
{
//<2F>̱<EFBFBD><CCB1><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD> DB<44><42> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
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
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ְ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD>.<2E>Ф<EFBFBD>
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);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20><><EFBFBD>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>~
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()
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID<49><44><EFBFBD><EFBFBD>
m_wScheduleID = GUILDWARSCHEDULE_DEF;
// <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
m_cStepIndex = GUILDWAR_STEP_NONE;
m_bWarEvent = false;
for (int i=GUILDWAR_STEP_NONE; i<GUILDWAR_STEP_END; i++)
{
if (m_pWarEventStep[i])
m_pWarEventStep[i]->Reset();
}
}
void CDNGuildWarManager::StartStep()
{
m_bWarEvent = true;
m_cStepIndex = GUILDWAR_STEP_PREPARATION;
// <20><><EFBFBD><EFBFBD> <20><20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
for( int i=GUILDWAR_STEP_PREPARATION; i<GUILDWAR_STEP_END; ++i)
{
CDNGuildWar** pWarEventStep = m_pWarEventStep;
if (!pWarEventStep[i])
return;
// <20>ش<EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE>ü<EFBFBD><C3BC> ȣ<><C8A3><EFBFBD>Ͽ<EFBFBD> ó<><C3B3>!
pWarEventStep[i]->Process();
// <20><><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (pWarEventStep[i]->IsFinishPeriod())
NextStep();
}
}
void CDNGuildWarManager::NextStep()
{
// Ȥ<><C8A4> <20>𸣴<EFBFBD> Ÿ<><C5B8>üũ <20>ѹ<EFBFBD><D1B9><EFBFBD>!
if (!CheckStep(m_cStepIndex))
return;
char cNextStepIndex = m_cStepIndex + 1;
if (cNextStepIndex >= GUILDWAR_STEP_END)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
FinalStep();
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>~
m_eSettingStep = REQ_SCHEDULE;
SendGuildWarInfoReq();
return;
}
time_t tNextEvent = m_pWarEventStep[cNextStepIndex]->GetEventTime (GUILDWAR_EVENT_START);
time_t tCurrentTime;
time(&tCurrentTime);
// <20><><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
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<GUILDWAR_STEP_END; i++)
{
char cStep = i;
// Ÿ<><C5B8>üũ
if (!CheckStep(cStep))
{
g_Log.Log(LogType::_FILELOG, L"CDNGuildWarManager::RegisterScheduleGroup Failed !!! Wrong Step Type (%d)\n", cStep);
return false;
}
tBeginTime = vEventInfo[i].tBeginTime;
tEndTime = vEventInfo[i].tEndTime;
// <20>ð<EFBFBD>üũ
if (tBeginTime < tCheckPeriod || tEndTime < tCheckPeriod || tBeginTime >= tEndTime)
{
ResetStep(); // <20><><EFBFBD>ӵ<EFBFBD> <20><EFBFBD><E2B0A3> <20>ƴ϶<C6B4><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD>!
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);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><E2B0A3> <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
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); // <20><><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
char cStepIndex = GUILDWAR_STEP_NONE;
time_t tCheckPeriod = 0;
time_t tBeginTime = 0;
time_t tEndTime = 0;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..<2E>̷<EFBFBD> Hell <20>ɰ<EFBFBD> <20><><EFBFBD><EFBFBD>.
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;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ
for (char i=GUILDWAR_STEP_PREPARATION; i<GUILDWAR_STEP_END; i++)
{
char cStep = i;
// Ÿ<><C5B8>üũ
if (!CheckStep(cStep))
{
g_Log.Log(LogType::_GUILDWAR, g_Config.nWorldSetID, 0, 0, 0, L"[GUILDWAR] UpdateScheduleGroup Failed !!! Wrong Step Type (%d)\n", cStep);
return false;
}
tBeginTime = vEventInfo[i].tBeginTime;
tEndTime = vEventInfo[i].tEndTime;
// <20>ð<EFBFBD>üũ
if (tBeginTime < tCheckPeriod || tEndTime < tCheckPeriod || tBeginTime >= 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;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>.
if (tCurrentTime > tBeginTime && tCurrentTime < tEndTime)
cStepIndex = i;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><E2B0A3> <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
tCheckPeriod = tEndTime;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ܰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3>
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;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Է<EFBFBD>
for (char i=GUILDWAR_STEP_PREPARATION; i<GUILDWAR_STEP_END; i++)
{
char cStep = i;
tBeginTime = vEventInfo[i].tBeginTime;
tEndTime = vEventInfo[i].tEndTime;
if (CheckStep(cStep))
m_pWarEventStep[cStep]->UpdateTime(wScheduleID, tBeginTime, tEndTime, m_wWinersWeightRate);
else
{
_DANGER_POINT(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѹ<EFBFBD> üũ<C3BC>ߴµ<DFB4> Ÿ<><C5B8>üũ <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ȵ<EFBFBD>!
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()
{
// <20><><EFBFBD><EFBFBD> : 1
// <20><><EFBFBD><EFBFBD> : 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; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
}
else
{
fSecretRate = (float)m_nBlueTeamPoint / (float)m_nRedTeamPoint;
cTeamCode = 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
}
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);
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> üũ
if( tEndTime - tCurrentTime <= GUILDWAR_SECRET_TERM_SECOND ) // 24<32>ð<EFBFBD> <20><><EFBFBD>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
nSecretStartRate = nSecretStartRate*0.5f;
nSecretEndRate = nSecretEndRate*0.5f;
}
else if( tCurrentTime - tStartTime < GUILDWAR_SECRET_TERM_SECOND ) // <20><><EFBFBD>۵<EFBFBD><DBB5><EFBFBD> 24<32>ð<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9> <20>ߵ<EFBFBD> <20>ȵ<EFBFBD>.
return;
if (fSecretRate >= nSecretStartRate)
{
if (m_cSecretTeam != cTeamCode)
{
m_cSecretTeam = cTeamCode; // <20><><EFBFBD><EFBFBD>
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; // <20><><EFBFBD><EFBFBD>
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 );
}
}