DragonNest/Server/ServerCommon/DNCashRepository.cpp

272 lines
6.5 KiB
C++
Raw Permalink Normal View History

#include "stdafx.h"
#include "DNCashRepository.h"
#include "DNCashItem.h"
#include "DNGameDataManager.h"
#include "TimeSet.h"
#if defined( PRE_ADD_VIP_FARM )
#include "DNUserSession.h"
#endif // #if defined( PRE_ADD_VIP_FARM )
CDNEffectRepository::CDNEffectRepository( CDNUserSession* pSession ):m_pSession(pSession)
{
}
CDNEffectRepository::~CDNEffectRepository()
{
for( std::map<INT64,CDNEffectItem*>::iterator itor=m_mRepository.begin() ; itor!=m_mRepository.end() ; )
{
CDNEffectItem* pCashItem = (*itor).second;
itor = m_mRepository.erase( itor );
SAFE_DELETE( pCashItem );
}
}
bool CDNEffectRepository::Add( INT64 biItemSerial, int iItemID, __time64_t tExpireDate /*=0*/ )
{
TItemData* pItemData = g_pDataManager->GetItemData( iItemID );
if( !pItemData )
{
_ASSERT(0);
return false;
}
CDNEffectItem* pEffectItem = NULL;
switch( pItemData->nType )
{
case ITEMTYPE_INVENTORY_SLOT:
case ITEMTYPE_INVENTORY_SLOT_EX:
{
pEffectItem = new CDNInventoryExtendItem( m_pSession, biItemSerial, pItemData, tExpireDate );
}
break;
case ITEMTYPE_GLYPH_SLOT:
case ITEMTYPE_PERIOD_PLATE:
case ITEMTYPE_PERIOD_PLATE_EX:
{
pEffectItem = new CDNGlyphExtendItem( m_pSession, biItemSerial, pItemData, tExpireDate );
}
break;
case ITEMTYPE_WAREHOUSE_SLOT:
case ITEMTYPE_WAREHOUSE_SLOT_EX:
{
pEffectItem = new CDNWareHouseInventoryExtendItem( m_pSession, biItemSerial, pItemData, tExpireDate );
}
break;
case ITEMTYPE_GESTURE:
{
pEffectItem = new CDNGestureAddItem( m_pSession, biItemSerial, pItemData, tExpireDate );
}
break;
case ITEMTYPE_GUILDWARE_SLOT:
{
pEffectItem = new CDNGuildWareSlotExtendItem( m_pSession, biItemSerial, pItemData, tExpireDate );
}
break;
case ITEMTYPE_UNION_MEMBERSHIP:
{
pEffectItem = new CDNUnionMembershipItem( m_pSession, biItemSerial, pItemData, tExpireDate );
}
break;
#if defined( PRE_ADD_VIP_FARM )
case ITEMTYPE_FARM_VIP:
{
pEffectItem = new CDNFarmVipItem( m_pSession, biItemSerial, pItemData, tExpireDate );
}
break;
#endif // #if defined( PRE_ADD_VIP_FARM )
case ITEMTYPE_PERIOD_APPELLATION:
{
pEffectItem = new CDNPeriodAppellationItem( m_pSession, biItemSerial, pItemData, tExpireDate );
}
break;
case ITEMTYPE_EXPAND_SKILLPAGE:
{
pEffectItem = new CDNExpandSkillPageItem( m_pSession, biItemSerial, pItemData, tExpireDate );
}
break;
case ITEMTYPE_SOURCE:
{
pEffectItem = new CDNSourceItem(m_pSession, biItemSerial, pItemData, tExpireDate);
}
break;
#if defined( PRE_ADD_NAMEDITEM_SYSTEM )
case ITEMTYPE_GLOBAL_PARTY_BUFF:
{
pEffectItem = new CDNEffectSkillItem(m_pSession, biItemSerial, pItemData, tExpireDate);
}
break;
#endif
#if defined( PRE_ADD_BESTFRIEND )
case ITEMTYPE_BESTFRIENDBUFFITEM:
{
pEffectItem = new CDNEffectBestFriendBufftem(m_pSession, biItemSerial, pItemData, tExpireDate);
}
break;
#endif
#if defined( PRE_ADD_TOTAL_LEVEL_SKILL )
case ITEMTYPE_TOTALSKILLLEVEL_SLOT:
{
pEffectItem = new CDNEffectTotalLevelSkilltem(m_pSession, biItemSerial, pItemData, tExpireDate);
}
break;
#endif
#if defined( PRE_ADD_NEWCOMEBACK )
case ITEMTYPE_COMEBACK_EFFECTITEM:
{
pEffectItem = new CDNEffectComebackItem(m_pSession, biItemSerial, pItemData, tExpireDate);
}
break;
#endif
#if defined(PRE_ADD_TALISMAN_SYSTEM)
case ITEMTYPE_PERIOD_TALISMAN_EX:
{
pEffectItem = new CDNTalismanExtendItem( m_pSession, biItemSerial, pItemData, tExpireDate );
}
break;
#endif
#if defined(PRE_PERIOD_INVENTORY)
case ITEMTYPE_PERIOD_INVENTORY:
{
pEffectItem = new CDNPeriodInventoryExtendItem( m_pSession, biItemSerial, pItemData, tExpireDate );
}
break;
case ITEMTYPE_PERIOD_WAREHOUSE:
{
pEffectItem = new CDNPeriodWarehouseExtendItem( m_pSession, biItemSerial, pItemData, tExpireDate );
}
break;
#endif // #if defined(PRE_PERIOD_INVENTORY)
}
if( !pEffectItem )
{
_ASSERT(0);
return false;
}
if( !pEffectItem->Add() )
{
_ASSERT(0);
delete pEffectItem;
return false;
}
std::pair<std::map<INT64,CDNEffectItem*>::iterator,bool> Ret = m_mRepository.insert( std::make_pair(biItemSerial,pEffectItem) );
if( !Ret.second )
{
_ASSERT(0);
delete pEffectItem;
return false;
}
return true;
}
bool CDNEffectRepository::Remove( INT64 biItemSerial )
{
std::map<INT64,CDNEffectItem*>::iterator itor = m_mRepository.find( biItemSerial );
if( itor == m_mRepository.end() )
{
_DANGER_POINT();
return false;
}
CDNEffectItem* pCashItem = (*itor).second;
if( !pCashItem->Remove() )
{
_ASSERT(0);
return false;
}
m_mRepository.erase( itor );
delete pCashItem;
return true;
}
#if defined (PRE_ADD_VIP_FARM)
void CDNEffectRepository::SendEffectItem()
{
for each (std::map<INT64, CDNEffectItem*>::value_type v in m_mRepository)
{
const TItemData* pItemData = v.second->GetItemData();
switch (pItemData->nType)
{
#if defined (PRE_ADD_VIP_FARM)
case ITEMTYPE_FARM_VIP:
{
m_pSession->SendEffectItemInfo( pItemData->nItemID, v.second->GetExpireDate() );
break;
}
break;
#endif // #if defined (PRE_ADD_VIP_FARM)
}
}
}
bool CDNEffectRepository::bIsExpiredItem( int iItemType )
{
for( std::map<INT64,CDNEffectItem*>::iterator itor=m_mRepository.begin() ; itor!=m_mRepository.end() ; ++itor )
{
const TItemData* pItemData = (*itor).second->GetItemData();
if( pItemData && pItemData->nType == iItemType )
{
CTimeSet EndTime( (*itor).second->GetExpireDate(), true );
CTimeSet CurTime;
if( CurTime.GetTimeT64_LC() > EndTime.GetTimeT64_LC() )
return true;
return false;
}
}
return true;
}
#endif // #if defined (PRE_ADD_VIP_FARM)
void CDNEffectRepository::DelGuildRewardItem()
{
for( std::map<INT64,CDNEffectItem*>::iterator itor=m_mRepository.begin() ; itor!=m_mRepository.end() ;)
{
const TItemData* pItemData = (*itor).second->GetItemData();
if( pItemData && pItemData->cReversion == ITEMREVERSION_GUILD )
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC≯<EFBFBD> <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF>ϸ<EFBFBD> <20>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> OnRemove<76><65> <20>ڵ<EFBFBD> <20>ۼ<EFBFBD> <20>ʿ<EFBFBD>)
itor->second->Remove();
CDNEffectItem* pCashItem = (*itor).second;
itor = m_mRepository.erase( itor );
SAFE_DELETE( pCashItem );
}
else
++itor;
}
}
#if defined( PRE_ADD_BESTFRIEND )
void CDNEffectRepository::DelEffectItemType( char cType )
{
for( std::map<INT64,CDNEffectItem*>::iterator itor=m_mRepository.begin() ; itor!=m_mRepository.end() ;)
{
const TItemData* pItemData = (*itor).second->GetItemData();
if( pItemData && pItemData->nType == cType )
{
itor->second->Remove();
CDNEffectItem* pCashItem = (*itor).second;
itor = m_mRepository.erase( itor );
SAFE_DELETE( pCashItem );
}
else
++itor;
}
}
#endif