120 lines
No EOL
5.7 KiB
C++
120 lines
No EOL
5.7 KiB
C++
|
||
#include "Stdafx.h"
|
||
#include "NoticeSystem.h"
|
||
#include "DNGameDataManager.h"
|
||
|
||
CDNNoticeSystem * g_pNoticeSystem = NULL;
|
||
|
||
CDNNoticeSystem::CDNNoticeSystem()
|
||
{
|
||
}
|
||
|
||
CDNNoticeSystem::~CDNNoticeSystem()
|
||
{
|
||
}
|
||
|
||
bool CDNNoticeSystem::AddNotice(const TNoticeTypeInfo * pInfo, const WCHAR * pNoticeMsg)
|
||
{
|
||
if (pInfo == NULL || pNoticeMsg == NULL) return false;
|
||
if (pInfo->nSlideShowSec <= 0) return false;
|
||
if (CheckNotice(pInfo) == false) return false;
|
||
|
||
TNoticeInfo Info;
|
||
memset(&Info, 0, sizeof(Info));
|
||
|
||
memcpy(&Info.TypeInfo, pInfo, sizeof(TNoticeTypeInfo));
|
||
_wcscpy(Info.wszMsg, _countof(Info.wszMsg), pNoticeMsg, (int)wcslen(pNoticeMsg));
|
||
Info.nCreateTime = timeGetTime();
|
||
Info.nDestroyTime = Info.nCreateTime + (pInfo->nSlideShowSec * 1000);
|
||
|
||
ScopeLock <CSyncLock> Lock(m_Sync);
|
||
m_pNoticeInfoList.push_back(Info);
|
||
return true;
|
||
}
|
||
|
||
bool CDNNoticeSystem::CancelNotice()
|
||
{
|
||
ScopeLock <CSyncLock> Lock(m_Sync);
|
||
|
||
if (m_pNoticeInfoList.empty())
|
||
return false;
|
||
|
||
m_pNoticeInfoList.clear();
|
||
return true;
|
||
}
|
||
|
||
bool CDNNoticeSystem::GetNotice(int nChannelID, int nMapIdx, TNoticeInfo & Info)
|
||
{
|
||
ULONG nCurTick = timeGetTime();
|
||
|
||
ScopeLock <CSyncLock> Lock(m_Sync);
|
||
|
||
std::list <TNoticeInfo>::iterator ii;
|
||
for (ii = m_pNoticeInfoList.begin(); ii != m_pNoticeInfoList.end(); )
|
||
{
|
||
if ((*ii).nDestroyTime > nCurTick)
|
||
{
|
||
(*ii).TypeInfo.nSlideShowSec = (int)((*ii).nDestroyTime - nCurTick)/1000;
|
||
|
||
switch ((*ii).TypeInfo.nNoticeType)
|
||
{
|
||
case _NOTICETYPE_WORLD:
|
||
case _NOTICETYPE_EACHSERVER:
|
||
{
|
||
Info = (*ii);
|
||
return true;
|
||
}
|
||
break;
|
||
case _NOTICETYPE_CHANNEL:
|
||
if ((*ii).TypeInfo.nChannelID == nChannelID)
|
||
{
|
||
Info = (*ii);
|
||
return true;
|
||
}
|
||
break;
|
||
case _NOTICETYPE_ZONE:
|
||
if ((*ii).TypeInfo.nMapIdx == nMapIdx)
|
||
{
|
||
Info = (*ii);
|
||
return true;
|
||
}
|
||
break;
|
||
|
||
default:
|
||
return false;
|
||
}
|
||
ii++;
|
||
}
|
||
else
|
||
ii = m_pNoticeInfoList.erase(ii);
|
||
}
|
||
return false;
|
||
}
|
||
|
||
bool CDNNoticeSystem::CheckNotice(const TNoticeTypeInfo * pInfo)
|
||
{
|
||
ScopeLock <CSyncLock> Lock(m_Sync);
|
||
|
||
std::list <TNoticeInfo>::iterator ii;
|
||
for (ii = m_pNoticeInfoList.begin(); ii != m_pNoticeInfoList.end(); ii++)
|
||
{
|
||
if ((*ii).nDestroyTime > timeGetTime())
|
||
{
|
||
switch ((*ii).TypeInfo.nNoticeType)
|
||
{
|
||
case _NOTICETYPE_WORLD:
|
||
case _NOTICETYPE_EACHSERVER: return false;
|
||
case _NOTICETYPE_ZONE:
|
||
case _NOTICETYPE_CHANNEL:
|
||
{
|
||
if (pInfo->nNoticeType == _NOTICETYPE_WORLD || pInfo->nNoticeType == _NOTICETYPE_EACHSERVER) return false;
|
||
if (pInfo->nNoticeType == _NOTICETYPE_ZONE && (*ii).TypeInfo.nMapIdx == pInfo->nMapIdx) return false;
|
||
if (pInfo->nNoticeType == _NOTICETYPE_CHANNEL && ((*ii).TypeInfo.nMapIdx == pInfo->nMapIdx ||
|
||
(*ii).TypeInfo.nChannelID == pInfo->nChannelID)) return false;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return true;
|
||
} |