DragonNest/Server/ServerCommon/DNEvent.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

450 lines
12 KiB
C++
Raw Permalink Blame History

#include "Stdafx.h"
#include "DNEvent.h"
CDNEvent * g_pEvent = NULL;
CDNEvent::CDNEvent()
{
}
CDNEvent::~CDNEvent()
{
m_Sync.Lock();
std::multimap <int, TEventListInfo*>::iterator ii;
for (ii = m_WorldEventList.begin(); ii != m_WorldEventList.end(); )
{
TEventListInfo * pDel = (*ii).second;
SAFE_DELETE(pDel);
ii = m_WorldEventList.erase(ii);
}
m_WorldEventList.clear();
m_Sync.UnLock();
}
void CDNEvent::InitWorld(char cWorldID)
{
ScopeLock <CSyncLock> Lock(m_Sync);
std::vector <int>::iterator ii;
for (ii = m_WorldInit.begin(); ii != m_WorldInit.end(); ii++)
{
if ((*ii) == cWorldID)
{
m_WorldInit.erase(ii);
return;
}
}
}
bool CDNEvent::IsInitWorld(char cWorldID)
{
m_Sync.Lock();
std::vector <int>::iterator ii;
for (ii = m_WorldInit.begin(); ii != m_WorldInit.end(); ii++)
{
if ((*ii) == cWorldID)
{
m_Sync.UnLock();
return true;
}
}
m_Sync.UnLock();
return false;
}
void CDNEvent::AddWorldEvent(char cWorld, int nCount, TEventInfo * pInfoList)
{
time_t Time;
time(&Time);
ScopeLock <CSyncLock> Lock(m_Sync);
std::multimap <int, TEventListInfo*>::iterator ii;
for (ii = m_WorldEventList.begin(); ii != m_WorldEventList.end(); )
{
TEventListInfo * pDel = (*ii).second;
SAFE_DELETE(pDel);
ii = m_WorldEventList.erase(ii);
}
m_WorldEventList.clear();
TEventListInfo * pInfo;
bool bAdd;
for (int i = 0; i < nCount; i++)
{
if (Time > pInfoList[i]._tEndTime) continue; //Event was expired
pInfo = NULL;
bAdd = false;
for (ii = m_WorldEventList.begin(); ii != m_WorldEventList.end(); ii++)
{
if ((*ii).second->nEventID == pInfoList[i].EventID)
{
pInfo = (*ii).second;
break;
}
}
if (pInfo == NULL)
{
pInfo = new TEventListInfo;
bAdd = true;
}
pInfo->nEventID = pInfoList[i].EventID;
pInfo->nWorldID = pInfoList[i].WroldID;
pInfo->_tBeginTime = pInfoList[i]._tBeginTime;
pInfo->_tEndTime = pInfoList[i]._tEndTime;
#if defined(PRE_ADD_WORLD_EVENT)
#else
GetApplyMapIdx(&pInfo->vApplyMapIdxList, pInfoList[i].wszMapIndex);
#endif //#if defined(PRE_ADD_WORLD_EVENT)
memcpy(pInfo->nEventType, pInfoList[i].EventType, sizeof(pInfo->nEventType));
memcpy(pInfo->nAtt, pInfoList[i].Att, sizeof(pInfo->nAtt));
if (bAdd)
m_WorldEventList.insert(std::make_pair(pInfo->nWorldID, pInfo));
}
std::vector <int>::iterator iw;
iw = std::find(m_WorldInit.begin(), m_WorldInit.end(), cWorld);
if (m_WorldInit.end() == iw)
m_WorldInit.push_back(cWorld);
}
void CDNEvent::GetEvent(char cWorldID, int nMapIdx, DNVector(TEvent) * pvList)
{
TEvent _event;
memset(&_event, 0, sizeof(TEvent));
std::multimap <int, TEventListInfo*>::iterator ii;
time_t Time;
time(&Time);
m_Sync.Lock();
for (ii = m_WorldEventList.begin(); ii != m_WorldEventList.end(); ii++)
{
//<2F><EFBFBD><E2B0A3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̰ų<CCB0> <20><><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20>ƴ϶<C6B4><CFB6><EFBFBD>
if (Time < (*ii).second->_tBeginTime || Time > (*ii).second->_tEndTime) continue;
if ((*ii).second->nWorldID != cWorldID && (*ii).second->nWorldID != 0) continue;
#if defined(PRE_ADD_WORLD_EVENT)
_event.nEventID = (*ii).second->nEventID;
_event._tBeginTime = (*ii).second->_tBeginTime;
_event._tEndTime = (*ii).second->_tEndTime;
memcpy(_event.nEventType, (*ii).second->nEventType, sizeof(_event.nEventType));
memcpy(_event.nAtt, (*ii).second->nAtt, sizeof(_event.nAtt));
pvList->push_back(_event);
#else
for (int i = 0; i < (int)(*ii).second->vApplyMapIdxList.size(); i++)
{
if ((*ii).second->vApplyMapIdxList[i] == nMapIdx || (*ii).second->vApplyMapIdxList[i] == 0)
{
_event.nEventID = (*ii).second->nEventID;
_event._tBeginTime = (*ii).second->_tBeginTime;
_event._tEndTime = (*ii).second->_tEndTime;
memcpy(_event.nEventType, (*ii).second->nEventType, sizeof(_event.nEventType));
memcpy(_event.nAtt, (*ii).second->nAtt, sizeof(_event.nAtt));
pvList->push_back(_event);
break;
}
}
#endif //#if defined(PRE_ADD_WORLD_EVENT)
}
m_Sync.UnLock();
}
void CDNEvent::GetEventByType(char cWorldID, int nMapIdx, int nType, DNVector(TEvent) * pvList)
{
DNVector(TEvent) vTemp;
GetEvent( cWorldID, nMapIdx, &vTemp );
for( UINT i=0 ; i<vTemp.size() ; ++i )
{
if( vTemp[i].nEventType1 == nType )
pvList->push_back( vTemp[i] );
}
}
#if defined(PRE_ADD_WORLD_EVENT)
const TEventListInfo* CDNEvent::GetEventByType(char cWorldID, int nType, char cClassID)
{
std::multimap <int, TEventListInfo*>::iterator ii;
time_t Time;
time(&Time);
ScopeLock <CSyncLock> Lock(m_Sync);
for (ii = m_WorldEventList.begin(); ii != m_WorldEventList.end(); ii++)
{
if (Time >= (*ii).second->_tBeginTime && Time <= (*ii).second->_tEndTime)
{
if ((*ii).second->nEventType2 == nType)
{
if( (*ii).second->nEventType1 == 0 || (*ii).second->nEventType1 == cClassID )
return (*ii).second;
}
}
}
return NULL;
}
#endif //#if defined(PRE_ADD_WORLD_EVENT)
#if defined(PRE_ADD_WORLD_EVENT)
int CDNEvent::GetExtendFatigue(char cClassID)
{
std::multimap <int, TEventListInfo*>::iterator ii;
time_t Time;
time(&Time);
ScopeLock <CSyncLock> Lock(m_Sync);
for (ii = m_WorldEventList.begin(); ii != m_WorldEventList.end(); ii++)
{
if (Time >= (*ii).second->_tBeginTime && Time <= (*ii).second->_tEndTime)
{
if ((*ii).second->nEventType2 == WorldEvent::EVENT6 )
{
if( (*ii).second->nEventType1 == 0 || (*ii).second->nEventType1 == cClassID )
return (*ii).second->nAtt1;
}
}
}
return 0;
}
#else //#if defined(PRE_ADD_WORLD_EVENT)
int CDNEvent::GetExtendFatigue()
{
std::multimap <int, TEventListInfo*>::iterator ii;
time_t Time;
time(&Time);
ScopeLock <CSyncLock> Lock(m_Sync);
for (ii = m_WorldEventList.begin(); ii != m_WorldEventList.end(); ii++)
{
if (Time >= (*ii).second->_tBeginTime && Time <= (*ii).second->_tEndTime)
{
if ((*ii).second->nEventType1 == _EVENT_1_FATIGUE && (*ii).second->nEventType2 == _EVENT_2_EXTEND_FATIGUE)
return (*ii).second->nAtt1;
}
}
return 0;
}
bool CDNEvent::GetEventQuestList(char cWorldID, std::vector <int> &vList)
{
std::multimap <int, TEventListInfo*>::iterator ii;
time_t Time;
time(&Time);
ScopeLock <CSyncLock> Lock(m_Sync);
for (ii = m_WorldEventList.begin(); ii != m_WorldEventList.end(); ii++)
{
if (Time < (*ii).second->_tBeginTime || Time > (*ii).second->_tEndTime) continue;
if ((*ii).second->nWorldID != cWorldID && (*ii).second->nWorldID != 0) continue;
if ((*ii).second->nEventType1 == _EVENT_1_QUEST && (*ii).second->nEventType2 == _EVENT_2_NONE && \
(*ii).second->nEventType3 == _EVENT_3_NONE)
{
vList.push_back((*ii).second->nAtt1);
return true;
}
}
return false;
}
bool CDNEvent::GetPeriodQuestList (char cWorldID, std::vector <TEventListInfo> &vList)
{
TEventListInfo _event;
memset(&_event, 0, sizeof(TEventListInfo));
std::multimap <int, TEventListInfo*>::iterator ii;
time_t Time;
time(&Time);
ScopeLock <CSyncLock> Lock(m_Sync);
for (ii = m_WorldEventList.begin(); ii != m_WorldEventList.end(); ii++)
{
if (Time > (*ii).second->_tEndTime) continue;
if ((*ii).second->nWorldID != cWorldID && (*ii).second->nWorldID != 0) continue;
if ((*ii).second->nEventType1 == _EVENT_1_QUEST && (*ii).second->nEventType2 == _EVENT_2_NONE && \
(*ii).second->nEventType3 == _EVENT_3_NONE)
{
_event.nEventID = (*ii).second->nEventID;
_event.nWorldID = (*ii).second->nWorldID;
_event._tBeginTime = (*ii).second->_tBeginTime;
_event._tEndTime = (*ii).second->_tEndTime;
memcpy(_event.nEventType, (*ii).second->nEventType, sizeof(_event.nEventType));
memcpy(_event.nAtt, (*ii).second->nAtt, sizeof(_event.nAtt));
vList.push_back(_event);
return true;
}
}
return false;
}
#endif //#if defined(PRE_ADD_WORLD_EVENT)
bool CDNEvent::GetUpkeepBonus(char cWorldID, int &nRateOffSet, int &nMaximumRate)
{
#if defined(PRE_ADD_WORLD_EVENT)
std::multimap <int, TEventListInfo*>::iterator ii;
time_t Time;
time(&Time);
ScopeLock <CSyncLock> Lock(m_Sync);
for (ii = m_WorldEventList.begin(); ii != m_WorldEventList.end(); ii++)
{
if (Time < (*ii).second->_tBeginTime || Time > (*ii).second->_tEndTime) continue;
if ((*ii).second->nWorldID != cWorldID && (*ii).second->nWorldID != 0) continue;
if ((*ii).second->nEventType2 == WorldEvent::EVENT9 )
{
nRateOffSet = (*ii).second->nAtt1;
nMaximumRate = (*ii).second->nAtt2;
return true;
}
}
return false;
#else
std::multimap <int, TEventListInfo*>::iterator ii;
time_t Time;
time(&Time);
ScopeLock <CSyncLock> Lock(m_Sync);
for (ii = m_WorldEventList.begin(); ii != m_WorldEventList.end(); ii++)
{
if (Time < (*ii).second->_tBeginTime || Time > (*ii).second->_tEndTime) continue;
if ((*ii).second->nWorldID != cWorldID && (*ii).second->nWorldID != 0) continue;
if ((*ii).second->nEventType1 == _EVENT_1_EXP && (*ii).second->nEventType2 == _EVENT_2_MONSTERDIE && \
(*ii).second->nEventType3 == _EVENT_3_UPKEEPPARTY)
{
nRateOffSet = (*ii).second->nAtt1;
nMaximumRate = (*ii).second->nAtt2;
return true;
}
}
return false;
#endif
}
bool CDNEvent::GetFriendPartyBonus(char cWorldID, int &nRate)
{
#if defined(PRE_ADD_WORLD_EVENT)
std::multimap <int, TEventListInfo*>::iterator ii;
time_t Time;
time(&Time);
ScopeLock <CSyncLock> Lock(m_Sync);
for (ii = m_WorldEventList.begin(); ii != m_WorldEventList.end(); ii++)
{
if (Time < (*ii).second->_tBeginTime || Time > (*ii).second->_tEndTime) continue;
if ((*ii).second->nWorldID != cWorldID && (*ii).second->nWorldID != 0) continue;
if ((*ii).second->nEventType2 == WorldEvent::EVENT10 )
{
nRate = (*ii).second->nAtt1;
return true;
}
}
return false;
#else
std::multimap <int, TEventListInfo*>::iterator ii;
time_t Time;
time(&Time);
ScopeLock <CSyncLock> Lock(m_Sync);
for (ii = m_WorldEventList.begin(); ii != m_WorldEventList.end(); ii++)
{
if (Time < (*ii).second->_tBeginTime || Time > (*ii).second->_tEndTime) continue;
if ((*ii).second->nWorldID != cWorldID && (*ii).second->nWorldID != 0) continue;
if ((*ii).second->nEventType1 == _EVENT_1_EXP && (*ii).second->nEventType2 == _EVENT_2_MONSTERDIE && \
(*ii).second->nEventType3 == _EVENT_3_FRIENDPARTY)
{
nRate = (*ii).second->nAtt1;
return true;
}
}
return false;
#endif //#if defined(PRE_ADD_WORLD_EVENT)
}
bool CDNEvent::IsExistAsync(int nWorldID, int nEventID)
{
std::multimap <int, TEventListInfo*>::iterator ii;
for (ii = m_WorldEventList.begin(); ii != m_WorldEventList.end(); ii++)
{
if ((*ii).second->nWorldID == nWorldID && (*ii).second->nEventID == nEventID)
return true;
}
return false;
}
void CDNEvent::GetApplyMapIdx(std::vector <int> * pvList, const WCHAR * pMapIdx)
{
std::vector<std::wstring> tokens;
TokenizeW(pMapIdx, tokens, L",");
for (int i = 0; i < (int)tokens.size(); i++)
{
std::vector<std::wstring> tokens2;
TokenizeW(tokens[i].c_str(), tokens2, L"-");
if (tokens2.size() > 1)
{
int nBegin, nEnd;
nBegin = _wtoi(tokens2[0].c_str());
nEnd = _wtoi(tokens2[1].c_str());
for (int j = nBegin; j <= nEnd; j++)
pvList->push_back(j);
}
else
pvList->push_back(_wtoi(tokens[i].c_str()));
}
}
#if defined(PRE_ADD_WORLD_EVENT)
#else
#if defined(PRE_ADD_REBIRTH_EVENT)
bool CDNEvent::IsRebirthEvent(char cWorldID, int nMapID)
{
std::multimap <int, TEventListInfo*>::iterator ii;
time_t Time;
time(&Time);
ScopeLock <CSyncLock> Lock(m_Sync);
for (ii = m_WorldEventList.begin(); ii != m_WorldEventList.end(); ii++)
{
if (Time < (*ii).second->_tBeginTime || Time > (*ii).second->_tEndTime) continue;
if ((*ii).second->nWorldID != cWorldID && (*ii).second->nWorldID != 0) continue;
if ((*ii).second->nEventType1 == _EVENT_1_REBIRTH &&
((*ii).second->nAtt1 == nMapID || (*ii).second->nAtt2 == nMapID || (*ii).second->nAtt3 == nMapID || (*ii).second->nAtt4 == nMapID || (*ii).second->nAtt5 == nMapID))
return true;
}
return false;
}
#endif
#endif //#if defined(PRE_ADD_WORLD_EVENT)