📄 uniquemanager.cpp
字号:
// UniqueManager.cpp: implementation of the UniqueManager class.
//
//
//
//
////////////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "command.h"
#include "UniqueManager.h"
#include "MapDBAccess.h" // DATA BASE
#include "Map.h"
#include "DBSocket.h"
#include "../Parameter/Item.h"
////////////////////////////////////////////////////////////////////////////////////////
// Global 函荐
////////////////////////////////////////////////////////////////////////////////////////
extern CDBConnection g_AccountDB; // AccountDB
extern _LPDBSOCK g_lpDBSock ; // DB Socket
extern Map *g_pMap; // MAP
////////////////////////////////////////////////////////////////////////////////////////
// Construction / Destruction
//
// - UNIQUE ITEM狼 扁夯 沥焊甫 CHART-DB俊辑 佬绢咳
////////////////////////////////////////////////////////////////////////////////////////
UniqueManager::UniqueManager()
{
m_nDropCount = 0; // 靛酚登绰 蜡聪农 酒捞袍 醚箭磊
memset( m_tDropTable, 0x00, sizeof(m_tDropTable) ); // 靛酚登绰 蜡聪农 酒捞袍 Table
m_MapUniqueChart.Clear();
Table_UniqueItemChart tbUniqueChart;
if( tbUniqueChart.Open( &g_AccountDB ))
{
while( tbUniqueChart.Fetch() )
{
_UNIQUE_CHART_ *pUniqueChart = new _UNIQUE_CHART_;
memcpy( pUniqueChart, &tbUniqueChart.UniqueChart, sizeof(_UNIQUE_CHART_) );
m_MapUniqueChart.Insert( pUniqueChart->wSEQ, pUniqueChart );
pUniqueChart->wCOUNT = 0; // 积己 肮荐绰 World Server俊辑 沥焊甫 掘澜
#ifdef DEF_UNIQUEITEMDROP_FIX
// 矫埃 拌魂阑 困秦 CTIME 函荐肺 蔼阑 持绰促.
CTime tEndTime( pUniqueChart->tENDDBTIME.year ,
pUniqueChart->tENDDBTIME.month ,
pUniqueChart->tENDDBTIME.day ,
pUniqueChart->tENDDBTIME.hour ,
pUniqueChart->tENDDBTIME.minute ,
pUniqueChart->tENDDBTIME.second );
CTime tStartTime( pUniqueChart->tSTARTDBTIME.year ,
pUniqueChart->tSTARTDBTIME.month ,
pUniqueChart->tSTARTDBTIME.day ,
pUniqueChart->tSTARTDBTIME.hour ,
pUniqueChart->tSTARTDBTIME.minute ,
pUniqueChart->tSTARTDBTIME.second );
pUniqueChart->tENDTIME = tEndTime ;
pUniqueChart->tSTARTTIME = tStartTime ;
// 蜡聪农 靛而 矫埃捞 瘤唱绰 版快绰 酒捞袍捞 歹捞惑 冻绢瘤瘤 臼绰促.
if( CTime::GetCurrentTime() > pUniqueChart->tENDTIME)
{
pUniqueChart->bCANITEMDROP = FALSE ;
}
#endif
//
// Drop矫懦 酒捞袍 府胶飘 掘澜
//
if( pUniqueChart->nENABLE )
{
m_tDropTable[ m_nDropCount ] = pUniqueChart->wSEQ;
m_nDropCount ++;
}
}
}
}
UniqueManager::~UniqueManager()
{
//
// Clean UNIQUE CHART
//
for ( MAP_VOIDPTR::iterator it = m_MapUniqueChart.Begin(); it != m_MapUniqueChart.End(); it++)
{
_UNIQUE_CHART_ *pUniqueChart = (_UNIQUE_CHART_ *)it->second;
if( !pUniqueChart ) continue;
SAFE_DELETE<_UNIQUE_CHART_> (&pUniqueChart);
}
m_MapUniqueChart.Clear();
}
////////////////////////////////////////////////////////////////////////////////////////
// Return The UNIQUE CHRT
//
////////////////////////////////////////////////////////////////////////////////////////
_UNIQUE_CHART_ * UniqueManager::UniqueChartFind(int pUniqueBase)
{
return (_UNIQUE_CHART_ *)m_MapUniqueChart.Find( pUniqueBase );
}
#ifdef DEF_UNIQUEITEM
////////////////////////////////////////////////////////////////////////////////////////
// 蜡聪农 酒捞袍 积己
//
// -
////////////////////////////////////////////////////////////////////////////////////////
CItem *UniqueManager::CreateUniqueItem()
{
if(m_nDropCount == 0 ) return NULL ;
_UNIQUE_CHART_ *pUniqueChart = UniqueChartFind( m_tDropTable[ rand()% m_nDropCount ] );
if( !pUniqueChart ) return NULL;
#ifdef DEF_UNIQUEITEMDROP_FIX
// 蜡聪农 靛而 醚荐甫 逞菌芭唱 靛而 矫埃捞 瘤唱绰 版快绰 靛而捞 登瘤 臼绰促.
if(pUniqueChart->bCANITEMDROP == FALSE ) return NULL ;
// 泅犁 矫埃 啊廉柯促.
CTime tNowTime = CTime::GetCurrentTime();
// 蜡聪农 靛而 矫累 矫埃捞 登绢具 酒捞袍捞 冻绢柳促.
if( tNowTime < pUniqueChart->tSTARTTIME) return NULL ;
#endif
//
// 扁夯 靛酚伏 犬牢
//
if( !CheckDropProbaility( pUniqueChart->fDROPRATE ) ) return NULL;
#ifdef DEF_UNIQUEITEMDROP_FIX
// 蜡聪农 靛而 矫埃捞 瘤唱绰 版快绰 酒捞袍捞 歹捞惑 冻绢瘤瘤 臼绰促.
if( tNowTime > pUniqueChart->tENDTIME)
{
pUniqueChart->bCANITEMDROP = FALSE ;
return NULL ;
}
// 蜡聪农 醚 靛而 俺荐啊 逞芭唱 鞍篮 版快
if( pUniqueChart->wCOUNT >= pUniqueChart->wMAXCOUNT )
{
pUniqueChart->bCANITEMDROP = FALSE ;
return NULL ;
}
#endif
int nOverDropCount = pUniqueChart->wCOUNT - pUniqueChart->wDROPCOUNT + 1;
if( nOverDropCount > 0 )
{
for( int i=0; i<nOverDropCount; ++i )
{
if( !CheckDropProbaility( pUniqueChart->fCONSTANT ) ) return NULL;
}
}
//
// 蜡聪农 酒捞袍 积己
//
CItem *pNewItem = (CItem *)g_pMap->Pool_Item_Pop(); // ITEM按眉甫 积己
if( !pNewItem ) return NULL;
if( ! pNewItem->CreateUniqueItem( pUniqueChart->wSEQ ) )
{
g_pMap->Pool_Item_Push( pNewItem );
return NULL;
}
//
// World Server俊 酒捞袍 积己 荤角阑 烹焊窃
//
g_lpDBSock->WorldSend_UniqueItemCreate( pUniqueChart->wSEQ );
return pNewItem;
}
#endif
////////////////////////////////////////////////////////////////////////////////////////
// 蜡聪农 酒捞袍 肮荐甫 涝仿矫糯
//
////////////////////////////////////////////////////////////////////////////////////////
void UniqueManager::SetUniqueList(_LPDBPACKET pWorldPacket)
{
char *lpReadData = pWorldPacket->strPacket;
WORD *lpReadNum = (WORD *) lpReadData ;
WORD nReadNum = (WORD) (*lpReadNum);
lpReadData += sizeof(WORD);
//
// 酒瘤飘 沥焊甫 涝仿 矫糯
//
while ((nReadNum)-- > 0 )
{
_LPZW_UNIQUEITEMLIST_REP pUniqueData = (_LPZW_UNIQUEITEMLIST_REP ) lpReadData ;
//
// 酒瘤飘啊 粮犁 窍绰 版快 贸府
//
_UNIQUE_CHART_ *pUniqueChart = (_UNIQUE_CHART_ *)m_MapUniqueChart.Find( pUniqueData->dwSeq );
//
// 酒瘤飘啊 积己登绢 乐绰 版快
//
if( pUniqueChart )
{
pUniqueChart->wCOUNT = pUniqueData->dwCount;
}
lpReadData += sizeof(_ZW_UNIQUEITEMLIST_REP) ;
}
}
////////////////////////////////////////////////////////////////////////////////////////
// 蜡聪农 酒捞袍 沥焊甫 诀单捞飘 矫糯
//
//
////////////////////////////////////////////////////////////////////////////////////////
void UniqueManager::SetUniqueUpdate(_LPZW_UNIQUEITEMUPDATE_REP pPacket)
{
_UNIQUE_CHART_ *pUnique = UniqueChartFind( pPacket->dwSeq );
if( !pUnique ) return;
pUnique->wCOUNT = pPacket->dwCount;
}
////////////////////////////////////////////////////////////////////////////////////////
// 秦寸 备埃狼 酒捞袍 粮犁 咯何
//
//
////////////////////////////////////////////////////////////////////////////////////////
bool UniqueManager::CheckDropProbaility(float pRate)
{
if( ( rand() % 1000 * 0.001 ) > pRate ) return false;
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -