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

97 lines
2.2 KiB
C++

#include "Stdafx.h"
#include "TradeCacheRepository.h"
using namespace TradeSystem;
CMarketPriceCache::CMarketPriceCache()
{
m_tLastResetTime.Reset();
ClearCache();
}
bool CMarketPriceCache::CheckResetCache ()
{
CTimeSet tCurrentTime;
if (m_tLastResetTime.GetDay () != tCurrentTime.GetDay())
{
m_tLastResetTime = tCurrentTime;
return true;
}
return false;
}
bool CMarketPriceCache::GetTradePrice (int nItemID, BYTE cLevel, BYTE cOption, TMarketPrice* pPrices)
{
// 리셋타임인지 체크한다.
if (CheckResetCache ())
{
ClearCache(); // 12시 정각에 캐쉬 삭제
return false;
}
ScopeLock<CSyncLock> Lock( m_Sync );
MTradePriceItor itor = m_mTradePrice.find (nItemID);
if (itor != m_mTradePrice.end())
{
std::vector<TMarketPriceCacheData>& VecCacheData = (*itor).second;
std::vector<TMarketPriceCacheData>::const_iterator cache_itor = VecCacheData.begin();
for (; cache_itor != VecCacheData.end(); cache_itor++)
{
if ((*cache_itor).cLevel == cLevel && (*cache_itor).cOption == cOption)
{
memcpy (pPrices, (*cache_itor).ItemPrices, sizeof((*cache_itor).ItemPrices));
return true;
}
}
}
return false;
}
void CMarketPriceCache::SetTradePrice (int nItemID, BYTE cLevel, BYTE cOption, TMarketPrice* pPrices)
{
ScopeLock<CSyncLock> Lock( m_Sync );
TMarketPriceCacheData Data;
Data.cLevel = cLevel;
Data.cOption = cOption;
memcpy (Data.ItemPrices, pPrices, sizeof(Data.ItemPrices));
MTradePriceItor itor = m_mTradePrice.find (nItemID);
if (itor != m_mTradePrice.end())
{
std::vector<TMarketPriceCacheData>& VecCacheData = (*itor).second;
std::vector<TMarketPriceCacheData>::const_iterator cache_itor = VecCacheData.begin();
bool bIsAdd = true;
for (; cache_itor != VecCacheData.end(); cache_itor++)
{
if ((*cache_itor).cLevel == cLevel && (*cache_itor).cOption == cOption)
bIsAdd = false;
}
if (bIsAdd)
VecCacheData.push_back (Data);
}
else
{
std::vector<TMarketPriceCacheData> vList;
vList.push_back(Data);
m_mTradePrice.insert (make_pair(nItemID, vList));
}
}
void CMarketPriceCache::ClearCache()
{
ScopeLock<CSyncLock> Lock( m_Sync );
for( MTradePriceItor itor = m_mTradePrice.begin() ; itor!=m_mTradePrice.end() ; itor++)
(*itor).second.clear();
m_mTradePrice.clear();
}