DragonNest/Server/ServerCommon/DNPeriodQuestSystem.cpp
2024-12-19 09:48:26 +08:00

898 lines
No EOL
23 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "StdAfx.h"
#include "DNPeriodQuestSystem.h"
#include "DNQuestManager.h"
#include "DNSchedule.h"
#include "DNEvent.h"
#include "Util.h"
#include "DNDBConnectionManager.h"
#include "DNDBConnection.h"
#include "DNGameDataManager.h"
#if defined(_VILLAGESERVER)
#include "DNUserSessionManager.h"
#include "DNMasterConnection.h"
#elif defined(_GAMESERVER)
#include "DNRUDPGameServer.h"
#include "DNGameServerManager.h"
#include "DNMasterConnectionManager.h"
#endif
CDNPeriodQuestSystem * g_pPeriodQuestSystem = NULL;
//////////////////////////////////////////////////////////////////////////
// CDNPeriodQuest
//////////////////////////////////////////////////////////////////////////
CDNPeriodQuest::CDNPeriodQuest()
{
Init();
}
CDNPeriodQuest::~CDNPeriodQuest()
{
m_vecQuestIDs.clear();
}
void CDNPeriodQuest::Init()
{
memset(m_EventTime, 0, sizeof(m_EventTime));
memset(m_EventComplete, 0, sizeof(m_EventComplete));
m_bActivate = true;
m_bOnEvent = false;
m_vecQuestIDs.clear();
m_nScheduleID = 0;
m_nSelectCount = 0;
}
void CDNPeriodQuest::Set(int nItemID, int nType, time_t tStartDate, time_t tEndDate, int nScheduleID, int nSelectCount)
{
m_nItemID = nItemID;
m_nType = nType;
m_EventTime[PERIODQUEST_TIME_START] = tStartDate;
m_EventTime[PERIODQUEST_TIME_END] = tEndDate;
m_nScheduleID = nScheduleID;
m_nSelectCount = nSelectCount;
}
void CDNPeriodQuest::AddQuestID(int nQuestID)
{
m_vecQuestIDs.push_back(nQuestID);
}
bool CDNPeriodQuest::CanAcceptDate() const
{
__time64_t tCurrentDate = CTimeSet().GetTimeT64_LC();
// ³¯Â¥ È®ÀÎ
if( m_EventTime[PERIODQUEST_TIME_START] <= tCurrentDate &&
tCurrentDate <= m_EventTime[PERIODQUEST_TIME_END] ||
m_EventTime[PERIODQUEST_TIME_START] == m_EventTime[PERIODQUEST_TIME_END])
return true;
return false;
}
int CDNPeriodQuest::SelectQuestID(int nKey) const
{
if(nKey <= 0)
nKey = 1;
size_t nCount = m_vecQuestIDs.size();
if( nCount <= 0 )
return 0;
UINT nIndex = nKey %(UINT)nCount;
return m_vecQuestIDs[nIndex];
}
bool CDNPeriodQuest::CheckSelectedQuestID( int nKey, int nSelectedID, UINT uiOffset ) const
{
size_t nCount = m_vecQuestIDs.size();
if( nCount <= 0 )
return false;
if(nKey <= 0)
nKey = 1;
UINT uiIndex = nKey %(UINT)nCount;
if( m_vecQuestIDs[uiIndex] == nSelectedID )
return true;
if( uiIndex < uiOffset && uiOffset < uiIndex + m_nSelectCount )
return true;
if( uiIndex + m_nSelectCount > nCount && uiOffset < uiIndex + m_nSelectCount - nCount )
return true;
return false;
}
//////////////////////////////////////////////////////////////////////////
// CDNPeriodQuestSystem
//////////////////////////////////////////////////////////////////////////
CDNPeriodQuestSystem::CDNPeriodQuestSystem()
{
memset(m_nKeys, 0x00, sizeof(m_nKeys));
RefreshQuestKey(PERIODQUEST_RESET_MAX);
m_TickCheckQuest = 0;
m_nWorldQuestIndex = 0;
m_nPeriodQuestCount = 0;
m_nResetHour = 4;
DNTableFileFormat *pSox = GetDNTable(CDnTableDB::TSCHEDULE );
if(pSox)
m_nResetHour = pSox->GetFieldFromLablePtr(CDNSchedule::AlarmResetDailyMission + 1, "_Hour")->GetInteger();
for(MWorldQuestItor itor = m_mWorldEventQuest.begin(); itor != m_mWorldEventQuest.end(); itor++)
(*itor).second.clear();
m_mWorldEventQuest.clear();
m_bInitFlag = false;
}
CDNPeriodQuestSystem::~CDNPeriodQuestSystem()
{
}
bool CDNPeriodQuestSystem::Initialize()
{
DNTableFileFormat* pSox = GetDNTable(CDnTableDB::TQUESTPERIOD);
if(!pSox)
{
g_Log.Log( LogType::_FILELOG, L"QuestDailyTable.ext failed\r\n");
return false;
}
int nItemID;
int nType;
int nScheuldeID;
char * pszQuestIDs;
char * pszCompleteDate;
int nSelectCount;
for( int i=0; i<pSox->GetItemCount(); i++ )
{
CDNPeriodQuest PeriodQuest;
nItemID = pSox->GetItemID(i);
nType = pSox->GetFieldFromLablePtr( nItemID, "_DailyQuestType" )->GetInteger();
nScheuldeID = pSox->GetFieldFromLablePtr( nItemID, "_ScheduleID" )->GetInteger();
pszQuestIDs = pSox->GetFieldFromLablePtr( nItemID, "_RandomQuestID" )->GetString();
pszCompleteDate = pSox->GetFieldFromLablePtr( nItemID, "_CompleteDate" )->GetString();
nSelectCount = pSox->GetFieldFromLablePtr( nItemID, "_SelectCount" )->GetInteger();
if(!IsValidType(nType))
{
g_Log.Log(LogType::_FILEDBLOG, L"questdailytable.ext InvalidType(_DailyQuestType)[%d][ScheduleID:%d]\r\n", nType, nScheuldeID);
return false;
}
std::vector<string> vQuestIDs;
std::vector<string> vCompleteDate;
TokenizeA(pszQuestIDs, vQuestIDs, ":");
TokenizeA(pszCompleteDate, vCompleteDate, ":");
if(vQuestIDs.size() <= 0)
{
g_Log.Log(LogType::_FILEDBLOG, L"questdailytable.ext InvalidID(_RandomQuestID) [ScheduleID:%d \r\n", nScheuldeID);
return false;
}
if(!RegisterBaseQuest(nItemID, nType, vQuestIDs, vCompleteDate, nScheuldeID, nSelectCount))
return false;
}
return true;
}
void CDNPeriodQuestSystem::BuildCompletedPeriodQuests(CDNUserQuest* pQuest)
{
for each (int questID in m_PeriodQuestIDs)
{
if (pQuest->IsClearQuest(questID))
pQuest->AddCompletedPeriodQuest(questID);
}
}
void CDNPeriodQuestSystem::GetResetQuestList(CDNUserQuest* pQuest, int nType, std::vector<int>& vOutQuestList)
{
if(!IsValidType(nType))
return;
for each(int questID in m_vQuestIDs[nType])
{
if(pQuest->HasQuest(questID) != -2)
{
vOutQuestList.push_back(questID);
continue;
}
if(pQuest->IsCompletedPeriodQuest(questID))
{
vOutQuestList.push_back(questID);
pQuest->RemoveCompletedPeriodQuest (questID);
continue;
}
}
}
// ¼±ÅÃµÈ Äù½ºÆ®¸¦ Á¦¿ÜÇÑ ³ª¸ÓÁö ¸ðµÎ ¸¶Å·ÇÑ´Ù.
void CDNPeriodQuestSystem::MarkingSelectQuest(CDNUserQuest* pQuest)
{
RefreshQuestKey(PERIODQUEST_RESET_MAX);
for each(const CDNPeriodQuest& periodQuest in m_vBaseQuest)
{
int nType = periodQuest.GetType();
int nSelectedID = periodQuest.SelectQuestID(m_nKeys[nType]);
if(nSelectedID <= 0)
continue;
bool bCanAcceptDate = periodQuest.CanAcceptDate();
bool bActivate = periodQuest.GetActivate();
const std::vector<int>& periodQuestIDs = periodQuest.GetQuestIDs();
for( UINT i = 0 ; i < periodQuestIDs.size() ; ++ i )
{
int questID = periodQuestIDs[i];
if( bCanAcceptDate && bActivate && periodQuest.CheckSelectedQuestID( m_nKeys[nType], questID, i ) )
continue;
if(nType == PERIODQUEST_RESET_EVENT || nType == PERIODQUEST_RESET_WORLD)
pQuest->OnPeriodEvent(questID, true);
else
pQuest->SetCompleteQuestFlag(questID, true);
}
}
}
// À̺¥Æ® Äù½ºÆ® ¸¶Å·Ã³¸®
void CDNPeriodQuestSystem::RefreshEventQuest(CDNUserQuest* pQuest, int nCount, const TCompleteEventQuest* pEventQuest)
{
RefreshQuestKey(PERIODQUEST_RESET_MAX);
for each(const CDNPeriodQuest& periodQuest in m_vBaseQuest)
{
int nType = periodQuest.GetType();
int nSelectedID = periodQuest.SelectQuestID(m_nKeys[nType]);
if(nSelectedID <= 0)
continue;
if(nType == PERIODQUEST_RESET_EVENT || nType == PERIODQUEST_RESET_WORLD)
{
// Åë°ú
}
else
continue;
// ¿Ï·áÇÑ Äù½ºÆ®ÀÎ °æ¿ì ¸¶Å·ÀÔ·Â
bool bComplete = false;
for(int i=0; i<nCount; i++)
{
if(pEventQuest[i].nScheduleID == periodQuest.GetScheduleID())
{
bComplete = true;
break;
}
}
// ¿Ï·áÇÏÁö ¾Ê°í ÇöÀç ÁøÇàÁßÀÎ Äù½ºÆ®´Â ¸¶Å·ÇØÁ¦
bool bMarking = false;
if(!bComplete)
{
if(!periodQuest.CanAcceptDate())
continue;
}
else
bMarking = true;
// ¸¶Å·Ã³¸®
const std::vector<int>& periodQuestIDs = periodQuest.GetQuestIDs();
for each(int questID in periodQuestIDs)
{
pQuest->OnPeriodEvent(questID, bMarking);
}
}
}
// ÀÏÀÏ/ÁÖ°£ Äù½ºÆ® ¸¶Å·ÇÑ´Ù.
void CDNPeriodQuestSystem::RefreshPeriodQuest(int nType, CDNUserQuest* pQuest)
{
// ŸÀÔÈ®ÀÎ
if(!IsPeriodType(nType))
return;
RefreshQuestKey(nType);
for each(const CDNPeriodQuest& periodQuest in m_vBaseQuest)
{
if(!periodQuest.IsType(nType))
continue;
int nSelectedID = periodQuest.SelectQuestID(m_nKeys[nType]);
if(nSelectedID <= 0)
continue;
bool bActivate = periodQuest.GetActivate();
bool bCanAcceptDate = periodQuest.CanAcceptDate();
const std::vector<int>& periodQuestIDs = periodQuest.GetQuestIDs();
for( UINT i = 0 ; i < periodQuestIDs.size() ; ++ i )
{
int questID = periodQuestIDs[i];
//ÀÏÀÏ/ÁÖ°£ Äù½ºÆ® ¸¶Å·ÇÑ´Ù.
if( bActivate && bCanAcceptDate && periodQuest.CheckSelectedQuestID( m_nKeys[nType], questID, i ) )
pQuest->SetCompleteQuestFlag(questID, false); // ¼±ÅÃµÈ Äù½ºÆ®´Â ¸¶Å·À» Ç®¾îÁØ´Ù.
else
pQuest->SetCompleteQuestFlag(questID, true); // ¹Ì¼±ÅÃµÈ Äù½ºÆ®´Â ¸¶Å·ÇØÁØ´Ù.
}
}
}
bool CDNPeriodQuestSystem::FindEventScheduleID(int nQuestID, int& nScheduleID, __time64_t& tExpireDate)
{
bool bActivate;
bool bCanAcceptDate;;
std::vector<int> vPeriodQuestIDs;
std::vector<CDNPeriodQuest>::iterator iter = m_vBaseQuest.begin();
for( ; iter != m_vBaseQuest.end(); iter++ )
{
CDNPeriodQuest * pPeriodQuest = &(*iter);
if( !pPeriodQuest)
continue;
int nType = pPeriodQuest->GetType();
if(nType == PERIODQUEST_RESET_EVENT || nType == PERIODQUEST_RESET_WORLD)
{
}
else
continue;
bActivate = pPeriodQuest->GetActivate();
bCanAcceptDate = pPeriodQuest->CanAcceptDate();
if(!bActivate || !bCanAcceptDate)
continue;
vPeriodQuestIDs.clear();
vPeriodQuestIDs = pPeriodQuest->GetQuestIDs();
std::vector<int>::iterator marking_iter = vPeriodQuestIDs.begin();
for( ; marking_iter != vPeriodQuestIDs.end(); marking_iter++ )
{
if(nQuestID == (*marking_iter))
{
nScheduleID = pPeriodQuest->GetScheduleID();
tExpireDate = pPeriodQuest->GetEventTime(PERIODQUEST_TIME_END);
return true;
}
}
}
return false;
}
void CDNPeriodQuestSystem::DoUpdate(DWORD CurTick)
{
if(PERIODQUESTTERM > GetTickTerm(m_TickCheckQuest, CurTick))
return;
m_TickCheckQuest = CurTick;
time(&m_Time);
std::vector<CDNPeriodQuest>::iterator iter = m_vBaseQuest.begin();
while(iter != m_vBaseQuest.end())
{
CDNPeriodQuest * pQuest = &(*iter);
if(pQuest->GetActivate())
{
if(pQuest->GetType() == PERIODQUEST_RESET_EVENT || pQuest->GetType() == PERIODQUEST_RESET_WORLD)
{
if(pQuest->GetEventTime(PERIODQUEST_TIME_START) < m_Time && !pQuest->GetEventComplete(PERIODQUEST_TIME_START))
OnStartEvent(pQuest);
else if(pQuest->GetEventTime(PERIODQUEST_TIME_END) < m_Time && !pQuest->GetEventComplete(PERIODQUEST_TIME_END))
OnEndEvent(pQuest);
}
}
++iter;
}
}
bool CDNPeriodQuestSystem::CheckValidTime(time_t timeStart, time_t timeEnd)
{
// ¼¼ÆÃÇϱâ Àü¿¡ ¸®¼ÂŸÀֿ̹¡ °É¸®´ÂÁö È®ÀÎÇÑ´Ù.
CTimeSet tStartDate;
CTimeSet tEndDate;
tStartDate.Set(timeStart, true);
tEndDate.Set(timeEnd, true);
if(!tStartDate.CheckIntegrity())
return false;
if(!tEndDate.CheckIntegrity())
return false;
// ¸®¼ÂŸÀ̹ÖÀ϶§ Key°ªÀÌ º¯Çϱ⠶§¹®¿¡ ½ºÄÉÁ층À» ÀâÀ»¼ö ¾ø°Ô ÇÑ´Ù.
if(tStartDate.GetHour() < m_nResetHour && m_nResetHour < tEndDate.GetHour())
return false;
return true;
}
bool CDNPeriodQuestSystem::SetActivateQuest(int nScheduleID, bool bFlag, time_t timeStart, time_t timeEnd)
{
if(!CheckValidTime(timeStart, timeEnd))
return false;
time(&m_Time);
std::vector<CDNPeriodQuest>::iterator iter = m_vBaseQuest.begin();
for( ; iter != m_vBaseQuest.end(); iter++ )
{
CDNPeriodQuest * pQuest = &(*iter);
if(pQuest->GetScheduleID() == nScheduleID)
{
if(pQuest->GetType() == PERIODQUEST_RESET_EVENT || pQuest->GetType() == PERIODQUEST_RESET_WORLD)
{
// Pass
}
else
return false;
if(pQuest->GetOnEvent() && false == bFlag)
OnEndEvent(pQuest);
pQuest->SetEventTime(PERIODQUEST_TIME_START, timeStart);
pQuest->SetEventTime(PERIODQUEST_TIME_END, timeEnd);
pQuest->SetEventComplete(PERIODQUEST_TIME_START, false);
pQuest->SetEventComplete(PERIODQUEST_TIME_END, false);
pQuest->SetOnEvent(false);
pQuest->SetActivate(bFlag);
return true;
}
}
return false;
}
void CDNPeriodQuestSystem::LoadWorldQuestInfo(char cWorldSetID)
{
if(m_bInitFlag)
return;
m_bInitFlag = true;
int nScheduleID = 0;
BYTE cThreadID;
CDNDBConnection* pDBCon = g_pDBConnectionManager->GetDBConnection( cThreadID );
if(!pDBCon)
{
_DANGER_POINT();
return;
}
std::vector<CDNPeriodQuest>::iterator iter = m_vBaseQuest.begin();
while(iter != m_vBaseQuest.end())
{
CDNPeriodQuest * pQuest = &(*iter);
if(pQuest->GetType() == PERIODQUEST_RESET_WORLD)
{
nScheduleID = pQuest->GetScheduleID();
// DB È£Ãâ
pDBCon->QueryGetWorldEventQuestCounter(cThreadID, cWorldSetID, nScheduleID);
}
++iter;
}
}
void CDNPeriodQuestSystem::UpdateWorldEvent(char cWorldSetID, int nScheduleID, int nCount, bool bCheckNotice)
{
TGlobalEventData* pEvent = g_pDataManager->GetGlobalEventData(nScheduleID);
if(!pEvent)
return;
// DB¿¡¼­ ÀúÀåµÈ °ªÀÌ ÀÖ´Ù¸é, bCheckNotice¸¦ Ä«¿îÆ® ±âÁذª¸¸Å­ Ȱ¼ºÈ­ ½ÃÄѳõ´Â´Ù.
if(bCheckNotice)
{
for(int i=0; i<MAX_NOTICE_WORLDEVENT; i++)
{
if(nCount >= pEvent->nNoticeCount[i])
pEvent->bCheckNotice[i] = true;
}
}
// °øÁöó¸®
for(int i=0; i<MAX_NOTICE_WORLDEVENT; i++)
{
if(nCount >= pEvent->nNoticeCount[i] &&
false == pEvent->bCheckNotice[i] &&
pEvent->nNoticeCount[i] > 0)
{
pEvent->bCheckNotice[i] = true;
// ÀüüÀ¯Àú¿¡°Ô ¸Þ¼¼Áö Àü¼Û
#if defined(_VILLAGESERVER)
g_pUserSessionManager->SendPeriodQuestNotice(pEvent->nItemID, pEvent->nNoticeCount[i]);
#elif defined(_GAMESERVER)
SendNoticePeriodQuestForGameServer(cWorldSetID, pEvent->nItemID, pEvent->nNoticeCount[i]);
#endif
}
}
TWorldQuestInfo Data;
Data.cWorldSetID = cWorldSetID;
Data.nScheduleID = nScheduleID;
Data.nCount = nCount;
MWorldQuestItor itor = m_mWorldEventQuest.find(cWorldSetID);
if(itor != m_mWorldEventQuest.end())
{
bool bIsUpdate = false;
std::vector<TWorldQuestInfo>::iterator iter = (*itor).second.begin();
while(iter != (*itor).second.end())
{
TWorldQuestInfo * pQuest = &(*iter);
if(pQuest->nScheduleID == nScheduleID)
{
pQuest->nCount = nCount;
bIsUpdate = true;
break;
}
++iter;
}
if(false == bIsUpdate)
(*itor).second.push_back(Data);
}
else
{
std::vector <TWorldQuestInfo> vList;
vList.push_back(Data);
m_mWorldEventQuest.insert(make_pair(cWorldSetID, vList));
}
}
int CDNPeriodQuestSystem::GetWorldEventCount(char cWorldSetID, int nScheduleID)
{
MWorldQuestItor itor = m_mWorldEventQuest.find(cWorldSetID);
if(itor != m_mWorldEventQuest.end())
{
std::vector<TWorldQuestInfo>::iterator iter = (*itor).second.begin();
while(iter != (*itor).second.end())
{
TWorldQuestInfo * pQuest = &(*iter);
if(pQuest->nScheduleID == nScheduleID)
return pQuest->nCount;
++iter;
}
}
return 0;
}
// 0: ¿Ï·á 1 : ½ÃÀ۾ȳ» 2: ¼öÁý±â°£ 3: º¸»ó¾È³» 4: º¸»ó±â°£
int CDNPeriodQuestSystem::GetWorldEventStep(char cWorldSetID, int nScheduleID)
{
time_t tStartDate = 0, tEndDate = 0;
std::vector<CDNPeriodQuest>::iterator iter = m_vBaseQuest.begin();
for( ; iter != m_vBaseQuest.end(); iter++ )
{
CDNPeriodQuest * pQuest = &(*iter);
if(pQuest->GetScheduleID() == nScheduleID)
{
tStartDate = pQuest->GetEventTime(PERIODQUEST_TIME_START);
tEndDate = pQuest->GetEventTime(PERIODQUEST_TIME_END);
break;
}
}
if(tStartDate == 0 || tEndDate == 0)
return 0;
TGlobalEventData* pEvent = g_pDataManager->GetGlobalEventData(nScheduleID);
if(!pEvent)
return 0;
time(&m_Time);
// ½ÃÀ۾ȳ»
if(tStartDate < m_Time && m_Time < pEvent->tCollectStartDate)
return 1;
// ¼öÁý±â°£
if(pEvent->tCollectStartDate < m_Time && m_Time < pEvent->tCollectEndDate)
return 2;
// º¸»ó¾È³»
if(pEvent->tCollectEndDate < m_Time && m_Time < pEvent->tRewardDate)
return 3;
// º¸»ó±â°£
if(pEvent->tRewardDate <m_Time && m_Time < tEndDate)
return 4;
return 0;
}
bool CDNPeriodQuestSystem::SetWorldEventTime(int nScheduleID, time_t tCollectStartDate, time_t tCollectEndDate, time_t tRewardDate)
{
TGlobalEventData* pEvent = g_pDataManager->GetGlobalEventData(nScheduleID);
if(!pEvent)
return false;
pEvent->tCollectStartDate = tCollectStartDate;
pEvent->tCollectEndDate = tCollectEndDate;
pEvent->tRewardDate = tRewardDate;
return true;
}
bool CDNPeriodQuestSystem::IsPeriodQuest(int questID) const
{
return (m_PeriodQuestIDs.find(questID) != m_PeriodQuestIDs.end()) ? true : false;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ±âº»Äù½ºÆ®¸¦ µî·ÏÇÑ´Ù.
bool CDNPeriodQuestSystem::RegisterBaseQuest(int nItemID, int nType, std::vector<string>& vQuestIDs, std::vector<string>& vCompleteDate, int nScheduleID, int nSelectCount)
{
time_t timeStart = 0, timeEnd = 0;
if(vCompleteDate.size() == PERIODQUEST_TIME_MAX)
{
CTimeSet tStartSet(vCompleteDate[PERIODQUEST_TIME_START].c_str(), true);
CTimeSet tEndSet(vCompleteDate[PERIODQUEST_TIME_END].c_str(), true);
timeStart = tStartSet.GetTimeT64_LC();
timeEnd = tEndSet.GetTimeT64_LC();
if(!CheckValidTime(timeStart, timeEnd))
{
g_Log.Log(LogType::_FILEDBLOG, L"questdailytable.ext CheckValidTime Fail [ItemID:%d]\r\n", nItemID);
return false;
}
// ¿ùµå À̺¥Æ® ½Ã°£ üũ
if(nType == PERIODQUEST_RESET_WORLD)
{
TGlobalEventData* pEvent = g_pDataManager->GetGlobalEventData(nScheduleID);
if(!pEvent)
{
g_Log.Log(LogType::_FILEDBLOG, L"questdailytable.ext can't find valid ScheduleID in GlobalEvent.ext [ScheduleID:%d][ItemID:%d] \r\n", nScheduleID, nItemID);
return false;
}
if(timeStart < pEvent->tCollectStartDate || timeStart < pEvent->tCollectEndDate || timeStart < pEvent->tRewardDate)
{
}
else
{
g_Log.Log(LogType::_FILEDBLOG, L"questdailytable.ext WorldEvent StartTime Sequence Invalid [ScheduleID:%d][ItemID:%d] \r\n", nScheduleID, nItemID);
return false;
}
if(pEvent->tCollectStartDate < timeEnd || pEvent->tCollectEndDate < timeEnd || pEvent->tRewardDate < timeEnd)
{
}
else
{
g_Log.Log(LogType::_FILEDBLOG, L"questdailytable.ext WorldEvent EndTime Sequence Invalid [ScheduleID:%d][ItemID:%d] \r\n", nScheduleID, nItemID);
return false;
}
}
}
CDNPeriodQuest PeriodQuest;
PeriodQuest.Set(nItemID, nType, timeStart, timeEnd, nScheduleID, nSelectCount);
int nQuestID = 0;
for( std::vector<string>::iterator iter = vQuestIDs.begin(); iter != vQuestIDs.end() ; iter++ )
{
nQuestID = atoi((*iter).c_str() );
PeriodQuest.AddQuestID(nQuestID);
m_vQuestIDs[nType].push_back(nQuestID);
m_PeriodQuestIDs.insert(nQuestID);
}
m_vBaseQuest.push_back(PeriodQuest);
return true;
}
// Äù½ºÆ® ۰ª ¸®ÇÁ·¹½¬
void CDNPeriodQuestSystem::RefreshQuestKey(int nPeriodQuestType)
{
time(&m_Time);
m_pTime = localtime(&m_Time);
int nKey = 0;
// ÀÏÀÏ
if(nPeriodQuestType == PERIODQUEST_RESET_DAILY)
{
nKey = GetDateValue( 1900 + m_pTime->tm_year, m_pTime->tm_mon + 1, 0 );
int nValue = (( m_pTime->tm_mday * 24 ) +( m_pTime->tm_hour - m_nResetHour ) ) / 24;
nKey += nValue;
m_nKeys[PERIODQUEST_RESET_DAILY] = nKey;
}
else if(nPeriodQuestType == PERIODQUEST_RESET_WEEKLY) // ÁÖ°£
{
int nWeek = CDNSchedule::Saturday - CDNSchedule::Sunday;
nKey = ( GetDateValue( 1900 + m_pTime->tm_year, m_pTime->tm_mon + 1, 0 ) - 4 - nWeek ) / 7;
int nValue = GetDateValue( 1900 + m_pTime->tm_year, m_pTime->tm_mon + 1, m_pTime->tm_mday ) - 4 - nWeek;
int nOffset = nValue % 7;
int nWeekCount = ( 7 +( m_pTime->tm_mday - nOffset ) +( nOffset / 7 ) ) / 7;
if( nOffset == 0 && m_pTime->tm_hour < m_nResetHour) nWeekCount--;
nKey += nWeekCount;
m_nKeys[PERIODQUEST_RESET_WEEKLY] = nKey;
}
else // Àüü
{
nKey = GetDateValue( 1900 + m_pTime->tm_year, m_pTime->tm_mon + 1, 0 );
int nValue = (( m_pTime->tm_mday * 24 ) +( m_pTime->tm_hour - m_nResetHour ) ) / 24;
nKey += nValue;
m_nKeys[PERIODQUEST_RESET_DAILY] = nKey;
int nWeek = CDNSchedule::Saturday - CDNSchedule::Sunday;
nKey = ( GetDateValue( 1900 + m_pTime->tm_year, m_pTime->tm_mon + 1, 0 ) - 4 - nWeek ) / 7;
nValue = GetDateValue( 1900 + m_pTime->tm_year, m_pTime->tm_mon + 1, m_pTime->tm_mday ) - 4 - nWeek;
int nOffset = nValue % 7;
int nWeekCount = ( 7 +( m_pTime->tm_mday - nOffset ) +( nOffset / 7 ) ) / 7;
if( nOffset == 0 && m_pTime->tm_hour < m_nResetHour) nWeekCount--;
nKey += nWeekCount;
m_nKeys[PERIODQUEST_RESET_WEEKLY] = nKey;
}
}
// ŸÀÔ À¯È¿¼º °Ë»ç
bool CDNPeriodQuestSystem::IsValidType(int nType) const
{
switch(nType)
{
case PERIODQUEST_RESET_EVENT:
case PERIODQUEST_RESET_DAILY:
case PERIODQUEST_RESET_WORLD:
case PERIODQUEST_RESET_WEEKLY:
return true;
}
return false;
}
bool CDNPeriodQuestSystem::IsPeriodType(int nType) const
{
switch(nType)
{
case PERIODQUEST_RESET_DAILY:
case PERIODQUEST_RESET_WEEKLY:
return true;
}
return false;
}
// Äù½ºÆ® ½ÃÀÛÁ¡ ó¸®
void CDNPeriodQuestSystem::OnStartEvent(CDNPeriodQuest* pQuest)
{
pQuest->SetEventComplete(PERIODQUEST_TIME_START, true);
pQuest->SetOnEvent(true);
#if defined(_VILLAGESERVER)
for( UINT i = 0 ; i < pQuest->GetQuestIDs().size() ; ++ i )
{
int nSelectedID = pQuest->GetQuestIDs()[i];
if( pQuest->CheckSelectedQuestID( m_nKeys[PERIODQUEST_RESET_DAILY], nSelectedID, i ) )
{
g_pUserSessionManager->SendAssginPeriodQuest( nSelectedID, false );
}
}
#elif defined(_GAMESERVER)
for( UINT i = 0 ; i < pQuest->GetQuestIDs().size() ; ++ i )
{
int nSelectedID = pQuest->GetQuestIDs()[i];
if( pQuest->CheckSelectedQuestID( m_nKeys[PERIODQUEST_RESET_DAILY], nSelectedID, i ) )
{
SendAssginPeriodQuestForGameServer(nSelectedID, false);
}
}
#endif
}
// Äù½ºÆ® Á¾·áÁ¡ ó¸®
void CDNPeriodQuestSystem::OnEndEvent(CDNPeriodQuest* pQuest)
{
pQuest->SetEventComplete(PERIODQUEST_TIME_END, true);
pQuest->SetOnEvent(false);
#if defined(_VILLAGESERVER)
for( UINT i = 0 ; i < pQuest->GetQuestIDs().size() ; ++ i )
{
int nSelectedID = pQuest->GetQuestIDs()[i];
if( pQuest->CheckSelectedQuestID( m_nKeys[PERIODQUEST_RESET_DAILY], nSelectedID, i ) )
{
g_pUserSessionManager->SendAssginPeriodQuest(nSelectedID, true);
}
}
#elif defined(_GAMESERVER)
for( UINT i = 0 ; i < pQuest->GetQuestIDs().size() ; ++ i )
{
int nSelectedID = pQuest->GetQuestIDs()[i];
if( pQuest->CheckSelectedQuestID( m_nKeys[PERIODQUEST_RESET_DAILY], nSelectedID, i ) )
{
SendAssginPeriodQuestForGameServer(nSelectedID, true);
}
}
#endif
pQuest->SetActivate(false);
}
#if defined(_GAMESERVER)
void CDNPeriodQuestSystem::SendAssginPeriodQuestForGameServer(int nQuestID, bool bFlag)
{
MAGAAssginPeriodQuest packet;
packet.nQuestID = nQuestID;
packet.bFlag = bFlag;
for(int i=0 ; i<g_pGameServerManager->GetGameServerSize(); i++)
{
CDNRUDPGameServer *pServer = g_pGameServerManager->GetGameServerIndex(i);
if(pServer)
pServer->StoreExternalBuffer(0, MAGA_ASSIGN_PERIODQUEST, 0, reinterpret_cast<char*>(&packet), sizeof(packet), EXTERNALTYPE_MASTER);
}
}
void CDNPeriodQuestSystem::SendNoticePeriodQuestForGameServer(char cWorldSetID, int nItemID, int nNoticeCount)
{
MAGANoticePeriodQuest packet;
packet.cWorldSetID = cWorldSetID;
packet.nItemID = nItemID;
packet.nNoticeCount = nNoticeCount;
for(int i=0 ; i<g_pGameServerManager->GetGameServerSize(); i++)
{
CDNRUDPGameServer *pServer = g_pGameServerManager->GetGameServerIndex(i);
if(pServer)
pServer->StoreExternalBuffer(0, MAGA_NOTICE_PERIODQUEST, 0, reinterpret_cast<char*>(&packet), sizeof(packet), EXTERNALTYPE_MASTER);
}
}
#endif