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

4248 lines
No EOL
128 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "StdAfx.h"
#include "DNExtManager.h"
#include "DNTableFile.h"
#include "Util.h"
#include "Log.h"
#include "EtResourceMng.h"
#include "./boost/lexical_cast.hpp"
#if defined(_LOGINSERVER) || defined(_MASTERSERVER)
#include "XMLParser.h"
#endif // #if defined(_LOGINSERVER) || defined(_MASTERSERVER)
#if defined(_DBSERVER)
#include "DNSQLConnectionManager.h"
#include "DNSQLMembership.h"
extern TDBConfig g_Config;
#elif defined(_CASHSERVER)
#include "./EtStringManager/EtUIXML.h"
#include "DNSQLManager.h"
#include "DNSQLMembership.h"
#if defined(PRE_ADD_LIMITED_CASHITEM)
#include "DNLimitedCashItemRepository.h"
#endif //#if defined(PRE_ADD_LIMITED_CASHITEM)
extern TCashConfig g_Config;
#elif defined(_MASTERSERVER)
extern TMasterConfig g_Config;
#elif defined(_LOGINSERVER)
#if defined(PRE_ADD_MULTILANGUAGE)
#include "MemPool.h"
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
extern TLoginConfig g_Config;
#endif
CDNExtManager *g_pExtManager = NULL;
CDNExtManager::CDNExtManager(void)
{
m_pMapInfo.clear();
m_pPCBangData.clear();
m_pMapDefaultCreate.clear();
#if defined( PRE_ADD_DWC )
m_pMapDWCCreate.clear();
#endif // #if defined( PRE_ADD_DWC )
m_pMapSkillData.clear();
m_mapDefaultUnlockSkillsByClass.clear();
m_pMapCoinCount.clear();
m_pLevelData.clear();
m_pWeaponData.clear();
m_pPartData.clear();
m_PvPGameStartConditionTable.clear();
m_ScheduleTable.clear();
m_PvPGameModeTable.clear();
m_MatchTypePvPGameModeID.clear();
m_PvPMapTable.clear();
m_GuildWarMapInfo.clear();
m_MailTableData.clear();
m_pGuildWarRewardData.clear();
m_JobTableData.clear();
{
ScopeLock <CSyncLock> Lock(m_Sync);
m_pMapCashCommodity.clear();
m_pMapCashPackage.clear();
}
m_pMapCashLimit.clear();
m_pItemData.clear();
m_pMapGlobalWeight.clear();
m_pMapGlobalWeightInt.clear();
m_VecProhibitSaleList.clear();
m_MapVehicle.clear();
m_MapVehicleParts.clear();
m_pMapNewCharCreate.clear();
}
bool CDNExtManager::AllLoad()
{
int iLoadFailCount = 0;
if (LoadGlobalWeight() == false)
++iLoadFailCount;
if (LoadGlobalWeightInt() == false)
++iLoadFailCount;
#if defined(_LOGINSERVER) || defined(_MASTERSERVER)
if (LoadMapInfo() == false)
++iLoadFailCount;
if (LoadChannelInfo() == false)
++iLoadFailCount;
if (LoadPCBangData() == false)
++iLoadFailCount;
if (LoadNewCharCreate() == false)
++iLoadFailCount;
#endif // _MASTERSERVER
#if defined(_LOGINSERVER)
if (LoadDefaultCreateData() == false)
++iLoadFailCount;
#if defined( PRE_ADD_DWC )
if(LoadDWCCreateData() == false)
++iLoadFailCount;
#endif // #if defined( PRE_ADD_DWC )
if (LoadSkillData() == false)
++iLoadFailCount;
if (LoadCoinCount() == false)
++iLoadFailCount;
#if defined(PRE_ADD_MULTILANGUAGE)
CLfhHeap::GetInstance()->InitPool();
std::string strFilePath;
for (int i = 0; i < MultiLanguage::SupportLanguage::NationMax; i++)
{
for (int j = 0; j < 2; j++)
{
strFilePath.clear();
strFilePath = g_Config.szResourcePath;
strFilePath.append("\\Resource");
if (g_Config.szResourceNation.size() > 0 && j == 0)
strFilePath.append(g_Config.szResourceNation);
strFilePath.append("\\UIString\\ProhibitWord");
if (i != 0) //<2F>ϴ<EFBFBD> 0<><30><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
strFilePath.append(MultiLanguage::NationString[i]);
strFilePath.append(".xml");
if (LoadProhibitWord(i, strFilePath.c_str()))
{
g_Log.Log(LogType::_FILELOG, L"%S Loaded\r\n", strFilePath.c_str());
break;
}
}
}
#else //#if defined(PRE_ADD_MULTILANGUAGE)
CLfhHeap::GetInstance()->InitPool();
if (LoadProhibitWord() == false)
++iLoadFailCount;
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
if (LoadLevelData() == false)
++iLoadFailCount;
if (LoadWeaponData() == false)
++iLoadFailCount;
if (LoadPartData() == false)
++iLoadFailCount;
#elif defined(_MASTERSERVER)
if (LoadPvPGameStartConditionTable() == false)
++iLoadFailCount;
if (LoadScheduleTable() == false)
++iLoadFailCount;
if (LoadPvPGameModeTable() == false)
++iLoadFailCount;
if (LoadGuildWarMapInfoTable() == false)
++iLoadFailCount;
if (LoadPvPMapTable() == false)
++iLoadFailCount;
#if defined(_WORK)
// WorldID <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>
#if defined( PRE_WORLDCOMBINE_PARTY )
if( g_Config.nWorldSetID == 0 )
g_Config.nWorldSetID = GetWorldID();
#else
g_Config.nWorldSetID = GetWorldID();
#endif // #if defined( PRE_WORLDCOMBINE_PARTY )
#endif
#endif // _MASTERSERVER
#if defined(_DBSERVER) || defined(_CASHSERVER)
if (LoadCashCommodity() == false)
++iLoadFailCount;
if (LoadCashPackage() == false)
++iLoadFailCount;
if (LoadCashLimit() == false)
++iLoadFailCount;
if (LoadItemData() == false)
++iLoadFailCount;
if (LoadPlayerLevel() == false)
++iLoadFailCount;
if (LoadVehicleData() == false)
++iLoadFailCount;
if (LoadVehiclePartsData() == false)
++iLoadFailCount;
if (LoadMailTableData() == false)
++iLoadFailCount;
if (LoadGuildWarRewardData() == false)
++iLoadFailCount;
if (LoadJobTableData() == false)
++iLoadFailCount;
#endif // #if defined(_DBSERVER) || defined(_CASHSERVER)
if( iLoadFailCount != 0 )
return false;
return true;
}
CDNExtManager::~CDNExtManager(void)
{
#if defined(_LOGINSERVER) || defined(_MASTERSERVER)
SAFE_DELETE_PVEC( m_pPCBangData );
for (TMapInfoMap::iterator iterMap = m_pMapInfo.begin(); iterMap != m_pMapInfo.end(); ++iterMap){
SAFE_DELETE(iterMap->second);
}
m_pMapInfo.clear();
#endif // #if defined(_LOGINSERVER) || defined(_MASTERSERVER)
#if defined(_LOGINSERVER)
for (TMapDefaultCreate::iterator iter = m_pMapDefaultCreate.begin(); iter != m_pMapDefaultCreate.end(); ++iter){
SAFE_DELETE(iter->second);
}
m_pMapDefaultCreate.clear();
#if defined( PRE_ADD_DWC )
for(TMapDWCCreate::iterator iter = m_pMapDWCCreate.begin(); iter != m_pMapDWCCreate.end(); ++ iter){
SAFE_DELETE(iter->second);
}
#endif // #if defined( PRE_ADD_DWC )
for( TMapSkillData::iterator iter = m_pMapSkillData.begin(); iter != m_pMapSkillData.end(); ++iter ) {
SAFE_DELETE( iter->second );
}
m_pMapSkillData.clear();
#if defined(PRE_ADD_MULTILANGUAGE)
for (std::map <int, TProhibitWord>::iterator ii = m_ProhibitWordList.begin(); ii != m_ProhibitWordList.end(); ii++)
(*ii).second.clear();
m_ProhibitWordList.clear();
#else //#if defined(PRE_ADD_MULTILANGUAGE)
m_ProhibitWordList.clear();
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
#elif defined(_MASTERSERVER)
for( TPvPGameStartConditionData::iterator iterGameStartConditionTable = m_PvPGameStartConditionTable.begin() ; iterGameStartConditionTable != m_PvPGameStartConditionTable.end() ; ++iterGameStartConditionTable )
{
SAFE_DELETE( iterGameStartConditionTable->second );
}
m_PvPGameStartConditionTable.clear();
SAFE_DELETE_PMAP( TPvPMapTableData, m_PvPMapTable );
#endif
SAFE_DELETE_PMAP(TMapGlobalWeight, m_pMapGlobalWeight);
SAFE_DELETE_PMAP(TMapGlobalWeightInt, m_pMapGlobalWeightInt);
#if defined(_DBSERVER) || defined(_CASHSERVER)
{
ScopeLock <CSyncLock> Lock(m_Sync);
SAFE_DELETE_PMAP(TMapCashCommodity, m_pMapCashCommodity);
SAFE_DELETE_PMAP(TMapCashPackage, m_pMapCashPackage);
}
SAFE_DELETE_PMAP(TMapCashLimit, m_pMapCashLimit);
SAFE_DELETE_PMAP( TMapItemData, m_pItemData );
typedef std::map<int, LevelValue *> TMapPlayerLevelTable;
SAFE_DELETEA_PMAP( TMapPlayerLevelTable, m_nMapTable );
SAFE_DELETE_PVEC(m_pGuildWarRewardData);
#endif // #if defined(_DBSERVER) || defined(_CASHSERVER)
for (map<int, vector<TSkillData*> >::iterator ii = m_mapDefaultUnlockSkillsByClass.begin(); ii != m_mapDefaultUnlockSkillsByClass.end(); ii++)
{
for (vector<TSkillData*>::iterator ih = (*ii).second.begin(); ih != (*ii).second.end(); ih++)
SAFE_DELETE((*ih));
(*ii).second.clear();
}
m_mapDefaultUnlockSkillsByClass.clear();
SAFE_DELETE_PMAP(TMapCoinCount, m_pMapCoinCount);
SAFE_DELETE_PMAP(TMapLevelData, m_pLevelData);
SAFE_DELETE_PMAP(TMapWeaponData, m_pWeaponData);
SAFE_DELETE_PMAP(TMapPartData, m_pPartData);
}
void CDNExtManager::FindExtFileList( const char *szFileName, std::vector<std::string> &szVecList )
{
szVecList.clear();
bool bExistFile = false;
CFileNameString szFullName = szFileName;
CFileStream Stream( szFileName );
if( !Stream.IsValid() ) return;
Stream.Close();
char szPath[256] = { 0, };
szVecList.push_back( szFullName.c_str() );
_GetPath( szPath, _countof(szPath), szFullName.c_str() );
std::vector<CFileNameString> szVecTemp;
FindFileListInDirectory( szPath, "*.dnt", szVecTemp );
char szTemp1[256];
char szTemp2[256];
_GetFileName( szTemp1, _countof(szTemp1), szFileName );
_strlwr( szTemp1 );
int nLength = (int)strlen(szTemp1);
szTemp1[nLength] = '_';
szTemp1[nLength+1] = 0;
char szTemp3[256];
for( DWORD i=0; i<szVecTemp.size(); i++ ) {
_GetFileName( szTemp2, _countof(szTemp2), szVecTemp[i].c_str() );
_strlwr( szTemp2 );
if( strstr( szTemp2, szTemp1 ) && strcmp( szTemp2, szTemp1 ) ) {
sprintf_s( szTemp3, "%s%s.dnt", szPath, szTemp2 );
szVecList.push_back( szTemp3 );
}
}
}
DNTableFileFormat* CDNExtManager::LoadExtTable( const char *szFileName )
{
char buf[_MAX_PATH] = { 0, };
bool bValid = true;
std::vector<CFileNameString> szVecList;
sprintf_s( buf, "%s*.dnt", szFileName );
DNTableFileFormat* pSox = new DNTableFileFormat();
if (!pSox){
g_Log.Log(LogType::_FILELOG, L"ext(%S) failed\r\n", buf );
return NULL;
}
CEtResourceMng::GetInstance().FindFileListAll_IgnoreExistFile( "ext", buf, szVecList );
for( DWORD i=0; i<szVecList.size(); i++ ) {
if (pSox->Load(szVecList[i].c_str(), false) == false)
{
g_Log.Log(LogType::_FILELOG, L"%S failed\r\n", szVecList[i].c_str());
bValid = false;
break;
}
}
if( !bValid )
{
if (szVecList.size() == 1){
g_Log.Log(LogType::_FILELOG, L"%S failed\r\n", buf );
SAFE_DELETE(pSox);
return NULL;
}
}
if (pSox->GetItemCount() <= 0){
g_Log.Log(LogType::_FILELOG, L"%S Count(%d)\r\n", pSox->GetItemCount(), buf );
SAFE_DELETE(pSox);
return NULL;
}
return pSox;
}
bool CDNExtManager::LoadPlayerLevel()
{
DNTableFileFormat *pSox = LoadExtTable( "PlayerLevelTable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"PlayerLevelTable failed\r\n");
SAFE_DELETE(pSox);
return false;
}
char *szLabelValue[PlayerLevelTableIndex::Amount] = {
"_Strength",
"_Agility",
"_Intelligence",
"_Stamina",
"_Experience",
"_SuperAmmor",
"_SkillPoint",
"_Fatigue",
"_DeadDurabilityRatio",
"_KillScore",
"_Assistscore",
"_Assistdecision",
"_Aggroper",
"_WeekFatigue",
"_SKillUsageRatio",
};
for( int i=0; i<pSox->GetItemCount(); i++ ) {
int nItemID = pSox->GetItemID(i);
if( nItemID % PLAYER_MAX_LEVEL == 1 ) {
LevelValue *pValue = new LevelValue[PLAYER_MAX_LEVEL];
for( DWORD j=0; j<PLAYER_MAX_LEVEL; j++ ) {
nItemID = pSox->GetItemID(i+j);
for( int k=0; k<PlayerLevelTableIndex::Amount; k++ ) {
switch( k ) {
case PlayerLevelTableIndex::DeadDurabilityRatio:
case PlayerLevelTableIndex::AggroPer:
pValue[j].nValue[k] = (int)( ( pSox->GetFieldFromLablePtr( nItemID, szLabelValue[k] )->GetFloat() + 0.0001f ) * 100.f );
break;
case PlayerLevelTableIndex::SPDecreaseRatio:
pValue[j].fValue[k] = pSox->GetFieldFromLablePtr( nItemID, szLabelValue[k] )->GetFloat();
break;
default:
pValue[j].nValue[k] = pSox->GetFieldFromLablePtr( nItemID, szLabelValue[k] )->GetInteger();
break;
}
}
}
int nJobID = ( pSox->GetItemID(i) / PLAYER_MAX_LEVEL ) + 1;
m_nMapTable.insert( make_pair( nJobID, pValue ) );
i += ( PLAYER_MAX_LEVEL - 1 ); // For <20>Ѿ<D1BE>鼭 i++ <20><>Ű<EFBFBD><EFBFBD><E2B6AB> <20>ϳ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
}
}
SAFE_DELETE( pSox );
return true;
}
int CDNExtManager::GetValue( int nClassID, int nLevel, PlayerLevelTableIndex::ePlayerLevelTableIndex Index )
{
std::map<int, LevelValue *>::iterator it = m_nMapTable.find( nClassID );
if( it == m_nMapTable.end() ) return -1;
return it->second[nLevel-1].nValue[Index];
}
float CDNExtManager::GetValueFloat( int nClassID, int nLevel, PlayerLevelTableIndex::ePlayerLevelTableIndex Index )
{
std::map<int, LevelValue *>::iterator it = m_nMapTable.find( nClassID );
if( it == m_nMapTable.end() ) return -1.f;
return it->second[nLevel-1].fValue[Index];
}
// GlobalWeight
bool CDNExtManager::LoadGlobalWeight()
{
DNTableFileFormat *pSox = LoadExtTable( "GlobalWeightTable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"GlobalWeightTable failed\r\n");
SAFE_DELETE(pSox);
return false;
}
char szTemp[MAX_PATH] = { 0, };
//##################################################################
// FieldNum <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>
//##################################################################
struct TempFieldNum
{
int _nID;
int _Value;
};
TempFieldNum sFieldNum;
sFieldNum._nID = pSox->GetFieldNum("ID");
sFieldNum._Value = pSox->GetFieldNum("_Value");
//##################################################################
// Load
//##################################################################
char *pStr = NULL, Dest[256] = {0,};
for (int i = 0; i < pSox->GetItemCount(); i++){
TGlobalWeightData *pData = new TGlobalWeightData;
memset(pData, 0, sizeof(TGlobalWeightData));
pData->nID = pSox->GetItemID(i);
int nIdx = pSox->GetIDXprimary(pData->nID);
pData->fValue = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Value)->GetFloat();
std::pair<TMapGlobalWeight::iterator,bool> Ret = m_pMapGlobalWeight.insert(make_pair(pData->nID, pData));
if (Ret.second == false) delete pData;
}
SAFE_DELETE( pSox );
return true;
}
bool CDNExtManager::LoadGlobalWeightInt()
{
DNTableFileFormat *pSox = LoadExtTable( "GlobalWeightIntTable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"GlobalWeightIntTable failed\r\n");
SAFE_DELETE(pSox);
return false;
}
char szTemp[MAX_PATH] = { 0, };
//##################################################################
// FieldNum <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>
//##################################################################
struct TempFieldNum
{
int _nID;
int _Value;
};
TempFieldNum sFieldNum;
sFieldNum._nID = pSox->GetFieldNum("ID");
sFieldNum._Value = pSox->GetFieldNum("_Value");
//##################################################################
// Load
//##################################################################
char *pStr = NULL, Dest[256] = {0,};
for (int i = 0; i < pSox->GetItemCount(); i++){
TGlobalWeightIntData *pData = new TGlobalWeightIntData;
memset(pData, 0, sizeof(TGlobalWeightIntData));
pData->nID = pSox->GetItemID(i);
int nIdx = pSox->GetIDXprimary(pData->nID);
pData->nValue = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Value)->GetInteger();
std::pair<TMapGlobalWeightInt::iterator,bool> Ret = m_pMapGlobalWeightInt.insert(make_pair(pData->nID, pData));
if (Ret.second == false) delete pData;
}
SAFE_DELETE( pSox );
return true;
}
// GlobalWeight
TGlobalWeightData *CDNExtManager::GetGlobalWeightData(int nID)
{
if (nID <= 0) return NULL;
TMapGlobalWeight::iterator iter = m_pMapGlobalWeight.find(nID);
if (iter == m_pMapGlobalWeight.end()) return NULL;
return iter->second;
}
float CDNExtManager::GetGlobalWeightValueFloat(int nID)
{
if (nID <= 0) return 0.f;
TGlobalWeightData *pData = GetGlobalWeightData(nID);
if (!pData) return 0.f;
return pData->fValue;
}
int CDNExtManager::GetGlobalWeightValue(int nID)
{
if (nID <= 0) return 0;
TGlobalWeightData *pData = GetGlobalWeightData(nID);
if (!pData) return 0;
return (int)pData->fValue;
}
TGlobalWeightIntData * CDNExtManager::GetGlobalWeightIntData(int nID)
{
if (nID <= 0) return NULL;
TMapGlobalWeightInt::iterator iter = m_pMapGlobalWeightInt.find(nID);
if (iter == m_pMapGlobalWeightInt.end()) return NULL;
return iter->second;
}
float CDNExtManager::GetGlobalWeightIntValueFloat(int nID)
{
if (nID <= 0) return 0.f;
TGlobalWeightIntData *pData = GetGlobalWeightIntData(nID);
if (!pData) return 0.f;
return (float)pData->nValue;
}
int CDNExtManager::GetGlobalWeightIntValue(int nID)
{
if (nID <= 0) return 0;
TGlobalWeightIntData *pData = GetGlobalWeightIntData(nID);
if (!pData) return 0;
return pData->nValue;
}
// Cash
bool CDNExtManager::ReLoadCashCommodity()
{
return LoadCashCommodity(true);
}
bool CDNExtManager::ReLoadCashPackage()
{
return LoadCashPackage(true);
}
bool CDNExtManager::LoadCashCommodity(bool bReload)
{
DNTableFileFormat *pSox = LoadExtTable( "CashCommodity" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"CashCommodity failed\r\n");
SAFE_DELETE(pSox);
return false;
}
TMapCashCommodity BackupMapCashCommodity;
if (bReload)
{
ScopeLock <CSyncLock> Lock(m_Sync);
BackupMapCashCommodity = m_pMapCashCommodity;
m_pMapCashCommodity.clear();
}
char szTemp[MAX_PATH] = { 0, };
//##################################################################
// FieldNum <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>
//##################################################################
struct TempFieldNum
{
int _SN;
#if defined(_JP)
int _SNJPN;
#endif // #if defined(_JP)
int _Category;
int _SubCategory;
int _NameID;
std::vector<int> _ItemID;
std::vector<int> _LinkSN;
int _Period;
int _Price;
int _Count;
int _Priority;
int _OnSale;
int _OnSaleReal;
int _State;
int _Limit;
int _ReserveGive;
int _Reserve;
int _validity;
int _ReserveAble;
int _PresentAble;
int _ItemSort;
int _PriceFix;
int _CartAble;
int _VIPSell;
int _VIPLevel;
int _Pay;
int _PaySale;
int _VIPPoint;
#if defined(PRE_ADD_CASH_REFUND)
int _NoRefund;
#endif
#if defined(PRE_ADD_SALE_COUPON)
int _UseCoupon;
#endif
#if defined( PRE_ADD_NEW_MONEY_SEED )
int _SeedAble;
int _Seed;
int _SeedGive;
#endif
};
TempFieldNum sFieldNum;
sFieldNum._SN = pSox->GetFieldNum("_SN");
#if defined(_JP)
sFieldNum._SNJPN = pSox->GetFieldNum("_SNJPN");
#endif // #if defined(_JP)
sFieldNum._Category = pSox->GetFieldNum("_Category");
sFieldNum._SubCategory = pSox->GetFieldNum("_SubCategory");
sFieldNum._NameID = pSox->GetFieldNum("_NameID");
sFieldNum._ItemID.reserve(COMMODITYITEMMAX);
for (int j = 0; j < COMMODITYITEMMAX; ++j){
sprintf_s(szTemp, "_ItemID%02d", j + 1);
sFieldNum._ItemID.push_back(pSox->GetFieldNum(szTemp));
}
sFieldNum._LinkSN.reserve(COMMODITYLINKMAX);
for (int j = 0; j < COMMODITYLINKMAX; ++j){
sprintf_s(szTemp, "_LinkSN%02d", j + 1);
sFieldNum._LinkSN.push_back(pSox->GetFieldNum(szTemp));
}
sFieldNum._Period = pSox->GetFieldNum("_Period");
sFieldNum._Price = pSox->GetFieldNum("_Price");
sFieldNum._Count = pSox->GetFieldNum("_Count");
sFieldNum._Priority = pSox->GetFieldNum("_Priority");
sFieldNum._OnSale = pSox->GetFieldNum("_OnSale");
sFieldNum._OnSaleReal = pSox->GetFieldNum("_OnSaleREAL");
sFieldNum._State = pSox->GetFieldNum("_State");
sFieldNum._Limit = pSox->GetFieldNum("_Limit");
sFieldNum._ReserveGive = pSox->GetFieldNum("_ReserveGive");
sFieldNum._Reserve = pSox->GetFieldNum("_Reserve");
sFieldNum._validity = pSox->GetFieldNum("_validity");
sFieldNum._ReserveAble = pSox->GetFieldNum("_ReserveAble");
sFieldNum._PresentAble = pSox->GetFieldNum("_PresentAble");
sFieldNum._ItemSort = pSox->GetFieldNum("_ItemSort");
sFieldNum._PriceFix = pSox->GetFieldNum("_PriceFix");
sFieldNum._CartAble = pSox->GetFieldNum("_CartAble");
sFieldNum._VIPSell = pSox->GetFieldNum("_VIPSell");
sFieldNum._VIPLevel = pSox->GetFieldNum("_VIPLevel");
sFieldNum._Pay = pSox->GetFieldNum("_Pay");
sFieldNum._PaySale = pSox->GetFieldNum("_PaySale");
sFieldNum._VIPPoint = pSox->GetFieldNum("_VIPPoint");
#if defined(PRE_ADD_CASH_REFUND)
sFieldNum._NoRefund = pSox->GetFieldNum("_NoRefund");
#endif
#if defined(PRE_ADD_SALE_COUPON)
sFieldNum._UseCoupon = pSox->GetFieldNum("_UseCoupon");
#endif //#if defined(PRE_ADD_SALE_COUPON)
#if defined( PRE_ADD_NEW_MONEY_SEED )
sFieldNum._SeedAble = pSox->GetFieldNum("_SeedAble");
sFieldNum._Seed = pSox->GetFieldNum("_Seed");
sFieldNum._SeedGive = pSox->GetFieldNum("_SeedGive");
#endif
//##################################################################
// Load
//##################################################################
char *pStr = NULL, Dest[256] = {0,};
int nJob = 0;
for (int i = 0; i < pSox->GetItemCount(); i++){
TCashCommodityData *pCashData = new TCashCommodityData;
memset(pCashData, 0, sizeof(TCashCommodityData));
int nID = pSox->GetItemID(i);
int nIdx = pSox->GetIDXprimary(nID);
pCashData->nSN = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._SN)->GetInteger();
#if defined(_JP)
pCashData->strJPSN = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._SNJPN)->GetString();
#endif // #if defined(_JP)
pCashData->cCategory = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Category)->GetInteger();
pCashData->nSubCategory = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._SubCategory)->GetInteger();
#if defined(_CASHSERVER)
int nNameID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._NameID)->GetInteger();
if( nNameID > 0 )
{
std::wstring wStr = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, nNameID);
ToMultiString(wStr, pCashData->strName);
}
#endif // #if defined(_CASHSERVER)
for (int j = 0; j < COMMODITYITEMMAX; j++){
pCashData->nItemID[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ItemID[j])->GetInteger();
}
for (int j = 0; j < COMMODITYLINKMAX; j++){
pCashData->nLinkSN[j] = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._LinkSN[j])->GetInteger();
}
pCashData->wPeriod = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Period)->GetInteger();
pCashData->nPrice = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Price)->GetInteger();
pCashData->nCount = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Count)->GetInteger();
pCashData->nPriority = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Priority)->GetInteger();
pCashData->bOnSale = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._OnSale)->GetInteger() ? true : false;
pCashData->bOnSaleReal = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._OnSaleReal)->GetInteger() ? true : false;
pCashData->cState = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._State)->GetInteger();
pCashData->bLimit = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Limit)->GetInteger() ? true : false;
pCashData->bReserveGive = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ReserveGive)->GetInteger() ? true : false;
pCashData->nReserve = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Reserve)->GetInteger();
pCashData->nValidity = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._validity)->GetInteger();
pCashData->bReserveAble = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ReserveAble)->GetInteger() ? true : false;
pCashData->bPresentAble = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._PresentAble)->GetInteger() ? true : false;
pCashData->cItemSort = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ItemSort)->GetInteger();
pCashData->nPriceFix = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._PriceFix)->GetInteger();
pCashData->bCartAble = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._CartAble)->GetInteger() ? true : false;
pCashData->bVIPSell = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._VIPSell)->GetInteger() ? true : false;
pCashData->nVIPLevel = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._VIPLevel)->GetInteger();
pCashData->bAutomaticPay = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Pay)->GetInteger() ? true : false;
pCashData->nAutomaticPaySale = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._PaySale)->GetInteger();
pCashData->nVIPPoint = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._VIPPoint)->GetInteger();
#if defined(PRE_ADD_CASH_REFUND)
pCashData->bNoRefund = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._NoRefund)->GetInteger() ? true : false;
#endif
#if defined(PRE_ADD_SALE_COUPON)
pCashData->bUseCoupon = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._UseCoupon)->GetInteger() ? true : false;
#endif
#if defined( PRE_ADD_NEW_MONEY_SEED )
pCashData->bSeedAble = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._SeedAble)->GetInteger() ? true : false;
pCashData->bSeedGive = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._SeedGive)->GetInteger() ? true : false;
if( pCashData->bSeedGive )
pCashData->nSeed = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._Seed)->GetInteger();
#endif
ScopeLock <CSyncLock> Lock(m_Sync);
std::pair<TMapCashCommodity::iterator,bool> Ret = m_pMapCashCommodity.insert(make_pair(pCashData->nSN, pCashData));
if (Ret.second == false) delete pCashData;
}
SAFE_DELETE( pSox );
if (bReload)
{
ScopeLock <CSyncLock> Lock(m_Sync);
SAFE_DELETE_PMAP(TMapCashCommodity, BackupMapCashCommodity);
}
return true;
}
bool CDNExtManager::GetCashCommodityData(int nSN, TCashCommodityData &Data)
{
ScopeLock <CSyncLock> Lock(m_Sync);
TMapCashCommodity::iterator iter = m_pMapCashCommodity.find(nSN);
if (m_pMapCashCommodity.end() != iter)
{
Data = *(*iter).second;
return true;
}
return false;
}
int CDNExtManager::GetCashCommodityPrice(int nSN)
{
ScopeLock <CSyncLock> Lock(m_Sync);
TMapCashCommodity::iterator iter = m_pMapCashCommodity.find(nSN);
if (m_pMapCashCommodity.end() != iter)
return (*iter).second->nPrice; //-1<><31> <20><>¥
return 0;
}
bool CDNExtManager::IsReserveCommodity(int nSN)
{
ScopeLock <CSyncLock> Lock(m_Sync);
TMapCashCommodity::iterator iter = m_pMapCashCommodity.find(nSN);
if (m_pMapCashCommodity.end() != iter)
return (*iter).second->bReserveAble;
return false;
}
bool CDNExtManager::IsPresentCommodity(int nSN)
{
ScopeLock <CSyncLock> Lock(m_Sync);
TMapCashCommodity::iterator iter = m_pMapCashCommodity.find(nSN);
if (m_pMapCashCommodity.end() != iter)
return (*iter).second->bPresentAble;
return false;
}
bool CDNExtManager::IsOnSaleCommodity(int nSN)
{
ScopeLock <CSyncLock> Lock(m_Sync);
TMapCashCommodity::iterator iter = m_pMapCashCommodity.find(nSN);
if (m_pMapCashCommodity.end() != iter)
return (*iter).second->bOnSaleReal;
return false;
}
bool CDNExtManager::IsLimitCommodity(int nSN)
{
ScopeLock <CSyncLock> Lock(m_Sync);
TMapCashCommodity::iterator iter = m_pMapCashCommodity.find(nSN);
if (m_pMapCashCommodity.end() != iter)
return (*iter).second->bLimit;
return false;
}
int CDNExtManager::GetCashCommodityPeriod(int nSN)
{
ScopeLock <CSyncLock> Lock(m_Sync);
TMapCashCommodity::iterator iter = m_pMapCashCommodity.find(nSN);
if (m_pMapCashCommodity.end() != iter)
return (*iter).second->wPeriod; // -1<><31> <20><><EFBFBD><EFBFBD>
return 0;
}
int CDNExtManager::GetCashCommodityCount(int nSN)
{
ScopeLock <CSyncLock> Lock(m_Sync);
TMapCashCommodity::iterator iter = m_pMapCashCommodity.find(nSN);
if (m_pMapCashCommodity.end() != iter)
return (*iter).second->nCount;
return 0;
}
int CDNExtManager::GetCashCommodityReserve(int nSN)
{
ScopeLock <CSyncLock> Lock(m_Sync);
TMapCashCommodity::iterator iter = m_pMapCashCommodity.find(nSN);
if (m_pMapCashCommodity.end() != iter)
return (*iter).second->nReserve;
return 0;
}
#if defined( PRE_ADD_NEW_MONEY_SEED )
int CDNExtManager::GetCashCommoditySeed(int nSN)
{
ScopeLock <CSyncLock> Lock(m_Sync);
TMapCashCommodity::iterator iter = m_pMapCashCommodity.find(nSN);
if (m_pMapCashCommodity.end() != iter)
return (*iter).second->nSeed;
return 0;
}
#endif
bool CDNExtManager::GetCashCommodityName(int nSN, std::string &outStr)
{
ScopeLock <CSyncLock> Lock(m_Sync);
TMapCashCommodity::iterator iter = m_pMapCashCommodity.find(nSN);
if (m_pMapCashCommodity.end() != iter)
{
outStr = (*iter).second->strName;
return true;
}
return false;
}
bool CDNExtManager::GetCashCommodityNameW(int nSN, std::wstring &outStr)
{
std::string strItemName;
GetCashCommodityName(nSN, strItemName);
USES_CONVERSION;
outStr = A2CW(strItemName.c_str());
return true;
}
#if defined(_JP)
bool CDNExtManager::GetCashCommodityJPSN(int nSN, std::string &outStr)
{
ScopeLock <CSyncLock> Lock(m_Sync);
TMapCashCommodity::iterator iter = m_pMapCashCommodity.find(nSN);
if (m_pMapCashCommodity.end() != iter)
{
outStr = (*iter).second->strJPSN.c_str();
return true;
}
return false;
}
#endif // #if defined(_JP)
int CDNExtManager::GetCashCommodityItem0(int nSN)
{
ScopeLock <CSyncLock> Lock(m_Sync);
TMapCashCommodity::iterator iter = m_pMapCashCommodity.find(nSN);
if (m_pMapCashCommodity.end() != iter)
return (*iter).second->nItemID[0];
return 0;
}
int CDNExtManager::GetCashCommodityVIPPoint(int nSN)
{
ScopeLock <CSyncLock> Lock(m_Sync);
TMapCashCommodity::iterator iter = m_pMapCashCommodity.find(nSN);
if (m_pMapCashCommodity.end() != iter)
return (*iter).second->nVIPPoint;
return 0;
}
bool CDNExtManager::GetCashCommodityPay(int nSN)
{
ScopeLock <CSyncLock> Lock(m_Sync);
TMapCashCommodity::iterator iter = m_pMapCashCommodity.find(nSN);
if (m_pMapCashCommodity.end() != iter)
return (*iter).second->bAutomaticPay;
return 0;
}
int CDNExtManager::GetCashCommodityPaySale(int nSN)
{
ScopeLock <CSyncLock> Lock(m_Sync);
TMapCashCommodity::iterator iter = m_pMapCashCommodity.find(nSN);
if (m_pMapCashCommodity.end() != iter)
return (*iter).second->nAutomaticPaySale;
return 0;
}
int CDNExtManager::GetCashCommodityVIPAutomaticPaySalePrice(int nSN)
{
ScopeLock <CSyncLock> Lock(m_Sync);
TMapCashCommodity::iterator iter = m_pMapCashCommodity.find(nSN);
if (m_pMapCashCommodity.end() != iter)
return (*iter).second->nPrice - (int)((*iter).second->nPrice * (*iter).second->nAutomaticPaySale / 100);
return 0;
}
void CDNExtManager::SetProhibitSaleList()
{
#if defined(_CASHSERVER) || defined(_DBSERVER)
#if defined(_CASHSERVER)
CDNSQLMembership *pMembershipDB = g_pSQLManager->FindMembershipDB(0);
#elif defined(_DBSERVER)
CDNSQLMembership *pMembershipDB = g_SQLConnectionManager.FindMembershipDB(0);
#endif // _CASHSERVER, _DBSERVER
if (!pMembershipDB) return;
m_VecProhibitSaleList.clear();
pMembershipDB->QueryGetListBanOfSale(g_pExtManager->m_VecProhibitSaleList);
ReLoadCashCommodity();
#endif // #if defined(_CASHSERVER) || defined(_DBSERVER)
if (m_VecProhibitSaleList.empty()) return;
ScopeLock <CSyncLock> Lock(m_Sync);
TCashCommodityData *pCashData = NULL;
for (int i = 0; i < (int)m_VecProhibitSaleList.size(); i++)
{
TMapCashCommodity::iterator iter = m_pMapCashCommodity.find(m_VecProhibitSaleList[i]);
if (m_pMapCashCommodity.end() != iter)
(*iter).second->bOnSaleReal = false;
}
}
#if defined(PRE_ADD_CASH_REFUND)
bool CDNExtManager::GetCashCommodityNoRefund(int nID, int nSN)
{
ScopeLock <CSyncLock> Lock(m_Sync);
TCashCommodityData *pCashData = NULL;
TMapCashCommodity::iterator iter = m_pMapCashCommodity.find(nSN);
if (m_pMapCashCommodity.end() != iter)
pCashData = (*iter).second;
bool bResult;
if (!pCashData)
{
bResult = true; // <20>Ұ<EFBFBD><D2B0><EFBFBD>..
return bResult;
}
bResult = pCashData->bNoRefund;
if( !bResult && nID > 0) // ȯ<><C8AF> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѹ<EFBFBD> <20><> Ȯ<><C8AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..<2E><>ȹ<EFBFBD><C8B9> <20>Ǽ<EFBFBD> <20><><EFBFBD><EFBFBD>..
{
BYTE bType = GetItemMainType(nID);
switch(bType)
{
case ITEMTYPE_REBIRTH_COIN :
case ITEMTYPE_INVENTORY_SLOT :
case ITEMTYPE_WAREHOUSE_SLOT :
case ITEMTYPE_GESTURE :
case ITEMTYPE_GUILDWARE_SLOT :
case ITEMTYPE_FARM_VIP:
case ITEMTYPE_GLYPH_SLOT:
case ITEMTYPE_PERIOD_PLATE:
#if defined(PRE_ADD_TALISMAN_SYSTEM)
case ITEMTYPE_PERIOD_TALISMAN_EX:
#endif
bResult = true;
break;
}
}
return bResult;
}
#endif
#if defined(PRE_ADD_SALE_COUPON)
bool CDNExtManager::GetCashCommodityUseCoupon(int nSN)
{
ScopeLock <CSyncLock> Lock(m_Sync);
TCashCommodityData *pCashData = NULL;
TMapCashCommodity::iterator iter = m_pMapCashCommodity.find(nSN);
if (m_pMapCashCommodity.end() != iter)
pCashData = (*iter).second;
if (!pCashData)
return false;
return pCashData->bUseCoupon;
}
#endif
bool CDNExtManager::LoadCashPackage(bool bReload)
{
DNTableFileFormat *pSox = LoadExtTable( "CashPackageTable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"CashPackageTable failed\r\n");
SAFE_DELETE(pSox);
return false;
}
TMapCashPackage BackupMapCashPackage;
if (bReload)
{
ScopeLock <CSyncLock> Lock(m_Sync);
BackupMapCashPackage = m_pMapCashPackage;
m_pMapCashPackage.clear();
}
char szTemp[MAX_PATH] = { 0, };
//##################################################################
// FieldNum <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>
//##################################################################
struct TempFieldNum
{
int _SN;
std::vector<int> _CommodityID;
};
TempFieldNum sFieldNum;
sFieldNum._SN = pSox->GetFieldNum("_SN");
sFieldNum._CommodityID.reserve(PACKAGEITEMMAX);
for (int j = 0; j < PACKAGEITEMMAX; ++j){
sprintf_s(szTemp, "_CommodityID%02d", j);
sFieldNum._CommodityID.push_back(pSox->GetFieldNum(szTemp));
}
//##################################################################
// Load
//##################################################################
for (int i = 0; i < pSox->GetItemCount(); i++){
TCashPackageData *pCashData = new TCashPackageData;
memset(pCashData, 0, sizeof(TCashPackageData));
int nID = pSox->GetItemID(i);
int nIdx = pSox->GetIDXprimary(nID);
pCashData->nSN = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._SN)->GetInteger();
for (int j = 0; j < PACKAGEITEMMAX; j++){
int nItemSN = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._CommodityID[j])->GetInteger();
if (nItemSN > 0)
pCashData->nVecCommoditySN.push_back(nItemSN);
}
ScopeLock <CSyncLock> Lock(m_Sync);
std::pair<TMapCashPackage::iterator,bool> Ret = m_pMapCashPackage.insert(make_pair(pCashData->nSN, pCashData));
if (Ret.second == false) delete pCashData;
}
if (bReload)
{
ScopeLock <CSyncLock> Lock(m_Sync);
SAFE_DELETE_PMAP(TMapCashPackage, BackupMapCashPackage);
}
SAFE_DELETE( pSox );
return true;
}
bool CDNExtManager::GetCashPackageData(int nSN, TCashPackageData &Data)
{
ScopeLock <CSyncLock> Lock(m_Sync);
TMapCashPackage::iterator iter = m_pMapCashPackage.find(nSN);
if (iter != m_pMapCashPackage.end())
{
Data = *(*iter).second;
return true;
}
return false;
}
bool CDNExtManager::LoadCashLimit()
{
DNTableFileFormat *pSox = LoadExtTable( "CashLimitTable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"CashLimitTable failed\r\n");
SAFE_DELETE(pSox);
return false;
}
char szTemp[MAX_PATH] = { 0, };
//##################################################################
// FieldNum <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>
//##################################################################
struct TempFieldNum
{
int _SN;
int _StartDate;
int _EndDate;
int _BuyAbleCount;
#if defined(PRE_ADD_LIMITED_CASHITEM)
int _SellCount;
#endif //#if defined(PRE_ADD_LIMITED_CASHITEM)
};
TempFieldNum sFieldNum;
sFieldNum._SN = pSox->GetFieldNum("_SN");
sFieldNum._StartDate = pSox->GetFieldNum("_StartDate");
sFieldNum._EndDate = pSox->GetFieldNum("_EndDate");
sFieldNum._BuyAbleCount = pSox->GetFieldNum("_BuyAbleCount");
#if defined(PRE_ADD_LIMITED_CASHITEM)
sFieldNum._SellCount = pSox->GetFieldNum("_Sellcount");
#endif //#if defined(PRE_ADD_LIMITED_CASHITEM)
//##################################################################
// Load
//##################################################################
for (int i = 0; i < pSox->GetItemCount(); i++){
TCashLimitData *pCashData = new TCashLimitData;
memset(pCashData, 0, sizeof(TCashLimitData));
int nID = pSox->GetItemID(i);
int nIdx = pSox->GetIDXprimary(nID);
pCashData->nSN = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._SN)->GetInteger();
std::string strStartDate = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._StartDate)->GetString();
std::string strEndDate = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._EndDate)->GetString();
pCashData->tStartDate = GetTimeForTextDate(strStartDate);
pCashData->tEndDate = GetTimeForTextDate(strEndDate);
pCashData->nBuyAbleCount = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._BuyAbleCount)->GetInteger();
#if defined(PRE_ADD_LIMITED_CASHITEM)
pCashData->nLimitedSellCount = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._SellCount)->GetInteger();
#endif //#if defined(PRE_ADD_LIMITED_CASHITEM)
std::pair<TMapCashLimit::iterator,bool> Ret = m_pMapCashLimit.insert(make_pair(pCashData->nSN, pCashData));
if (Ret.second == false) delete pCashData;
}
SAFE_DELETE( pSox );
return true;
}
time_t CDNExtManager::GetTimeForTextDate(std::string& strDate)
{
std::vector<std::string> tokens;
TokenizeA(strDate, tokens, "/");
if( tokens.size() != 3 ) // 00/00/00 Format
return 0;
struct tm _tm={0,};
#if defined(_US) // USA mm/dd/yy <20><>/<2F><>/<2F><>
_tm.tm_mon = atoi(tokens[0].c_str())-1;
_tm.tm_mday = atoi(tokens[1].c_str());
_tm.tm_year = atoi(tokens[2].c_str());
if( _tm.tm_year < 2000 )
_tm.tm_year += 2000;
_tm.tm_year -= 1900;
#elif defined(_RU) // RUS dd/mm/yy <20><>/<2F><>/<2F><>
_tm.tm_mday = atoi(tokens[0].c_str());
_tm.tm_mon = atoi(tokens[1].c_str())-1;
_tm.tm_year = atoi(tokens[2].c_str());
if( _tm.tm_year < 2000 )
_tm.tm_year += 2000;
_tm.tm_year -= 1900;
#else // yy/mm/dd <20><>/<2F><>/<2F><>
_tm.tm_year = atoi(tokens[0].c_str());
if( _tm.tm_year < 2000 )
_tm.tm_year += 2000;
_tm.tm_year -= 1900;
_tm.tm_mon = atoi(tokens[1].c_str())-1;
_tm.tm_mday = atoi(tokens[2].c_str());
#endif
return mktime(&_tm);
}
bool CDNExtManager::IsOnSaleDate(int nSN)
{
if (IsLimitCommodity(nSN) == false) return true; // <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20>ƴ<EFBFBD>
TCashLimitData *pCash = GetCashLimitData(nSN);
if (pCash)
{
time_t now;
now = time(NULL);
if( pCash->tStartDate > 0 && pCash->tEndDate > 0 )
{
struct tm tm_now, tm_end;
localtime_s(&tm_now, &now);
localtime_s(&tm_end, &pCash->tEndDate);
if( tm_now.tm_year > tm_end.tm_year )
return false;
// 365<36><35> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..tm_yday
if( tm_now.tm_year == tm_end.tm_year && tm_now.tm_yday > tm_end.tm_yday )
return false;
return true;
}
}
return true; // CashLimitTable<6C><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȥ<>ó<EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD>ؼ<EFBFBD> <20>ǸŰ<C7B8> <20>ȵɱ<C8B5><C9B1><EFBFBD>.
}
TCashLimitData *CDNExtManager::GetCashLimitData(int nSN)
{
TMapCashLimit::iterator iter = m_pMapCashLimit.find(nSN);
if (iter != m_pMapCashLimit.end()) return iter->second;
return NULL;
}
int CDNExtManager::GetCashBuyAbleCount(int nSN)
{
TCashLimitData *pCash = GetCashLimitData(nSN);
if (pCash) return pCash->nBuyAbleCount;
return 0;
}
#if defined(PRE_ADD_LIMITED_CASHITEM) && defined(_CASHSERVER)
int CDNExtManager::GetCashLimitedItemCount(int nSN)
{
TCashLimitData *pCash = GetCashLimitData(nSN);
if (pCash)
{
int nLimitMax = 0;
if (g_pLimitedCashItemRepository && g_pLimitedCashItemRepository->GetChangedLimitedItemMax(nSN, nLimitMax))
return nLimitMax;
return pCash->nLimitedSellCount;
}
return 0;
}
#endif //#if defined(PRE_ADD_LIMITED_CASHITEM) && defined(_CASHSERVER)
bool CDNExtManager::LoadItemData()
{
DNTableFileFormat *pSox = LoadExtTable( "ItemTable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"ItemTable failed\r\n");
SAFE_DELETE(pSox);
return false;
}
//##################################################################
// FieldNum <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>
//##################################################################
struct TempFieldNum
{
int _NameID;
int _NameIDParam;
int _Type;
int _TypeParam1;
int _TypeParam2;
int _LevelLimit;
int _Rank;
int _Reversion;
int _IsCash;
int _IsAuthentication;
int _IsDestruction;
int _Amount;
int _SellAmount;
int _OverlapCount;
int _SkillID;
int _SkillLevel;
int _SkillUsingType;
int _AllowMapTypes;
int _NeedJobClass;
int _EnchantID;
int _SealCount;
int _NeedBuyItem;
int _NeedBuyItemCount;
int _NeedPvPRank;
};
TempFieldNum sFieldNum;
sFieldNum._NameID = pSox->GetFieldNum( "_NameID" );
sFieldNum._NameIDParam = pSox->GetFieldNum( "_NameIDParam" );
sFieldNum._Type = pSox->GetFieldNum( "_Type" );
sFieldNum._TypeParam1 = pSox->GetFieldNum( "_TypeParam1" );
sFieldNum._TypeParam2 = pSox->GetFieldNum( "_TypeParam2" );
sFieldNum._LevelLimit = pSox->GetFieldNum( "_LevelLimit" );
sFieldNum._Rank = pSox->GetFieldNum( "_Rank" );
sFieldNum._Reversion = pSox->GetFieldNum( "_Reversion" );
sFieldNum._IsCash = pSox->GetFieldNum( "_IsCash" );
sFieldNum._IsAuthentication = pSox->GetFieldNum( "_IsAuthentication" );
sFieldNum._IsDestruction = pSox->GetFieldNum( "_IsDestruction" );
sFieldNum._Amount = pSox->GetFieldNum( "_Amount" );
sFieldNum._SellAmount = pSox->GetFieldNum( "_SellAmount" );
sFieldNum._OverlapCount = pSox->GetFieldNum( "_OverlapCount" );
sFieldNum._SkillID = pSox->GetFieldNum( "_SkillID" );
sFieldNum._SkillLevel = pSox->GetFieldNum( "_SkillLevel" );
sFieldNum._SkillUsingType = pSox->GetFieldNum( "_SkillUsingType" );
sFieldNum._AllowMapTypes = pSox->GetFieldNum( "_AllowMapTypes" );
sFieldNum._NeedJobClass = pSox->GetFieldNum( "_NeedJobClass" );
sFieldNum._EnchantID = pSox->GetFieldNum( "_EnchantID" );
sFieldNum._SealCount = pSox->GetFieldNum( "_SealCount" );
sFieldNum._NeedBuyItem = pSox->GetFieldNum( "_NeedBuyItem" );
sFieldNum._NeedBuyItemCount = pSox->GetFieldNum( "_NeedBuyItemCount" );
sFieldNum._NeedPvPRank = pSox->GetFieldNum( "_NeedPvPRank" );
//##################################################################
// Load
//##################################################################
for (int i = 0; i < pSox->GetItemCount(); i++)
{
TItemData* pItemData = new TItemData;
pItemData->Reset();
pItemData->nItemID = pSox->GetItemID(i);
int iIdx = pSox->GetIDXprimary( pItemData->nItemID );
pItemData->nType = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Type )->GetInteger();
pItemData->nTypeParam[0] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._TypeParam1 )->GetInteger();
pItemData->nTypeParam[1] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._TypeParam2 )->GetInteger();
pItemData->cLevelLimit = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._LevelLimit )->GetInteger();
pItemData->cRank = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Rank )->GetInteger();
pItemData->cReversion = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Reversion )->GetInteger();
pItemData->IsCash = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._IsCash )->GetInteger() ? true : false;
pItemData->IsAuthentication = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._IsAuthentication )->GetInteger() ? true : false;
pItemData->IsDestruction = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._IsDestruction )->GetInteger() ? true : false;
pItemData->nAmount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Amount )->GetInteger();
pItemData->nSellAmount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._SellAmount )->GetInteger();
pItemData->nOverlapCount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._OverlapCount )->GetInteger();
pItemData->nSkillID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._SkillID )->GetInteger();
pItemData->cSkillLevel = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._SkillLevel )->GetInteger();
pItemData->cSkillUsingType = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._SkillUsingType )->GetInteger();
pItemData->nAllowMapType = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._AllowMapTypes )->GetInteger();
pItemData->nNeedBuyItemID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._NeedBuyItem )->GetInteger();
pItemData->nNeedBuyItemCount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._NeedBuyItemCount )->GetInteger();
pItemData->nNeedPvPRank = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._NeedPvPRank )->GetInteger();
std::vector<std::string> JobTokens;
char *pStr = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._NeedJobClass )->GetString();
TokenizeA(pStr, JobTokens, ";");
for (int j = 0; j < (int)JobTokens.size(); j++){
int iJob = atoi(JobTokens[j].c_str());
if( iJob > 0 )
pItemData->nNeedJobClassList.push_back(iJob);
}
pItemData->nEnchantID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._EnchantID)->GetInteger();
pItemData->cSealCount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._SealCount )->GetInteger();
std::pair<TMapItemData::iterator,bool> Ret = m_pItemData.insert(make_pair(pItemData->nItemID, pItemData));
if( Ret.second == false )
delete pItemData;
}
SAFE_DELETE( pSox );
return true;
}
TItemData* CDNExtManager::GetItemData(int nItemID)
{
if (nItemID <= 0) return NULL;
TMapItemData::iterator iter = m_pItemData.find(nItemID);
if (iter != m_pItemData.end()){
return iter->second;
}
return NULL;
}
int CDNExtManager::GetItemMainType(int nItemID)
{
if (nItemID <= 0) return 0;
TItemData *pItemData = GetItemData(nItemID);
if (!pItemData) return 0;
return pItemData->nType;
}
int CDNExtManager::GetItemOverlapCount(int nItemID)
{
if (nItemID <= 0) return 0;
TItemData *pItemData = GetItemData(nItemID);
if (!pItemData) return 0;
return pItemData->nOverlapCount;
}
bool CDNExtManager::IsCashItem(int nItemID)
{
if (nItemID <= 0) return false;
TItemData *pItemData = GetItemData(nItemID);
if (!pItemData) return false;
return pItemData->IsCash;
}
// VehicleTable
bool CDNExtManager::LoadVehicleData()
{
DNTableFileFormat *pSox = LoadExtTable( "vehicletable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"vehicletable failed\r\n" );
SAFE_DELETE(pSox);
return false;
}
if( pSox->GetItemCount() <= 0 )
{
g_Log.Log( LogType::_FILELOG, L"vehicletable Count(%d)\r\n", pSox->GetItemCount() );
SAFE_DELETE(pSox);
return false;
}
//##################################################################
// FieldNum <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>
//##################################################################
struct TempFieldNum
{
int _VehicleClassID;
int _VehicleActorID;
int _DefaultBodyParts;
int _DefaultPartsA;
int _DefaultPartsB;
int _VehicleSummonTime;
int _VehicleDefaultSpeed;
int _nPetLevelTypeID;
int _nPetSkillID1;
int _nPetSkillID2;
int _nRange;
};
TempFieldNum sFieldNum;
sFieldNum._VehicleClassID = pSox->GetFieldNum("_VehicleClassID");
sFieldNum._VehicleActorID = pSox->GetFieldNum("_VehicleActorID");
sFieldNum._DefaultBodyParts = pSox->GetFieldNum("_DefaultBodyParts");
sFieldNum._DefaultPartsA = pSox->GetFieldNum("_DefaultPartsA");
sFieldNum._DefaultPartsB = pSox->GetFieldNum("_DefaultPartsB");
sFieldNum._VehicleSummonTime = pSox->GetFieldNum("_VehicleSummonTime");
sFieldNum._VehicleDefaultSpeed = pSox->GetFieldNum("_VehicleDefaultSpeed");
sFieldNum._nPetLevelTypeID = pSox->GetFieldNum("_PetLevelTypeID");
sFieldNum._nPetSkillID1 = pSox->GetFieldNum("_PetSKILLID1");
sFieldNum._nPetSkillID2 = pSox->GetFieldNum("_PetSKILLID2");
sFieldNum._nRange = pSox->GetFieldNum("_Range");
//##################################################################
// Load
//##################################################################
for (int i = 0; i < pSox->GetItemCount(); ++i)
{
int nItemID = pSox->GetItemID(i);
int nIdx = pSox->GetIDXprimary(nItemID);
TVehicleData Data = {0, };
Data.nItemID = nItemID;
Data.nVehicleClassID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._VehicleClassID)->GetInteger();
Data.nVehicleActorID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._VehicleActorID)->GetInteger();
Data.nDefaultBody = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._DefaultBodyParts)->GetInteger();
Data.nDefaultParts1 = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._DefaultPartsA)->GetInteger();
Data.nDefaultParts2 = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._DefaultPartsB)->GetInteger();
Data.nVehicleSummonTime = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._VehicleSummonTime)->GetInteger();
Data.nVehicleDefaultSpeed = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._VehicleDefaultSpeed)->GetInteger();
Data.nPetLevelTypeID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nPetLevelTypeID)->GetInteger();
Data.nPetSkillID1 = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nPetSkillID1)->GetInteger();
Data.nPetSkillID2 = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nPetSkillID2)->GetInteger();
Data.nRange = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._nRange)->GetInteger();
m_MapVehicle.insert(make_pair(Data.nItemID, Data));
}
SAFE_DELETE(pSox);
return true;
}
TVehicleData *CDNExtManager::GetVehicleData(int nItemID)
{
if (nItemID <= 0) return NULL;
TMapVehicleData::iterator iter = m_MapVehicle.find(nItemID);
if (iter == m_MapVehicle.end()) return NULL;
return &(iter->second);
}
int CDNExtManager::GetVehicleClassID(int nItemID)
{
TVehicleData *pVehicle = GetVehicleData(nItemID);
if (!pVehicle) return 0;
return pVehicle->nVehicleClassID;
}
// VehiclePartsTable
bool CDNExtManager::LoadVehiclePartsData()
{
DNTableFileFormat *pSox = LoadExtTable( "vehiclepartstable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"vehiclepartstable failed\r\n" );
SAFE_DELETE(pSox);
return false;
}
if( pSox->GetItemCount() <= 0 )
{
g_Log.Log( LogType::_FILELOG, L"vehiclepartstable Count(%d)\r\n", pSox->GetItemCount() );
SAFE_DELETE(pSox);
return false;
}
//##################################################################
// FieldNum <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>
//##################################################################
struct TempFieldNum
{
int _VehicleClassID;
int _VehiclePartsType;
int _SkinName;
int _AniName;
int _ActName;
int _SkinColor;
};
TempFieldNum sFieldNum;
sFieldNum._VehicleClassID = pSox->GetFieldNum("_VehicleClassID");
sFieldNum._VehiclePartsType = pSox->GetFieldNum("_VehiclePartsType");
sFieldNum._SkinName = pSox->GetFieldNum("_SkinName");
sFieldNum._AniName = pSox->GetFieldNum("_AniName");
sFieldNum._ActName = pSox->GetFieldNum("_ActName");
sFieldNum._SkinColor = pSox->GetFieldNum("_SkinColor");
//##################################################################
// Load
//##################################################################
for (int i = 0; i < pSox->GetItemCount(); ++i)
{
int nItemID = pSox->GetItemID(i);
int nIdx = pSox->GetIDXprimary(nItemID);
//TVehiclePartsData Data = {0, };
//2010.10.7 haling STL <20><>ȣ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD> <20><>ȯ
TVehiclePartsData Data;
Data.nItemID = nItemID;
Data.nVehicleClassID = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._VehicleClassID)->GetInteger();
Data.nVehiclePartsType = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._VehiclePartsType)->GetInteger() + 1;
Data.strSkinName = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._SkinName)->GetString();
Data.strAniName = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._AniName)->GetString();
Data.strActName = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._ActName)->GetString();
Data.nSkinColor = pSox->GetFieldFromLablePtr(nIdx, sFieldNum._SkinColor)->GetInteger();
m_MapVehicleParts.insert(make_pair(Data.nItemID, Data));
}
SAFE_DELETE(pSox);
return true;
}
TVehiclePartsData *CDNExtManager::GetVehiclePartsData(int nItemID)
{
if (nItemID <= 0) return NULL;
TMapVehicleParts::iterator iter = m_MapVehicleParts.find(nItemID);
if (iter == m_MapVehicleParts.end()) return NULL;
return &(iter->second);
}
int CDNExtManager::GetVehiclePartsType(int nItemID)
{
TVehiclePartsData *pVehicle = GetVehiclePartsData(nItemID);
if (!pVehicle) return 0;
return pVehicle->nVehiclePartsType;
}
bool CDNExtManager::LoadMailTableData()
{
DNTableFileFormat *pSox = LoadExtTable( "MailTable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"MailTable failed\r\n" );
SAFE_DELETE(pSox);
return false;
}
if( pSox->GetItemCount() <= 0 )
{
g_Log.Log( LogType::_FILELOG, L"MailTable Count(%d)\r\n", pSox->GetItemCount() );
SAFE_DELETE(pSox);
return false;
}
//##################################################################
// FieldNum <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>
//##################################################################
struct TempFieldNum
{
int MailType;
int MailSender;
int MailTitle;
int MailText;
int MailPresentItem[MAILATTACHITEMMAX];
int Count[MAILATTACHITEMMAX];
int MailPresentMoney;
int IsCash;
};
TempFieldNum sFieldNum;
sFieldNum.MailType = pSox->GetFieldNum( "_MailType" );
sFieldNum.MailSender = pSox->GetFieldNum( "_MailSender" );
sFieldNum.MailTitle = pSox->GetFieldNum( "_MailTitle" );
sFieldNum.MailText = pSox->GetFieldNum( "_MailText" );
sFieldNum.MailPresentMoney = pSox->GetFieldNum( "_MailPresentMoney" );
sFieldNum.IsCash = pSox->GetFieldNum( "_IsCash" );
for( int i=1 ; i<=MAILATTACHITEMMAX ; ++i )
{
CHAR szBuf[MAX_PATH];
sprintf( szBuf, "_MailPresentItem%d", i );
sFieldNum.MailPresentItem[i-1] = pSox->GetFieldNum( szBuf );
sprintf( szBuf, "_Count%d", i );
sFieldNum.Count[i-1] = pSox->GetFieldNum( szBuf );
}
//##################################################################
// Load
//##################################################################
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
{
TMailTableData Data;
int nItemID = pSox->GetItemID(i);
int iIdx = pSox->GetIDXprimary( nItemID );
Data.Code = static_cast<DBDNWorldDef::MailTypeCode::eCode>(pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MailType )->GetInteger());
Data.nSenderUIStringIndex = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MailSender )->GetInteger();
Data.nTitleUIStringIndex = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MailTitle )->GetInteger();
Data.nTextUIStringIndex = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MailText )->GetInteger();
Data.IsCash = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.IsCash )->GetInteger() ? true : false;
for( int i=0 ; i<MAILATTACHITEMMAX ; ++i )
{
if (Data.IsCash){
Data.ItemSNArr[i] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MailPresentItem[i] )->GetInteger();
}
else{
Data.ItemIDArr[i] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MailPresentItem[i] )->GetInteger();
if( Data.ItemIDArr[i] <= 0 )
continue;
//_ASSERT( GetItemData( Data.ItemIDArr[i] ) ); -- by robust
if( GetItemData( Data.ItemIDArr[i] ) == NULL )
{
WCHAR wszBuf[MAX_PATH];
wsprintf( wszBuf, L"MailTable ID:%d ItemID:%d not found\r\n", nItemID, Data.ItemIDArr[i] );
g_Log.Log( LogType::_FILELOG, wszBuf );
SAFE_DELETE(pSox);
return false;
}
Data.ItemCountArr[i] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.Count[i] )->GetInteger();
}
}
Data.nPresentMoney = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MailPresentMoney )->GetInteger();
m_MailTableData.insert( std::make_pair(nItemID,Data) );
}
SAFE_DELETE(pSox);
return true;
}
TMailTableData* CDNExtManager::GetMailTableData( int iItemID )
{
TMapMailTableData::iterator itor = m_MailTableData.find( iItemID );
if( itor != m_MailTableData.end() )
return &itor->second;
return NULL;
}
bool CDNExtManager::LoadGuildWarRewardData()
{
DNTableFileFormat *pSox = LoadExtTable( "guildwarmailtable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"guildwarmailtable failed\r\n" );
SAFE_DELETE(pSox);
return false;
}
if( pSox->GetItemCount() <= 0 )
{
g_Log.Log( LogType::_FILELOG, L"guildwarmailtable Count(%d)\r\n", pSox->GetItemCount() );
SAFE_DELETE(pSox);
return false;
}
//##################################################################
// FieldNum <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>
//##################################################################
struct TempFieldNum
{
int _ResultType;
int _ClassID;
int _MailID1;
int _MailID2;
int _GuildFestPoint;
int _GuildPoint;
};
TempFieldNum sFieldNum;
sFieldNum._ResultType = pSox->GetFieldNum("_ResultType");
sFieldNum._ClassID = pSox->GetFieldNum("_ClassID");
sFieldNum._MailID1 = pSox->GetFieldNum("_MailID1");
sFieldNum._MailID2 = pSox->GetFieldNum("_MailID2");
sFieldNum._GuildFestPoint = pSox->GetFieldNum("_GuildFestPoint");
sFieldNum._GuildPoint = pSox->GetFieldNum("_GuildPoint");
//##################################################################
// Load
//##################################################################
for( int i=0; i<pSox->GetItemCount(); i++ )
{
int nItemID = pSox->GetItemID(i);
int iIdx = pSox->GetIDXprimary( nItemID );
TGuildWarRewardData* Data = new TGuildWarRewardData;
memset( Data, 0, sizeof(TGuildWarRewardData) );
Data->cType = (char)pSox->GetFieldFromLablePtr( iIdx, sFieldNum._ResultType )->GetInteger();
Data->cClass = (char)pSox->GetFieldFromLablePtr( iIdx, sFieldNum._ClassID )->GetInteger();
Data->nMailID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._MailID1 )->GetInteger();
Data->nPresentID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._MailID2 )->GetInteger();
Data->nGuildFestivalPoint = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._GuildFestPoint)->GetInteger();
Data->nGuildPoint = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._GuildPoint)->GetInteger();
m_pGuildWarRewardData.push_back(Data);
}
SAFE_DELETE(pSox);
return true;
}
TGuildWarRewardData* CDNExtManager::GetGuildWarRewardData(char cType, char cClass)
{
std::vector<TGuildWarRewardData*>::iterator iter;
for( iter=m_pGuildWarRewardData.begin(); iter!=m_pGuildWarRewardData.end(); ++iter)
{
TGuildWarRewardData* pRewardData = (*iter);
if( pRewardData->cType == cType && pRewardData->cClass == cClass )
return pRewardData;
}
return NULL;
}
bool CDNExtManager::LoadJobTableData()
{
DNTableFileFormat *pSox = LoadExtTable( "JobTable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"JobTable failed\r\n" );
SAFE_DELETE(pSox);
return false;
}
if( pSox->GetItemCount() <= 0 )
{
g_Log.Log( LogType::_FILELOG, L"JobTable Count(%d)\r\n", pSox->GetItemCount() );
SAFE_DELETE(pSox);
return false;
}
//##################################################################
// FieldNum <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>
//##################################################################
struct TempFieldNum
{
int _JobNumber;
int _ParentJob;
int _MaxSPJob[ 5 ];
int _Class;
};
TempFieldNum sFieldNum;
sFieldNum._JobNumber = pSox->GetFieldNum( "_JobNumber" );
sFieldNum._ParentJob = pSox->GetFieldNum( "_ParentJob" );
char acBuffer[ 256 ] = { 0 };
for( int i = 0; i < 5; ++i )
{
sprintf_s( acBuffer, "_MaxSPJob%d", i );
sFieldNum._MaxSPJob[ i ] = pSox->GetFieldNum( acBuffer );
}
sFieldNum._Class = pSox->GetFieldNum( "_Class" );
//##################################################################
// Load
//##################################################################
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
{
TJobTableData Data;
int nItemID = pSox->GetItemID(i);
int iIdx = pSox->GetIDXprimary( nItemID );
Data.cJobNumber = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._JobNumber )->GetInteger();
Data.cParentJob = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._ParentJob )->GetInteger();
for( int k = 0; k < 5; ++k )
Data.afMaxUsingSP[ k ] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._MaxSPJob[ k ] )->GetFloat();
Data.cClass = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Class )->GetInteger();
m_JobTableData.insert( std::make_pair(nItemID, Data) );
if( nItemID >= JOB_KIND_MAX )
{
g_Log.Log( LogType::_FILELOG, L"MaxJob OverFlow %d/%d\r\n", nItemID, JOB_KIND_MAX );
SAFE_DELETE(pSox);
return false;
}
}
SAFE_DELETE(pSox);
return true;
}
TJobTableData* CDNExtManager::GetJobTableData( int nJobTableID )
{
TMapJobTableData::iterator itor = m_JobTableData.find( nJobTableID );
if( itor != m_JobTableData.end() )
{
TJobTableData * pTJobTableData = &(itor->second);
if( pTJobTableData->cJobNumber >= 0 ) // <20><EFBFBD><E2BABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD> <20><><EFBFBD><EFBFBD>.
return pTJobTableData;
}
return NULL;
}
bool CDNExtManager::LoadNewCharCreate()
{
// TODO(Cussrro): û<><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
return true;
//rlkt_new_login
bool bError = false;
DNTableFileFormat *pSox = LoadExtTable("CharCreate");
if (!pSox)
{
g_Log.Log(LogType::_FILELOG, L"RLKT\\CharCreate.dnt failed\r\n");
SAFE_DELETE(pSox);
return false;
}
int dwCanCreate;
for (int i = 0; i < pSox->GetItemCount(); i++){
dwCanCreate = pSox->GetFieldFromLablePtr(i, "_CanCreate")->GetInteger();
m_pMapNewCharCreate.insert(make_pair(i, dwCanCreate));
}
SAFE_DELETE(pSox);
return true;
}
bool CDNExtManager::LoadMapInfo()
{
DNTableFileFormat *pSox = LoadExtTable( "MapTable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"MapTable failed\r\n");
SAFE_DELETE(pSox);
return false;
}
TMapInfo *pMapInfo = NULL;
char szTemp[256];
char szLabel[64];
memset(&szTemp, 0, sizeof(szTemp));
for (int i = 0; i < pSox->GetItemCount(); i++){
int nItemID = pSox->GetItemID(i);
pMapInfo = new TMapInfo;
pMapInfo->nMapID = nItemID;
for( int j=0; j<10; j++ ) {
sprintf_s( szLabel, "_ToolName%d", j + 1 );
_strcpy(pMapInfo->szMapName[j], _countof(pMapInfo->szMapName[j]), pSox->GetFieldFromLablePtr(nItemID, szLabel)->GetString(), (int)strlen(pSox->GetFieldFromLablePtr(nItemID, szLabel)->GetString()));
}
pMapInfo->MapType = (GlobalEnum::eMapTypeEnum)pSox->GetFieldFromLablePtr(nItemID, "_MapType")->GetInteger();
for (int j = 0; j < WORLDMAP_GATECOUNT; j++){
sprintf_s(szTemp, "_Gate%d_MapIndex_txt", j + 1);
char* pszGateMapIndexs = pSox->GetFieldFromLablePtr( nItemID, szTemp )->GetString();
sprintf_s(szTemp, "_Gate%d_StartGate_txt", j + 1);
char* pszGateStartIndexs = pSox->GetFieldFromLablePtr(nItemID, szTemp)->GetString();
std::vector<string> vGateMapIndexs;
TokenizeA(pszGateMapIndexs, vGateMapIndexs, ";");
std::vector<string> vGateStartIndexs;
TokenizeA(pszGateStartIndexs, vGateStartIndexs, ";");
for (int k=0; k<vGateMapIndexs.size(); k++)
{
if (k < WORLDMAP_GATECOUNT)
{
pMapInfo->GateMapIndexs[j][k] = (USHORT)atoi(vGateMapIndexs[k].c_str());
pMapInfo->GateStartIndexs[j][k] = (BYTE)atoi(vGateStartIndexs[k].c_str());
pMapInfo->GateMapCount[j] = k+1;
}
}
}
m_pMapInfo.insert(make_pair(pMapInfo->nMapID, pMapInfo));
}
SAFE_DELETE(pSox);
return true;
}
int CDNExtManager::GetMapIndexByGateNo(int nMapIndex, int nGateNo, int nSelect)
{
if (nMapIndex < 0) return -1;
if (nGateNo <= 0) return -1;
if (nSelect < 0) return -1;
TMapInfoMap::iterator iter = m_pMapInfo.find(nMapIndex);
if (iter != m_pMapInfo.end())
{
if (nSelect < iter->second->GateMapCount[nGateNo-1])
return iter->second->GateMapIndexs[nGateNo-1][nSelect];
}
return -1;
}
int CDNExtManager::GetGateNoByGateNo( int nMapIndex, int nGateNo, int nSelect )
{
if (nMapIndex < 0) return -1;
if (nGateNo < 0) return -1;
TMapInfoMap::iterator iter = m_pMapInfo.find(nMapIndex);
if (iter != m_pMapInfo.end()){
if (nSelect < iter->second->GateMapCount[nGateNo-1])
return iter->second->GateStartIndexs[nGateNo-1][nSelect];
}
return -1;
}
GlobalEnum::eMapTypeEnum CDNExtManager::GetMapType(int nMapIndex)
{
if (nMapIndex < 0)
return GlobalEnum::MAP_UNKNOWN;
TMapInfoMap::iterator iter = m_pMapInfo.find(nMapIndex);
if (iter != m_pMapInfo.end()){
return iter->second->MapType;
}
return GlobalEnum::MAP_UNKNOWN;
}
const char * CDNExtManager::GetMapName(int nMapIdx)
{
if (nMapIdx < 0) return NULL;
TMapInfoMap::iterator iter = m_pMapInfo.find(nMapIdx);
if (iter != m_pMapInfo.end()){
return iter->second->szMapName[0];
}
return NULL;
}
#if defined(_LOGINSERVER) || defined(_MASTERSERVER)
void CDNExtManager::SetOnOffServerInfo(char cWorldSetID, bool bOnline)
{
if (m_pServerInfoList.empty()) return;
for (TMapServerInfo::iterator iter = m_pServerInfoList.begin(); iter != m_pServerInfoList.end(); ++iter){
if (iter->second->nWorldSetID == cWorldSetID){
iter->second->bOnline = bOnline;
}
}
}
int CDNExtManager::GetWorldID()
{
if (m_pServerInfoList.empty()) return -1;
std::vector<std::string> IPList;
bool bResult = GetLocalIp(IPList);
if ( !bResult )
return -1;
TMapServerInfo::iterator iter;
for (iter = m_pServerInfoList.begin(); iter != m_pServerInfoList.end(); ++iter)
{
for ( size_t i = 0 ; i < IPList.size() ; i++ )
{
if (strcmp(iter->second->vOwnedVillageList[0].szIP, IPList[i].c_str()) == 0)
{
return iter->second->cWorldID;
}
}
}
_ASSERT_EXPR(0, L"ä<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20><><EFBFBD>ϵǾ<CFB5> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. <20><>ȫö<C8AB><C3B6> ã<><C3A3><EFBFBD>ּ<EFBFBD><D6BC><EFBFBD>!");
return -1;
}
WCHAR* CDNExtManager::GetWorldName(int nWorldSetID)
{
if (m_pServerInfoList.empty()) return NULL;
TMapServerInfo::iterator iter;
for (iter = m_pServerInfoList.begin(); iter != m_pServerInfoList.end(); ++iter){
if (iter->second->cWorldID == nWorldSetID){
return iter->second->wszWorldName;
}
}
return NULL;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> !!! 20090907
/*
char* CDNExtManager::GetLocalIp(OUT in_addr* pInAddr)
{
WSADATA WsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &WsaData);
if (0 > iResult) {
DN_RETURN(NULL);
}
char Name[256] = { 0, };
gethostname(Name, sizeof(Name));
PHOSTENT host = gethostbyname(Name);
if (host) {
if (pInAddr) {
memcpy(pInAddr, host->h_addr_list[0], sizeof(in_addr));
}
return inet_ntoa(*(struct in_addr*)*host->h_addr_list);
}
WSACleanup();
return NULL;
}
*/
bool CDNExtManager::GetLocalIp(OUT std::vector<std::string>& Out)
{
char Name[256] = { 0, };
char addr[16] = {0,};
gethostname(Name,sizeof(Name));
struct hostent* he = gethostbyname(Name);
struct in_addr iaddr;
memset(&iaddr,0,sizeof(iaddr));
for(int i =0; he->h_addr_list[i] !=0; i++)
{
if(he->h_addrtype!=AF_INET) continue;
memcpy(&iaddr,he->h_addr_list[i],sizeof(iaddr));
_strcpy(addr, _countof(addr), inet_ntoa(iaddr), (int)strlen(inet_ntoa(iaddr)));
Out.push_back(std::string(addr));
}
return Out.size() ? true : false;
}
#endif // #if defined(_LOGINSERVER) || defined(_MASTERSERVER)
#if defined(_LOGINSERVER)
void CDNExtManager::GetChannelListByMapIndex(char cWorldID, int nMapIndex, int nLastMapIndex, sChannelInfo *ChannelArray, BYTE &cCount, TMapChannel *ChannelList)
{
const TServerInfo *pServerInfo = GetServerInfo(cWorldID);
if (!pServerInfo) return;
if (pServerInfo->vOwnedVillageList.empty()) return;
int nSearchMapIndex = nMapIndex;
if (nMapIndex == 0) nSearchMapIndex = 1;
else if (GetMapType(nMapIndex) != GlobalEnum::MAP_VILLAGE)
nSearchMapIndex = nLastMapIndex;
cCount = 0;
TChannelInfoEx ChannelInfo;
ChannelList->clear();
for (int i = 0; i < (int)pServerInfo->vOwnedVillageList.size(); i++){
if (pServerInfo->vOwnedVillageList[i].vOwnedChannelList.empty()) continue;
for (int j = 0; j < (int)pServerInfo->vOwnedVillageList[i].vOwnedChannelList.size(); j++){
if (pServerInfo->vOwnedVillageList[i].vOwnedChannelList[j].nMapIdx != nSearchMapIndex) continue;
memset(&ChannelInfo, 0, sizeof(TChannelInfoEx));
ChannelInfo.Channel = pServerInfo->vOwnedVillageList[i].vOwnedChannelList[j];
ChannelInfo.cVillageID = pServerInfo->vOwnedVillageList[i].cVillageID;
_strcpy(ChannelInfo.szIP, _countof(ChannelInfo.szIP), pServerInfo->vOwnedVillageList[i].szIP, (int)strlen(pServerInfo->vOwnedVillageList[i].szIP));
ChannelInfo.nPort = pServerInfo->vOwnedVillageList[i].nPort;
ChannelList->insert(make_pair(ChannelInfo.Channel.nChannelID, ChannelInfo));
ChannelArray[cCount].nChannelID = pServerInfo->vOwnedVillageList[i].vOwnedChannelList[j].nChannelID;
ChannelArray[cCount].nMapIdx = pServerInfo->vOwnedVillageList[i].vOwnedChannelList[j].nMapIdx;
ChannelArray[cCount].nMaxUserCount = pServerInfo->vOwnedVillageList[i].vOwnedChannelList[j].nChannelMaxUser;
ChannelArray[cCount].nChannelAttribute = pServerInfo->vOwnedVillageList[i].vOwnedChannelList[j].nAttribute;
_strcpy(ChannelArray[cCount].szIP, _countof(ChannelArray[cCount].szIP), pServerInfo->vOwnedVillageList[i].szIP, (int)strlen(pServerInfo->vOwnedVillageList[i].szIP));
ChannelArray[cCount].nPort = pServerInfo->vOwnedVillageList[i].nPort;
cCount++;
}
}
}
void CDNExtManager::GetServerList(TServerListData *ServerList, BYTE &cCount, bool bDenyWorld)
{
if (m_pMapInfo.empty()) return;
cCount = 0;
TMapServerInfo::iterator iter;
for (iter = m_pServerInfoList.begin(); iter != m_pServerInfoList.end(); ++iter)
{
#if !defined(PRE_MOD_SELECT_CHAR)
if (!iter->second->bOnline) continue; // <20>ϴ<EFBFBD> online<6E><65> <20>ֵ鸸 <20>ѷ<EFBFBD><D1B7><EFBFBD><EFBFBD><EFBFBD>
#endif // #if defined(PRE_MOD_SELECT_CHAR)
#if defined(_TW)
if( bDenyWorld && g_Config.nDenyWorld == iter->second->cWorldID )
continue;
#endif //#if defined(_TW)
#if defined(PRE_IDN_PVP)
if( bDenyWorld && g_Config.nPvPWorldID == iter->second->cWorldID )
continue;
#endif // #if defined(PRE_IDN_PVP)
ServerList[cCount].cWorldID = iter->second->cWorldID;
wcsncpy(ServerList[cCount].wszServerName, iter->second->wszWorldName, WORLDNAMELENMAX);
ServerList[cCount].bOnline = iter->second->bOnline;
ServerList[cCount].bOnTop = (*iter).second->bOnTop;
cCount++;
}
}
#endif
#if defined(_LOGINSERVER)
DWORD ConvertD3DCOLORToR10G10B10( DWORD dwSource, float fIntensity )
{
int nR = (int)(fIntensity * LOBYTE(HIWORD(dwSource)));
int nG = (int)(fIntensity * HIBYTE(LOWORD(dwSource)));
int nB = (int)(fIntensity * LOBYTE(LOWORD(dwSource)));
ASSERT( nR >= 0 && nR < 1024); // 1024 (4.0f) <20><> <20>Ѵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ŷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
ASSERT( nG >= 0 && nG < 1024);
ASSERT( nB >= 0 && nB < 1024);
return (DWORD)((nR<<20)|(nG<<10)|nB);
}
bool CDNExtManager::LoadDefaultCreateData()
{
DNTableFileFormat *pSox = LoadExtTable( "DefaultCreateTable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"DefaultCreateTable failed\r\n");
SAFE_DELETE(pSox);
return false;
}
TDefaultCreateData *pDefaultCreate = NULL;
char szLabel[64] = { 0, };
int nIndex = 0;
for (int i = 0; i < pSox->GetItemCount(); i++){
pDefaultCreate = new TDefaultCreateData;
memset(pDefaultCreate, 0, sizeof(TDefaultCreateData));
nIndex = pSox->GetItemID(i);
pDefaultCreate->cClassID = pSox->GetFieldFromLablePtr(nIndex, "_ClassID")->GetInteger();
pDefaultCreate->cDarkClass = pSox->GetFieldFromLablePtr(nIndex, "_Type")->GetInteger(); //1 =normal class , 2 = dark class
pDefaultCreate->cDarkClassJobID = pSox->GetFieldFromLablePtr(nIndex, "_JobCode1")->GetInteger(); //job code for dark class
// Default Position
pDefaultCreate->nCreateMapIndex = pSox->GetFieldFromLablePtr(nIndex, "_CreateMapIndex")->GetInteger();
for (int j = 0; j < DEFAULTPOSITIONMAX; j++){
sprintf_s(szLabel, "_CreateMapStartPosition_%02d_x", j + 1);
pDefaultCreate->nCreateMapStartPositionX[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
sprintf_s(szLabel, "_CreateMapStartPosition_%02d_y", j + 1);
pDefaultCreate->nCreateMapStartPositionY[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
sprintf_s(szLabel, "_CreateMapStartRadius_%02d", j + 1);
pDefaultCreate->nCreateMapStartRadius[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
}
pDefaultCreate->nCreateTutorialMapIndex = pSox->GetFieldFromLablePtr(nIndex, "_CreateTutorialMapIndex")->GetInteger();
pDefaultCreate->nCreateTutorialGateNo = pSox->GetFieldFromLablePtr(nIndex, "_CreateTutorialGateIndex")->GetInteger();
// Default Parts
pDefaultCreate->nDefaultBody = pSox->GetFieldFromLablePtr(nIndex, "_DefaultBody")->GetInteger();
pDefaultCreate->nDefaultLeg = pSox->GetFieldFromLablePtr(nIndex, "_DefaultLeg")->GetInteger();
pDefaultCreate->nDefaultHand = pSox->GetFieldFromLablePtr(nIndex, "_DefaultHand")->GetInteger();
pDefaultCreate->nDefaultFoot = pSox->GetFieldFromLablePtr(nIndex, "_DefaultFoot")->GetInteger();
for (int j = 0; j < DEFAULTPARTSMAX; j++){
sprintf_s(szLabel, "_Face%d", j + 1);
pDefaultCreate->nFace[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
sprintf_s(szLabel, "_Hair%d", j + 1);
pDefaultCreate->nHair[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
sprintf_s(szLabel, "_Helmet%d", j + 1);
pDefaultCreate->nHelmet[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
sprintf_s(szLabel, "_Body%d", j + 1);
pDefaultCreate->nBody[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
sprintf_s(szLabel, "_Leg%d", j + 1);
pDefaultCreate->nLeg[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
sprintf_s(szLabel, "_Hand%d", j + 1);
pDefaultCreate->nHand[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
sprintf_s(szLabel, "_Foot%d", j + 1);
pDefaultCreate->nFoot[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
}
pDefaultCreate->nWeapon[0] = pSox->GetFieldFromLablePtr(nIndex, "_Weapon1")->GetInteger();
pDefaultCreate->nWeapon[1] = pSox->GetFieldFromLablePtr(nIndex, "_Weapon2")->GetInteger();
// Default Item
for (int j = 0; j < DEFAULTITEMMAX; j++){
sprintf_s(szLabel, "_DefaultItem%d", j + 1);
pDefaultCreate->nDefaultItemID[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
sprintf_s(szLabel, "_DefaultItem%dNumber", j + 1);
pDefaultCreate->nDefaultItemCount[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
}
// Default Skill
for (int j = 0; j < DEFAULTSKILLMAX; j++){
sprintf_s(szLabel, "_DefaultSkill%d", j + 1);
pDefaultCreate->nDefaultSkillID[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
}
//----------------------------------------------------------------------
//[debug] @_@
#ifdef _NewGameRes
int nDEFAULTQUICKSLOTMAX = 60; //<2F>߰汾<DFB0><E6B1BE>Դ
wprintf(L"[RLKT]NewGameRes DEFAULTQUICKSLOTMAX = 60 \n");
#else
int nDEFAULTQUICKSLOTMAX = 50; //<2F>ϰ汾<CFB0><E6B1BE>Դ
wprintf(L"[RLKT]OldGameRes DEFAULTQUICKSLOTMAX = 50 \n");
#endif
//----------------------------------------------------------------------
// Default Quickslot
for (int j = 0; j < nDEFAULTQUICKSLOTMAX; j++){ //for (int j = 0; j < DEFAULTQUICKSLOTMAX; j++){
sprintf_s(szLabel, "_QuickSlot%dType", j + 1);
pDefaultCreate->DefaultQuickSlot[j].cType = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
sprintf_s(szLabel, "_QuickSlot%dIndex", j + 1);
pDefaultCreate->DefaultQuickSlot[j].nID = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
}
//Default Gesture
for (int j = 0; j < DEFAULTGESTUREMAX; j++)
{
sprintf_s(szLabel, "_DefaultGesture%d", j + 1);
pDefaultCreate->nDefaultGestureID[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
}
//Default HairColor
for( int j=0; j<DEFAULTHAIRCOLORMAX; j++ )
{
int nR = pSox->GetFieldFromLablePtr( nIndex, FormatA( "_HairColor%dR", j + 1 ).c_str() )->GetInteger();
int nG = pSox->GetFieldFromLablePtr( nIndex, FormatA( "_HairColor%dG", j + 1 ).c_str() )->GetInteger();
int nB = pSox->GetFieldFromLablePtr( nIndex, FormatA( "_HairColor%dB", j + 1 ).c_str() )->GetInteger();
DWORD dwColor = ((DWORD)((((255)&0xff)<<24)|(((nR)&0xff)<<16)|(((nG)&0xff)<<8)|((nB)&0xff)));
pDefaultCreate->dwHairColor[j] = ConvertD3DCOLORToR10G10B10( dwColor, 1.1f );
}
//Default SkinColor
for( int j=0; j<DEFAULTSKINCOLORMAX; j++ )
{
int nA = (int)(pSox->GetFieldFromLablePtr( nIndex, FormatA( "_SkinColor%dA", j + 1 ).c_str() )->GetFloat() * 255);
int nR = (int)(pSox->GetFieldFromLablePtr( nIndex, FormatA( "_SkinColor%dR", j + 1 ).c_str() )->GetFloat() * 255);
int nG = (int)(pSox->GetFieldFromLablePtr( nIndex, FormatA( "_SkinColor%dG", j + 1 ).c_str() )->GetFloat() * 255);
int nB = (int)(pSox->GetFieldFromLablePtr( nIndex, FormatA( "_SkinColor%dB", j + 1 ).c_str() )->GetFloat() * 255);
pDefaultCreate->dwSkinColor[j] = ((DWORD)((((nA)&0xff)<<24)|(((nR)&0xff)<<16)|(((nG)&0xff)<<8)|((nB)&0xff)));
}
//Default EyeColor
for( int j=0; j<DEFAULTEYECOLORMAX; j++ )
{
int nR = pSox->GetFieldFromLablePtr( nIndex, FormatA( "_EyeColor%dR", j + 1 ).c_str() )->GetInteger();
int nG = pSox->GetFieldFromLablePtr( nIndex, FormatA( "_EyeColor%dG", j + 1 ).c_str() )->GetInteger();
int nB = pSox->GetFieldFromLablePtr( nIndex, FormatA( "_EyeColor%dB", j + 1 ).c_str() )->GetInteger();
DWORD dwColor = ((DWORD)((((255)&0xff)<<24)|(((nR)&0xff)<<16)|(((nG)&0xff)<<8)|((nB)&0xff)));
pDefaultCreate->dwEyeColor[j] = ConvertD3DCOLORToR10G10B10( dwColor, 1.0f );
}
m_pMapDefaultCreate.insert(make_pair(i, pDefaultCreate)); //
}
SAFE_DELETE(pSox);
return true;
}
bool CDNExtManager::LoadSkillData()
{
DNTableFileFormat *pSox = LoadExtTable( "SkillTable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"SkillTable failed\r\n");
SAFE_DELETE(pSox);
return false;
}
DNTableFileFormat *pJobTable = LoadExtTable( "JobTable" );
if( !pJobTable )
{
g_Log.Log( LogType::_FILELOG, L"JobTable failed\r\n");
SAFE_DELETE(pJobTable);
SAFE_DELETE(pSox);
return false;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20>θ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> ã<><C3A3>.
map<int, int> mapRootJob;
for( int i = 0; i < pJobTable->GetItemCount(); ++i )
{
int iItemID = pJobTable->GetItemID( i );
int iJobDeep = pJobTable->GetFieldFromLablePtr( iItemID, "_JobNumber" )->GetInteger();
if( 0 < iJobDeep )
{
int iJobID = iItemID;
int iRootJobDefine = pJobTable->GetFieldFromLablePtr( iItemID, "_BaseClass" )->GetInteger();
// JobTable<6C><65> <20><><EFBFBD>ǵǾ<C7B5><C7BE>ִ´<D6B4><C2B4><EFBFBD>,
//0 PLAYER_WARRIOR
//1 PLAYER_ARCHER
//-1 FREE
//2 PLAYER_SOCERESS
//3 PLAYER_CLERIC
//9 PLAYER_ANCESTOR
int iRootJobID = -1;
switch( iRootJobDefine )
{
case 0:
iRootJobID = 1;
break;
case 1:
iRootJobID = 2;
break;
case 2:
iRootJobID = 3;
break;
case 3:
iRootJobID = 4;
break;
}
if( -1 != iRootJobID )
{
mapRootJob.insert( make_pair(iJobID, iRootJobID) );
}
}
}
// Note: <20><><EFBFBD><EFBFBD>Ʈ <20><> <20><>ų<EFBFBD><C5B3> ã<>Ƽ<EFBFBD> <20>־<EFBFBD><D6BE>ִ<EFBFBD> <20><><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>õǾ<C3B5> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE>θ<EFBFBD> <20>ȴ<EFBFBD>.
TSkillData* pSkillData = NULL;
int nIndex = 0;
for( int i = 0;i < pSox->GetItemCount(); ++i )
{
pSkillData = new TSkillData;
//memset( pSkillData, 0, sizeof(TSkillData) );
nIndex = pSox->GetItemID( i );
pSkillData->nSkillID = nIndex;
pSkillData->nNeedJobID = pSox->GetFieldFromLablePtr( nIndex, "_NeedJob" )->GetInteger();
pSkillData->bDefaultLocked = (pSox->GetFieldFromLablePtr( nIndex, "_Lock" )->GetInteger() == 1) ? true : false;
if( 0 < pSkillData->nSkillID && false == pSkillData->bDefaultLocked && pSkillData->nNeedJobID != 0 )
{
int iRootJobID = 0;
if( pSkillData->nNeedJobID < 5 )
{
iRootJobID = pSkillData->nNeedJobID;
}
else
{
map<int, int>::iterator iter = mapRootJob.find( pSkillData->nNeedJobID );
_ASSERT( mapRootJob.end() != iter );
continue;
}
TDefaultCreateData* pDefaultCreateInfo = m_pMapDefaultCreate[ iRootJobID ];
for( int i = 0; i < DEFAULTSKILLMAX; ++i )
{
int iDefaultSkillID = pDefaultCreateInfo->nDefaultSkillID[ i ];
if( 0 == iDefaultSkillID )
break;
_ASSERT( iDefaultSkillID != pSkillData->nSkillID && "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><>ų <20>߿<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵ<EFBFBD>." );
}
_ASSERT( (int)m_mapDefaultUnlockSkillsByClass[ iRootJobID ].size() < DEFAULTUNLOCKSKILLMAX && "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><>ų <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD>." );
m_mapDefaultUnlockSkillsByClass[ iRootJobID ].push_back( pSkillData );
}
}
SAFE_DELETE( pSox );
SAFE_DELETE( pJobTable );
return true;
}
TDefaultCreateData* CDNExtManager::GetDefaultCreateData(BYTE cClassID)
{
if (cClassID > DARK_JOBMAX)
{
printf("DNExtManger::[2520] return NULL! cClassID: %d",cClassID);
return NULL;
}
bool isDark = false;
if(cClassID == 9) //Dark Avenger
{
cClassID = 1;
isDark = true;
}
if (cClassID == 10) //Machina
{
cClassID = 9; //machina
}
if(cClassID == 11) // Silver Hunter
{
cClassID = 2;
isDark = true;
}
//rlkt_dark add dark class
for (TMapDefaultCreate::iterator iter = m_pMapDefaultCreate.begin(); iter != m_pMapDefaultCreate.end(); ++iter){
if(isDark)
{
//
printf("Called GetDefaultCraeteData :: isDark = true! Class = %d, cDarkClass = %d\n", cClassID, iter->second->cDarkClass);
//
if (iter->second->cClassID == cClassID && iter->second->cDarkClass > 0 ){
return iter->second;
}
}else{
if (iter->second->cClassID == cClassID){
printf("Called GetDefaultCraeteData DefaultMapID : %d DefaultClassID : %d\n", iter->second->nCreateTutorialMapIndex, iter->second->cDarkClass);
return iter->second;
}
}
}
return NULL;
}
TDefaultCreateData* CDNExtManager::GetDefaultCreateData_2(BYTE cClassID) //old!
{
if (cClassID > CLASSKINDMAX)
{
return NULL;
}
for (TMapDefaultCreate::iterator iter = m_pMapDefaultCreate.begin(); iter != m_pMapDefaultCreate.end(); ++iter){
if (iter->second->cClassID == cClassID){
return iter->second;
}
}
return NULL;
}
/*
TDefaultCreateData* CDNExtManager::GetDefaultCreateData(BYTE cClassID) //old!
{
if (cClassID > CLASSKINDMAX)
{
printf("DNExtManger::[2520] return NULL! cClassID: %d",cClassID);
return NULL;
}
TMapDefaultCreate::iterator iter = m_pMapDefaultCreate.find(cClassID);
if (iter != m_pMapDefaultCreate.end()){
return iter->second;
}
return NULL;
}*/
int CDNExtManager::GetCreateDefaultItem(BYTE cClassID, TCreateCharacterItem *CreateItemArray)
{
TDefaultCreateData *pDefaultCreate = GetDefaultCreateData(cClassID);
if (!pDefaultCreate) return -1;
int nCount = 0;
for (int i = 0; i < DEFAULTITEMMAX; i++){
if (pDefaultCreate->nDefaultItemID[i] <= 0) continue;
CreateItemArray[nCount].nItemID = pDefaultCreate->nDefaultItemID[i];
CreateItemArray[nCount].cCount = pDefaultCreate->nDefaultItemCount[i];
CreateItemArray[nCount].wDur = GetItemDurability(pDefaultCreate->nDefaultItemID[i]);
nCount++;
}
return nCount;
}
bool CDNExtManager::IsDefaultParts(BYTE cClassID, char cEquipType, int nPartID)
{
if (nPartID < 0) return false;
TDefaultCreateData *pDefaultCreate = NULL;
if (!(pDefaultCreate = GetDefaultCreateData(cClassID))) return false;
switch (cEquipType)
{
case EQUIP_FACE:
for (int i = 0; i < DEFAULTPARTSMAX; i++){
if (pDefaultCreate->nFace[i] == nPartID) return true;
}
break;
case EQUIP_HAIR:
for (int i = 0; i < DEFAULTPARTSMAX; i++){
if (pDefaultCreate->nHair[i] == nPartID) return true;
}
break;
case EQUIP_HELMET:
for (int i = 0; i < DEFAULTPARTSMAX; i++){
if (pDefaultCreate->nHelmet[i] == nPartID) return true;
}
break;
case EQUIP_BODY:
for (int i = 0; i < DEFAULTPARTSMAX; i++){
if (pDefaultCreate->nBody[i] == nPartID) return true;
}
break;
case EQUIP_LEG:
for (int i = 0; i < DEFAULTPARTSMAX; i++){
if (pDefaultCreate->nLeg[i] == nPartID) return true;
}
break;
case EQUIP_HAND:
for (int i = 0; i < DEFAULTPARTSMAX; i++){
if (pDefaultCreate->nHand[i] == nPartID) return true;
}
break;
case EQUIP_FOOT:
for (int i = 0; i < DEFAULTPARTSMAX; i++){
if (pDefaultCreate->nFoot[i] == nPartID) return true;
}
break;
case EQUIP_WEAPON1: if (pDefaultCreate->nWeapon[0] == nPartID) return true;
case EQUIP_WEAPON2: if (pDefaultCreate->nWeapon[1] == nPartID) return true;
default:
return false;
}
return false;
}
bool CDNExtManager::IsDefaultHairColor( BYTE cClassID, DWORD dwColor )
{
TDefaultCreateData *pDefaultCreate = NULL;
if (!(pDefaultCreate = GetDefaultCreateData(cClassID))) return false;
for( int i=0; i<DEFAULTHAIRCOLORMAX; i++ ) {
printf("Hair Color: %X requested hair color: %X\n", pDefaultCreate->dwHairColor[i],dwColor);
if( pDefaultCreate->dwHairColor[i] == dwColor ) return true;
}
return false;
}
bool CDNExtManager::IsDefaultSkinColor( BYTE cClassID, DWORD dwColor )
{
TDefaultCreateData *pDefaultCreate = NULL;
if (!(pDefaultCreate = GetDefaultCreateData(cClassID))) return false;
for( int i=0; i<DEFAULTSKINCOLORMAX; i++ ) {
if( pDefaultCreate->dwSkinColor[i] == dwColor ) return true;
}
return false;
}
bool CDNExtManager::IsDefaultEyeColor( BYTE cClassID, DWORD dwColor )
{
TDefaultCreateData *pDefaultCreate = NULL;
if (!(pDefaultCreate = GetDefaultCreateData(cClassID))) return false;
for( int i=0; i<DEFAULTEYECOLORMAX; i++ ) {
if( pDefaultCreate->dwEyeColor[i] == dwColor ) return true;
}
return false;
}
bool CDNExtManager::GetCreateDefaultPosition(BYTE cClassID, int &nPosX, int &nPosY)
{
TDefaultCreateData *pDefaultCreate = GetDefaultCreateData(cClassID);
if (!pDefaultCreate) return false;
std::vector<int> nVecList;
for( int i=0; i<DEFAULTPARTSMAX; i++ ) {
if( pDefaultCreate->nCreateMapStartPositionX[i] == 0 && pDefaultCreate->nCreateMapStartPositionY[i] == 0 ) continue;
nVecList.push_back(i);
}
if( nVecList.empty() ) {
nPosX = 0;
nPosY = 0;
return true;
}
int nIndex = (int)(rand()%nVecList.size());
int nRadius = pDefaultCreate->nCreateMapStartRadius[nVecList[nIndex]];
if( nRadius == 0 ) nRadius = 1;
nPosX = pDefaultCreate->nCreateMapStartPositionX[ nVecList[nIndex] ] - ( ( nRadius / 2 ) + (rand()%nRadius) );
nPosY = pDefaultCreate->nCreateMapStartPositionY[ nVecList[nIndex] ] - ( ( nRadius / 2 ) + (rand()%nRadius) );
nPosX *= 1000;
nPosY *= 1000;
return true;
}
bool CDNExtManager::GetCreateDefaultMapInfo(BYTE cClassID, int &nMapIndex, int &nTutorialMapIndex, char &cTutorialGateNo)
{
TDefaultCreateData *pDefaultCreate = GetDefaultCreateData_2(cClassID);//rlkt_enter tutorial
if (!pDefaultCreate) return false;
nMapIndex = pDefaultCreate->nCreateMapIndex;
nTutorialMapIndex = pDefaultCreate->nCreateTutorialMapIndex;
cTutorialGateNo = pDefaultCreate->nCreateTutorialGateNo;
printf("[RLKT_DEBUG][%s] DefaultTutorial Map: %d cClassID: %d\n", __FUNCTION__, nTutorialMapIndex, cClassID);
return true;
}
bool CDNExtManager::GetCreateDefaultSkill(BYTE cClassID, int *CreateSkillArray)
{
TDefaultCreateData *pDefaultCreate = GetDefaultCreateData(cClassID);
if (!pDefaultCreate) return false;
memcpy(CreateSkillArray, pDefaultCreate->nDefaultSkillID, sizeof(int) * DEFAULTSKILLMAX);
return true;
}
bool CDNExtManager::GetCreateDefaultQuickSlot(BYTE cClassID, TQuickSlot *QuickSlotArray)
{
TDefaultCreateData *pDefaultCreate = GetDefaultCreateData(cClassID);
if (!pDefaultCreate) return false;
memcpy(QuickSlotArray, pDefaultCreate->DefaultQuickSlot, sizeof(TQuickSlot) * DEFAULTQUICKSLOTMAX);
return true;
}
bool CDNExtManager::GetCreateDefaultGesture(BYTE cClassID, int * CreateGestureArr)
{
TDefaultCreateData *pDefaultCreate = GetDefaultCreateData(cClassID);
if (!pDefaultCreate) return false;
memcpy(CreateGestureArr, pDefaultCreate->nDefaultGestureID, sizeof(int) * DEFAULTGESTUREMAX);
return true;
}
bool CDNExtManager::GetCreateDarkSecondClassID(BYTE cClassID, int &ClassID)
{
TDefaultCreateData *pDefaultCreate = GetDefaultCreateData(cClassID);
if (!pDefaultCreate) return false;
ClassID = pDefaultCreate->cDarkClassJobID;
return true;
}
bool CDNExtManager::GetCreateDefaultUnlockSkill(BYTE cClassID, int *CreateUnlockSkillArray)
{
if (m_mapDefaultUnlockSkillsByClass.empty()) return false;
map<int, vector<TSkillData*> >::iterator iter = m_mapDefaultUnlockSkillsByClass.find(cClassID);
if (iter == m_mapDefaultUnlockSkillsByClass.end()) return false;
if (iter->second.empty()) return false;
int nSize = (int)iter->second.size();
if (nSize > DEFAULTUNLOCKSKILLMAX) nSize = DEFAULTUNLOCKSKILLMAX;
for (int i = 0; i < nSize; i++){
CreateUnlockSkillArray[i] = iter->second[i]->nSkillID;
}
return true;
}
// DWCCreateData
#if defined( PRE_ADD_DWC )
bool CDNExtManager::LoadDWCCreateData()
{
DNTableFileFormat *pSox = LoadExtTable( "DWCCreateTable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"DWCCreateTable failed\r\n");
SAFE_DELETE(pSox);
return false;
}
TDWCCreateData *pDWCCreate = NULL;
char szLabel[64] = { 0, };
int nIndex = 0;
for (int i = 0; i < pSox->GetItemCount(); i++){
pDWCCreate = new TDWCCreateData;
memset(pDWCCreate, 0, sizeof(TDWCCreateData));
nIndex = pSox->GetItemID(i);
pDWCCreate->cClassID = pSox->GetFieldFromLablePtr(nIndex, "_ClassID")->GetInteger();
pDWCCreate->cJobCode1 = pSox->GetFieldFromLablePtr(nIndex, "_Jobcode1")->GetInteger();
pDWCCreate->cJobCode2 = pSox->GetFieldFromLablePtr(nIndex, "_Jobcode2")->GetInteger();
BYTE cJobCode = pDWCCreate->cClassID;
if( pDWCCreate->cJobCode1 )
cJobCode = pDWCCreate->cJobCode1;
if( pDWCCreate->cJobCode2 )
cJobCode = pDWCCreate->cJobCode2;
pDWCCreate->cLevel = pSox->GetFieldFromLablePtr(nIndex, "_Level")->GetInteger();
pDWCCreate->nExp = pSox->GetFieldFromLablePtr(nIndex, "_Experience")->GetInteger();
// Default Position
pDWCCreate->nCreateMapIndex = pSox->GetFieldFromLablePtr(nIndex, "_CreateMapIndex")->GetInteger();
for (int j = 0; j < DEFAULTPOSITIONMAX; j++){
sprintf_s(szLabel, "_CreateMapStartPosition_%02d_x", j + 1);
pDWCCreate->nCreateMapStartPositionX[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
sprintf_s(szLabel, "_CreateMapStartPosition_%02d_y", j + 1);
pDWCCreate->nCreateMapStartPositionY[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
sprintf_s(szLabel, "_CreateMapStartRadius_%02d", j + 1);
pDWCCreate->nCreateMapStartRadius[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
}
// Default Parts
pDWCCreate->nDefaultBody = pSox->GetFieldFromLablePtr(nIndex, "_DefaultBody")->GetInteger();
pDWCCreate->nDefaultLeg = pSox->GetFieldFromLablePtr(nIndex, "_DefaultLeg")->GetInteger();
pDWCCreate->nDefaultHand = pSox->GetFieldFromLablePtr(nIndex, "_DefaultHand")->GetInteger();
pDWCCreate->nDefaultFoot = pSox->GetFieldFromLablePtr(nIndex, "_DefaultFoot")->GetInteger();
pDWCCreate->nEquipArray[EQUIP_FACE] = pSox->GetFieldFromLablePtr(nIndex, "_Face1")->GetInteger();
pDWCCreate->nEquipArray[EQUIP_HAIR] = pSox->GetFieldFromLablePtr(nIndex, "_Hair1")->GetInteger();
pDWCCreate->nEquipArray[EQUIP_HELMET] = pSox->GetFieldFromLablePtr(nIndex, "_Helmet1")->GetInteger();
pDWCCreate->nEquipArray[EQUIP_BODY] = pSox->GetFieldFromLablePtr(nIndex, "_Body1")->GetInteger();
pDWCCreate->nEquipArray[EQUIP_LEG] = pSox->GetFieldFromLablePtr(nIndex, "_Leg1")->GetInteger();
pDWCCreate->nEquipArray[EQUIP_HAND] = pSox->GetFieldFromLablePtr(nIndex, "_Hand1")->GetInteger();
pDWCCreate->nEquipArray[EQUIP_FOOT] = pSox->GetFieldFromLablePtr(nIndex, "_Foot1")->GetInteger();
//pDWCCreate->nEquipArray[EQUIP_NECKLACE] = pSox->GetFieldFromLablePtr(nIndex, "_Necklace1")->GetInteger();
//pDWCCreate->nEquipArray[EQUIP_EARRING] = pSox->GetFieldFromLablePtr(nIndex, "_Earring1")->GetInteger();
//pDWCCreate->nEquipArray[EQUIP_RING1] = pSox->GetFieldFromLablePtr(nIndex, "_Ring1")->GetInteger();
//pDWCCreate->nEquipArray[EQUIP_RING2] = pSox->GetFieldFromLablePtr(nIndex, "_Ring2")->GetInteger();
pDWCCreate->nEquipArray[EQUIP_WEAPON1] = pSox->GetFieldFromLablePtr(nIndex, "_Weapon1")->GetInteger();
pDWCCreate->nEquipArray[EQUIP_WEAPON2] = pSox->GetFieldFromLablePtr(nIndex, "_Weapon2")->GetInteger();
pDWCCreate->nSkillPoint = static_cast<short>(pSox->GetFieldFromLablePtr(nIndex, "_SkillPoint")->GetInteger());
pDWCCreate->nGold = pSox->GetFieldFromLablePtr(nIndex, "_Gold")->GetInteger();
// Default Item
for (int j = 0; j < DEFAULTITEMMAX; j++){
sprintf_s(szLabel, "_DefaultItem%d", j + 1);
pDWCCreate->nDefaultItemID[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
sprintf_s(szLabel, "_DefaultItem%dNumber", j + 1);
pDWCCreate->nDefaultItemCount[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
}
// Default Skill
for (int j = 0; j < DEFAULTSKILLMAX; j++){
sprintf_s(szLabel, "_DefaultSkill%d", j + 1);
pDWCCreate->nDefaultSkillID[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
}
//----------------------------------------------------------------------
//[debug] @_@
#ifdef _NewGameRes
int nDEFAULTQUICKSLOTMAX = 60; //<2F>߰汾<DFB0><E6B1BE>Դ
wprintf(L"[RLKT]NewGameRes DEFAULTQUICKSLOTMAX = 60 \n");
#else
int nDEFAULTQUICKSLOTMAX = 50; //<2F>ϰ汾<CFB0><E6B1BE>Դ
wprintf(L"[RLKT]OldGameRes DEFAULTQUICKSLOTMAX = 50 \n");
#endif
//----------------------------------------------------------------------
// Default Quickslot
for (int j = 0; j < nDEFAULTQUICKSLOTMAX; j++){
sprintf_s(szLabel, "_QuickSlot%dType", j + 1);
pDWCCreate->DefaultQuickSlot[j].cType = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
sprintf_s(szLabel, "_QuickSlot%dIndex", j + 1);
pDWCCreate->DefaultQuickSlot[j].nID = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
}
//Default Gesture
for (int j = 0; j < DEFAULTGESTUREMAX; j++)
{
sprintf_s(szLabel, "_DefaultGesture%d", j + 1);
pDWCCreate->nDefaultGestureID[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
}
//Default HairColor
for( int j=0; j<1; j++ )
{
int nR = pSox->GetFieldFromLablePtr( nIndex, FormatA( "_HairColor%dR", j + 1 ).c_str() )->GetInteger();
int nG = pSox->GetFieldFromLablePtr( nIndex, FormatA( "_HairColor%dG", j + 1 ).c_str() )->GetInteger();
int nB = pSox->GetFieldFromLablePtr( nIndex, FormatA( "_HairColor%dB", j + 1 ).c_str() )->GetInteger();
DWORD dwColor = ((DWORD)((((255)&0xff)<<24)|(((nR)&0xff)<<16)|(((nG)&0xff)<<8)|((nB)&0xff)));
pDWCCreate->dwHairColor = ConvertD3DCOLORToR10G10B10( dwColor, 1.1f );
}
//Default SkinColor
for( int j=0; j<1; j++ )
{
int nA = (int)(pSox->GetFieldFromLablePtr( nIndex, FormatA( "_SkinColor%dA", j + 1 ).c_str() )->GetFloat() * 255);
int nR = (int)(pSox->GetFieldFromLablePtr( nIndex, FormatA( "_SkinColor%dR", j + 1 ).c_str() )->GetFloat() * 255);
int nG = (int)(pSox->GetFieldFromLablePtr( nIndex, FormatA( "_SkinColor%dG", j + 1 ).c_str() )->GetFloat() * 255);
int nB = (int)(pSox->GetFieldFromLablePtr( nIndex, FormatA( "_SkinColor%dB", j + 1 ).c_str() )->GetFloat() * 255);
pDWCCreate->dwSkinColor = ((DWORD)((((nA)&0xff)<<24)|(((nR)&0xff)<<16)|(((nG)&0xff)<<8)|((nB)&0xff)));
}
//Default EyeColor
for( int j=0; j<1; j++ )
{
int nR = pSox->GetFieldFromLablePtr( nIndex, FormatA( "_EyeColor%dR", j + 1 ).c_str() )->GetInteger();
int nG = pSox->GetFieldFromLablePtr( nIndex, FormatA( "_EyeColor%dG", j + 1 ).c_str() )->GetInteger();
int nB = pSox->GetFieldFromLablePtr( nIndex, FormatA( "_EyeColor%dB", j + 1 ).c_str() )->GetInteger();
DWORD dwColor = ((DWORD)((((255)&0xff)<<24)|(((nR)&0xff)<<16)|(((nG)&0xff)<<8)|((nB)&0xff)));
pDWCCreate->dwEyeColor = ConvertD3DCOLORToR10G10B10( dwColor, 1.0f );
}
m_pMapDWCCreate.insert(make_pair(cJobCode, pDWCCreate));
}
SAFE_DELETE(pSox);
return true;
}
TDWCCreateData* CDNExtManager::GetDWCCreateData(BYTE cJobCode)
{
TMapDWCCreate::iterator iter = m_pMapDWCCreate.find(cJobCode);
if( m_pMapDWCCreate.end() != iter)
return iter->second;
return NULL;
}
int CDNExtManager::GetCreateDWCItem(BYTE cJobCode, TCreateCharacterItem *CreateItemArray)
{
TDWCCreateData *pDWCCreate = GetDWCCreateData(cJobCode);
if (!pDWCCreate) return -1;
int nCount = 0;
for (int i = 0; i < DEFAULTITEMMAX; i++){
if (pDWCCreate->nDefaultItemID[i] <= 0) continue;
CreateItemArray[nCount].nItemID = pDWCCreate->nDefaultItemID[i];
CreateItemArray[nCount].cCount = pDWCCreate->nDefaultItemCount[i];
CreateItemArray[nCount].wDur = GetItemDurability(pDWCCreate->nDefaultItemID[i]);
nCount++;
}
return nCount;
}
bool CDNExtManager::GetCreateDWCPosition(BYTE cJobCode, int &nPosX, int &nPosY)
{
TDWCCreateData *pDWCCreate = GetDWCCreateData(cJobCode);
if (!pDWCCreate) return false;
std::vector<int> nVecList;
for( int i=0; i<DEFAULTPARTSMAX; i++ ) {
if( pDWCCreate->nCreateMapStartPositionX[i] == 0 && pDWCCreate->nCreateMapStartPositionY[i] == 0 ) continue;
nVecList.push_back(i);
}
if( nVecList.empty() ) {
nPosX = 0;
nPosY = 0;
return true;
}
int nIndex = (int)(rand()%nVecList.size());
int nRadius = pDWCCreate->nCreateMapStartRadius[nVecList[nIndex]];
if( nRadius == 0 ) nRadius = 1;
nPosX = pDWCCreate->nCreateMapStartPositionX[ nVecList[nIndex] ] - ( ( nRadius / 2 ) + (rand()%nRadius) );
nPosY = pDWCCreate->nCreateMapStartPositionY[ nVecList[nIndex] ] - ( ( nRadius / 2 ) + (rand()%nRadius) );
nPosX *= 1000;
nPosY *= 1000;
return true;
}
bool CDNExtManager::GetCreateDWCEquip(BYTE cJobCode, int * CreateEquipArray)
{
TDWCCreateData *pDWCCreate = GetDWCCreateData(cJobCode);
if (!pDWCCreate) return false;
memcpy(CreateEquipArray, pDWCCreate->nEquipArray, sizeof(int) * EQUIPMAX);
return true;
}
bool CDNExtManager::GetCreateDWCSkill(BYTE cJobCode, int *CreateSkillArray)
{
TDWCCreateData *pDWCCreate = GetDWCCreateData(cJobCode);
if (!pDWCCreate) return false;
memcpy(CreateSkillArray, pDWCCreate->nDefaultSkillID, sizeof(int) * DEFAULTSKILLMAX);
return true;
}
bool CDNExtManager::GetCreateDWCQuickSlot(BYTE cJobCode, TQuickSlot *QuickSlotArray)
{
TDWCCreateData *pDWCCreate = GetDWCCreateData(cJobCode);
if (!pDWCCreate) return false;
memcpy(QuickSlotArray, pDWCCreate->DefaultQuickSlot, sizeof(TQuickSlot) * DEFAULTQUICKSLOTMAX);
return true;
}
bool CDNExtManager::GetCreateDWCGesture(BYTE cJobCode, int * CreateGestureArr)
{
TDWCCreateData *pDWCCreate = GetDWCCreateData(cJobCode);
if (!pDWCCreate) return false;
memcpy(CreateGestureArr, pDWCCreate->nDefaultGestureID, sizeof(int) * DEFAULTGESTUREMAX);
return true;
}
#endif // #if defined( PRE_ADD_DWC )
// CoinCountByLevel
bool CDNExtManager::LoadCoinCount()
{
DNTableFileFormat *pSox = LoadExtTable( "CoinTable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"CoinTable failed\r\n");
SAFE_DELETE(pSox);
return false;
}
TCoinCountData *pCoinCount = NULL;
char szLabel[64] = { 0, };
int nIndex = 0;
for (int i = 0; i < pSox->GetItemCount(); i++){
pCoinCount = new TCoinCountData;
memset(pCoinCount, 0, sizeof(TCoinCountData));
nIndex = pSox->GetItemID(i);
pCoinCount->cLevel = nIndex;
// CoinCount
for (int j = 0; j < 50; j++){
sprintf_s(szLabel, "_World%dCoin", j + 1);
pCoinCount->nRebirthCoin[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
sprintf_s(szLabel, "_World%dCashCoin", j + 1);
pCoinCount->nCashRebirthCoin[j] = pSox->GetFieldFromLablePtr(nIndex, szLabel)->GetInteger();
}
pCoinCount->nRebirthCoinLimit = pSox->GetFieldFromLablePtr(nIndex, "_CoinLimit")->GetInteger();
pCoinCount->nCashRebirthCoinLimit = pSox->GetFieldFromLablePtr(nIndex, "_CashCoinLimit")->GetInteger();
m_pMapCoinCount.insert(make_pair(pCoinCount->cLevel, pCoinCount));
}
SAFE_DELETE(pSox);
return true;
}
int CDNExtManager::GetRebirthCoin(BYTE cLevel, char cWorldID)
{
if ((cLevel <= 0) || (cLevel > CHARLEVELMAX)) return -1;
if ((cWorldID <= 0) || (cWorldID > WORLDCOUNTMAX)) return -1;
TMapCoinCount::iterator iter = m_pMapCoinCount.find(cLevel);
if (iter != m_pMapCoinCount.end()){
return iter->second->nRebirthCoin[cWorldID - 1];
}
return -1;
}
int CDNExtManager::GetCashRebirthCoin(BYTE cLevel, char cWorldID)
{
if ((cLevel <= 0) || (cLevel > CHARLEVELMAX)) return -1;
if ((cWorldID <= 0) || (cWorldID > WORLDCOUNTMAX)) return -1;
TMapCoinCount::iterator iter = m_pMapCoinCount.find(cLevel);
if (iter != m_pMapCoinCount.end()){
return iter->second->nCashRebirthCoin[cWorldID - 1];
}
return -1;
}
//---------------------------------------------------------------------------------
// LevelData (PlayerLevelTable - TLevelData)
//---------------------------------------------------------------------------------
bool CDNExtManager::LoadLevelData()
{
DNTableFileFormat *pSox = LoadExtTable( "PlayerLevelTable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"PlayerLevelTable failed\r\n");
SAFE_DELETE(pSox);
return false;
}
TLevelData *pLevelData = NULL;
char szTemp[256];
memset(&szTemp, 0, sizeof(szTemp));
int nIndex = 0;
for (int i = 0; i < pSox->GetItemCount(); i++){
pLevelData = new TLevelData;
memset(pLevelData, 0, sizeof(TLevelData));
pLevelData->nIndex = pSox->GetItemID(i);
pLevelData->wStrength = pSox->GetFieldFromLablePtr(pLevelData->nIndex, "_Strength")->GetInteger();
pLevelData->wAgility = pSox->GetFieldFromLablePtr(pLevelData->nIndex, "_Agility")->GetInteger();
pLevelData->wIntelligence = pSox->GetFieldFromLablePtr(pLevelData->nIndex, "_Intelligence")->GetInteger();
pLevelData->wStamina = pSox->GetFieldFromLablePtr(pLevelData->nIndex, "_Stamina")->GetInteger();
pLevelData->nExperience = pSox->GetFieldFromLablePtr(pLevelData->nIndex, "_Experience")->GetInteger();
pLevelData->nFatigue = pSox->GetFieldFromLablePtr(pLevelData->nIndex, "_Fatigue")->GetInteger();
m_pLevelData[pLevelData->nIndex] = pLevelData;
}
SAFE_DELETE(pSox);
return true;
}
int CDNExtManager::GetFatigue(char cClass, char cLevel)
{
if ((cClass <= 0) || (cClass > CLASSKINDMAX)) return 0;
if ((cLevel <= 0) || (cLevel > CHARLEVELMAX)) return 0;
int nValue = ((cClass - 1) * CHARLEVELMAX) + cLevel;
if (nValue > (int)m_pLevelData.size()) return 0;
return m_pLevelData[nValue]->nFatigue;
}
// <20><>Ģ<EFBFBD><C4A2>
#if defined(PRE_ADD_MULTILANGUAGE)
bool CDNExtManager::LoadProhibitWord(int nLanguage, const char * pszFilePath)
{
if (pszFilePath == NULL)
return false;
CXMLParser parser;
if (parser.Open(pszFilePath) == false)
{
g_Log.Log(LogType::_FILELOG, L"%S failed\r\n", pszFilePath);
return false;
}
TProhibitWord * pProhibit = GetLanguageSlangFilter(nLanguage);
if (pProhibit == NULL)
{
TProhibitWord mProhibit;
m_ProhibitWordList.insert(std::make_pair(nLanguage, mProhibit));
pProhibit = GetLanguageSlangFilter(nLanguage);
if (pProhibit == NULL)
return false;
}
#else //#if defined(PRE_ADD_MULTILANGUAGE)
bool CDNExtManager::LoadProhibitWord()
{
char buf[_MAX_PATH] = { 0, };
sprintf_s( buf, "%s/Resource/UIString/ProhibitWord.xml", g_Config.szResourcePath.c_str() );
CXMLParser parser;
if (parser.Open(buf) == false)
{
g_Log.Log(LogType::_FILELOG, L"ProhibitWord.xml failed\r\n");
return false;
}
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
if (parser.FirstChildElement("ProhibitWord", true) == true)
{
if (parser.FirstChildElement("Account", true) == true)
{
if (parser.FirstChildElement("AccountWord", true) == true)
{
do {
if (parser.GetText())
{
wstring wszStr = parser.GetText();
std::transform( wszStr.begin(), wszStr.end(), wszStr.begin(), towlower );
unsigned int nHashKey = MemoryToRSHashKey(wszStr.c_str(), (long)wszStr.length());
#if defined(PRE_ADD_MULTILANGUAGE)
pProhibit->insert(make_pair(nHashKey, wszStr));
#else //#if defined(PRE_ADD_MULTILANGUAGE)
m_ProhibitWordList.insert(make_pair(nHashKey, wszStr));
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
}
} while (parser.NextSiblingElement("AccountWord"));
parser.GoParent();
}
parser.GoParent();
}
#if defined(_KR) || defined(_KRAZ)
if (parser.FirstChildElement("Chat", true) == true)
{
if (parser.FirstChildElement("ChatWord", true) == true)
{
do {
if (parser.GetText())
{
wstring wszStr = parser.GetText();
std::transform( wszStr.begin(), wszStr.end(), wszStr.begin(), towlower );
unsigned int nHashKey = MemoryToRSHashKey(wszStr.c_str(), (long)wszStr.length());
#if defined(PRE_ADD_MULTILANGUAGE)
pProhibit->insert(make_pair(nHashKey, wszStr));
#else //#if defined(PRE_ADD_MULTILANGUAGE)
m_ProhibitWordList.insert(make_pair(nHashKey, wszStr));
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
}
} while (parser.NextSiblingElement("ChatWord"));
parser.GoParent();
}
parser.GoParent();
}
#endif
return true;
}
return false;
}
#if defined(PRE_ADD_MULTILANGUAGE)
CDNExtManager::TProhibitWord * CDNExtManager::GetLanguageSlangFilter(int nLanguage)
{
TProhibitWord * pList = NULL;
std::map <int, TProhibitWord>::iterator ii = m_ProhibitWordList.find(nLanguage);
if (ii != m_ProhibitWordList.end())
return &(*ii).second;
return NULL;
}
bool CDNExtManager::CheckProhibitWord(int nLanguage, const wchar_t *pwszWord)
{
TProhibitWord * pProhibit = GetLanguageSlangFilter(nLanguage);
if (pProhibit)
{
std::wstring::size_type index;
std::wstring strTemp(pwszWord);
std::transform ( strTemp.begin(), strTemp.end(), strTemp.begin(), towlower );
for( std::map<unsigned int, std::wstring>::iterator itor = pProhibit->begin(); itor != pProhibit->end(); itor++ )
{
index = strTemp.find( itor->second );
if( index != string::npos )
return true;
}
}
return false;
}
#else //#if defined(PRE_ADD_MULTILANGUAGE)
bool CDNExtManager::CheckProhibitWord(const wchar_t *pwszWord)
{
std::wstring::size_type index;
std::wstring strTemp(pwszWord);
std::transform ( strTemp.begin(), strTemp.end(), strTemp.begin(), towlower );
for( std::map<unsigned int, std::wstring>::iterator itor = m_ProhibitWordList.begin(); itor != m_ProhibitWordList.end(); itor++ )
{
index = strTemp.find( itor->second );
if( index != string::npos )
return true;
}
return false;
}
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
bool CDNExtManager::CheckSpecialCharacter(const wchar_t *pwszWord)
{
wstring strSrc = pwszWord;
std::wstring::size_type index;
index = strSrc.find_first_of( L"~!@#$%^&*+|:?><,.;[]{}()\n\t\v\b\r\a\\\?\'\" " );
if( index != string::npos )
{
return true;
}
return false;
}
unsigned int CDNExtManager::MemoryToRSHashKey(const wchar_t *pszData, long nSize)
{
unsigned int nB = 378551;
unsigned int nA = 63689;
unsigned int nHashKey = 0;
for (int i = 0; i < nSize; i++)
{
nHashKey = nHashKey * nA + pszData[i];
nA = nA * nB;
}
return (nHashKey & 0x7FFFFFFF);
}
//---------------------------------------------------------------------------------
// Weapon (WeaponTable - TWeaponData)
//---------------------------------------------------------------------------------
bool CDNExtManager::LoadWeaponData()
{
DNTableFileFormat *pSox = LoadExtTable( "WeaponTable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"WeaponTable failed\r\n");
SAFE_DELETE(pSox);
return false;
}
TWeaponData *pWeaponData = NULL;
char szTemp[256];
memset(&szTemp, 0, sizeof(szTemp));
for (int i = 0; i < pSox->GetItemCount(); i++){
pWeaponData = new TWeaponData;
memset(pWeaponData, 0, sizeof(TWeaponData));
pWeaponData->nWeaponIndex = pSox->GetItemID(i);
pWeaponData->cEquipType = pSox->GetFieldFromLablePtr(pWeaponData->nWeaponIndex, "_EquipType")->GetInteger();
pWeaponData->nLength = pSox->GetFieldFromLablePtr(pWeaponData->nWeaponIndex, "_Length")->GetInteger();
pWeaponData->nDurability = pSox->GetFieldFromLablePtr(pWeaponData->nWeaponIndex, "_Durability")->GetInteger();
pWeaponData->nDurabilityRepairCoin = pSox->GetFieldFromLablePtr(pWeaponData->nWeaponIndex, "_DurabilityRepairCoin")->GetInteger();
std::pair<TMapWeaponData::iterator,bool> Ret = m_pWeaponData.insert(make_pair(pWeaponData->nWeaponIndex, pWeaponData));
if( Ret.second == false )
delete pWeaponData;
}
SAFE_DELETE(pSox);
return true;
}
TWeaponData* CDNExtManager::GetWeaponData(int nWeaponIndex)
{
if (m_pWeaponData.empty()) return NULL;
TMapWeaponData::iterator iter = m_pWeaponData.find(nWeaponIndex);
if (iter != m_pWeaponData.end()){
return iter->second;
}
return NULL;
}
//---------------------------------------------------------------------------------
// Part (PartsTable - TPartData)
//---------------------------------------------------------------------------------
bool CDNExtManager::LoadPartData()
{
DNTableFileFormat *pSox = LoadExtTable( "PartsTable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"PartsTable failed\r\n");
SAFE_DELETE(pSox);
return false;
}
TPartData *pPartData = NULL;
char szTemp[256];
memset(&szTemp, 0, sizeof(szTemp));
for (int i = 0; i < pSox->GetItemCount(); i++){
pPartData = new TPartData;
memset(pPartData, 0, sizeof(TPartData));
pPartData->nPartIndex = pSox->GetItemID(i);
pPartData->nParts = pSox->GetFieldFromLablePtr(pPartData->nPartIndex, "_Parts")->GetInteger();
pPartData->nDurability = pSox->GetFieldFromLablePtr(pPartData->nPartIndex, "_Durability")->GetInteger();
pPartData->nDurabilityRepairCoin = pSox->GetFieldFromLablePtr(pPartData->nPartIndex, "_DurabilityRepairCoin")->GetInteger();
std::pair<TMapPartData::iterator,bool> Ret = m_pPartData.insert(make_pair(pPartData->nPartIndex, pPartData));
if( Ret.second == false )
delete pPartData;
}
SAFE_DELETE(pSox);
return true;
}
TPartData* CDNExtManager::GetPartData(int nPartIndex)
{
if (m_pPartData.empty()) return NULL;
TMapPartData::iterator iter = m_pPartData.find(nPartIndex);
if (iter != m_pPartData.end()){
return iter->second;
}
return NULL;
}
int CDNExtManager::GetItemDurability( int nItemID )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
int nDurability = 0;
TWeaponData *pWeapon = GetWeaponData( nItemID );
if( pWeapon ) nDurability = pWeapon->nDurability;
TPartData *pParts = GetPartData( nItemID );
if( pParts ) nDurability = pParts->nDurability;
return nDurability;
}
#elif defined(_MASTERSERVER)
//---------------------------------------------------------------------------------
// PvPGameStartConditionTable (PvPGameStartConditiontable - TPvPGameStartConditionTable)
//---------------------------------------------------------------------------------
bool CDNExtManager::LoadPvPGameStartConditionTable()
{
DNTableFileFormat *pSox = LoadExtTable( "PvPGameStartConditionTable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"PvPGameStartConditionTable failed\r\n");
SAFE_DELETE(pSox);
return false;
}
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
{
int nItemID = pSox->GetItemID(i);
int iMaxPlayerNum = pSox->GetFieldFromLablePtr( nItemID, "PlayerNumber" )->GetInteger();
if( iMaxPlayerNum <= 0 )
continue;
_ASSERT( iMaxPlayerNum <= PvPCommon::Common::MaxPlayer );
TPvPGameStartConditionTable* pPvPGameStartConditionTable = new TPvPGameStartConditionTable;
pPvPGameStartConditionTable->uiMinTeamPlayerNum = pSox->GetFieldFromLablePtr( nItemID, "Min_TeamPlayerNum_Needed" )->GetInteger();
pPvPGameStartConditionTable->uiMaxTeamPlayerDiff = pSox->GetFieldFromLablePtr( nItemID, "Max_TeamPlayerNum_Difference" )->GetInteger();
std::pair<TPvPGameStartConditionData::iterator,bool> Ret = m_PvPGameStartConditionTable.insert( make_pair( iMaxPlayerNum, pPvPGameStartConditionTable ) );
if( Ret.second == false )
delete pPvPGameStartConditionTable;
}
SAFE_DELETE(pSox);
return true;
}
bool CDNExtManager::LoadPvPGameModeTable()
{
DNTableFileFormat *pSox = LoadExtTable( "pvpgamemodetable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"pvpgamemodetable failed\r\n");
SAFE_DELETE(pSox);
return false;
}
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
{
char szBuf[MAX_PATH];
int nItemID = pSox->GetItemID(i);
TPvPGameModeTable Data;
memset( &Data, 0, sizeof(Data) );
Data.nItemID = nItemID;
Data.uiGameMode = pSox->GetFieldFromLablePtr( nItemID, "GamemodeID" )->GetInteger();
bool bSkip = true;
switch( Data.uiGameMode )
{
case PvPCommon::GameMode::PvP_Respawn:
case PvPCommon::GameMode::PvP_Round:
case PvPCommon::GameMode::PvP_Captain:
case PvPCommon::GameMode::PvP_IndividualRespawn:
case PvPCommon::GameMode::PvP_Zombie_Survival:
case PvPCommon::GameMode::PvP_GuildWar:
#if defined(PRE_ADD_DWC)
case PvPCommon::GameMode::PvP_AllKill:
#endif
{
bSkip = false;
break;
}
default:
{
break;
}
}
if( bSkip == true )
continue;
// <20>¸<EFBFBD><C2B8><EFBFBD><EFBFBD><EFBFBD>
for( int j=1 ; j<=5 ; ++j )
{
sprintf_s( szBuf, "WinCondition_%d", j );
int iWinCondition = pSox->GetFieldFromLablePtr( nItemID, szBuf )->GetInteger();
if( iWinCondition == 0 )
break;
_ASSERT( iWinCondition > 0 );
Data.vWinCondition.push_back( iWinCondition );
}
// <20>÷<EFBFBD><C3B7>̽ð<CCBD>
for( int j=1 ; j<= 5 ; ++j )
{
sprintf_s( szBuf, "PlayTime_%d", j );
int iSec = pSox->GetFieldFromLablePtr( nItemID, szBuf )->GetInteger();
if( iSec == 0 )
break;
_ASSERT( iSec > 0 );
Data.vPlayTimeSec.push_back( iSec );
}
// LadderMatchType
Data.LadderMatchType = static_cast<LadderSystem::MatchType::eCode>(pSox->GetFieldFromLablePtr( nItemID, "LadderType" )->GetInteger());
// <20><>Ȱ<EFBFBD><C8B0><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD>
Data.uiRespawnTimeSec = pSox->GetFieldFromLablePtr( nItemID, "Respawn_Time" )->GetInteger();
// <20><>Ȱ<EFBFBD><C8B0><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD>
Data.uiRespawnNoDamageTimeSec = pSox->GetFieldFromLablePtr( nItemID, "Respawn_Nodamage_Time" )->GetInteger();
// <20><>Ȱ <20><> ȸ<><C8B8><EFBFBD>Ǵ<EFBFBD> HP%
Data.uiRespawnHPPercent = pSox->GetFieldFromLablePtr( nItemID, "Respawn_HP_Percent" )->GetInteger();
// <20><>Ȱ <20><> ȸ<><C8B8><EFBFBD>Ǵ<EFBFBD> MP%
Data.uiRespawnMPPercent = pSox->GetFieldFromLablePtr( nItemID, "Respawn_MP_Percent" )->GetInteger();
// <20>¸<EFBFBD> <20><><EFBFBD>ʽ<EFBFBD> <20><><EFBFBD><EFBFBD>
Data.uiWinXPPerRound = pSox->GetFieldFromLablePtr( nItemID, "WinXP_PerRound" )->GetInteger();
// <20>й<EFBFBD> <20><><EFBFBD>ʽ<EFBFBD> <20><><EFBFBD><EFBFBD>
Data.uiLoseXPPerRound = pSox->GetFieldFromLablePtr( nItemID, "LoseXP_PerRound" )->GetInteger();
// <20><>KO<4B>õ<EFBFBD><C3B5>Ӿ<EFBFBD><D3BE><EFBFBD><EFBFBD><EFBFBD>
Data.uiItemDropTableID = pSox->GetFieldFromLablePtr( nItemID, "KOItemDropTableID" )->GetInteger();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>ON/OFF
Data.bIsLevelRegulation = ( pSox->GetFieldFromLablePtr( nItemID, "StartRegulation" )->GetInteger() == 1 ) ? true : false;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Data.bIsReleaseShow = ( pSox->GetFieldFromLablePtr( nItemID, "ReleaseShow" )->GetInteger() == 1 ) ? true : false;
// <20>޴<EFBFBD><DEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Data.uiMedalExp = pSox->GetFieldFromLablePtr( nItemID, "MedalExp" )->GetInteger();
_ASSERT( Data.uiMedalExp );
// <20>ο<EFBFBD> <20><> <20>ּ<EFBFBD> <20><><EFBFBD><EFBFBD>
Data.uiNumOfPlayersMin = pSox->GetFieldFromLablePtr( nItemID, "NumOfPlayers_Min" )->GetInteger();
// <20>ο<EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
Data.uiNumOfPlayersMax = pSox->GetFieldFromLablePtr( nItemID, "NumOfPlayers_Max" )->GetInteger();
// <20>¸<EFBFBD><C2B8><EFBFBD> <20><><EFBFBD><EFBFBD> PvPExp <20><><EFBFBD><EFBFBD>
for( int j=1 ; j<= 5 ; ++j )
{
sprintf_s( szBuf, "VictoryExp_%d", j );
int iExp = pSox->GetFieldFromLablePtr( nItemID, szBuf )->GetInteger();
Data.vVictoryExp.push_back( iExp );
}
// <20>¸<EFBFBD><C2B8><EFBFBD> <20><><EFBFBD><EFBFBD> PvPExp <20><><EFBFBD>ʽ<EFBFBD> <20><><EFBFBD><EFBFBD>
for( int j=1 ; j<= 5 ; ++j )
{
sprintf_s( szBuf, "VictoryBonusRate_%d", j );
int iExp = pSox->GetFieldFromLablePtr( nItemID, szBuf )->GetInteger();
Data.vVictoryBonusRate.push_back( iExp );
}
// <20>й<EFBFBD><D0B9><EFBFBD> <20><><EFBFBD><EFBFBD> PvPExp <20><><EFBFBD><EFBFBD>
for( int j=1 ; j<= 5 ; ++j )
{
sprintf_s( szBuf, "DefeatExp_%d", j );
int iExp = pSox->GetFieldFromLablePtr( nItemID, szBuf )->GetInteger();
Data.vDefeatExp.push_back( iExp );
}
// <20>й<EFBFBD><D0B9><EFBFBD> <20><><EFBFBD><EFBFBD> PvPExp <20><><EFBFBD>ʽ<EFBFBD> <20><><EFBFBD><EFBFBD>
for( int j=1 ; j<= 5 ; ++j )
{
sprintf_s( szBuf, "DefeatBonusRate_%d", j );
int iExp = pSox->GetFieldFromLablePtr( nItemID, szBuf )->GetInteger();
Data.vDefeatBonusRate.push_back( iExp );
}
std::pair<TPvPGameModeTableData::iterator,bool> Ret = m_PvPGameModeTable.insert( std::make_pair(nItemID,Data) );
_ASSERT( Ret.second );
if( Data.LadderMatchType >= LadderSystem::MatchType::_1vs1 )
{
std::map<LadderSystem::MatchType::eCode,std::vector<int>>::iterator itor = m_MatchTypePvPGameModeID.find( Data.LadderMatchType );
if( itor == m_MatchTypePvPGameModeID.end() )
{
std::vector<int> vData;
vData.push_back( nItemID );
m_MatchTypePvPGameModeID.insert( std::make_pair(Data.LadderMatchType,vData) );
}
else
{
(*itor).second.push_back( nItemID );
}
}
}
SAFE_DELETE(pSox);
return true;
}
//---------------------------------------------------------------------------------
// PvPMapTable (PvPMaptable - TPvPMapTable)
//---------------------------------------------------------------------------------
bool CDNExtManager::LoadPvPMapTable()
{
DNTableFileFormat *pSox = LoadExtTable( "PvPMapTable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"PvPMapTable failed\r\n");
SAFE_DELETE(pSox);
return false;
}
if( pSox->GetItemCount() <= 0 )
{
g_Log.Log( LogType::_FILELOG, L"PvPMapTable Count(%d)\r\n", pSox->GetItemCount() );
SAFE_DELETE(pSox);
return false;
}
char szTemp[MAX_PATH];
//##################################################################
// FieldNum <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>
//##################################################################
struct TempFieldNum
{
int MapTableID;
int GameModeType;
std::vector<int> GameModeTableID;
std::vector<int> NumOfPlayersOption;
int Allow_Breakin_PlayingGame;
int ItemUsageType;
int AllowItemDrop;
int IsGuildBattleGround;
int ReleaseShow;
int LadderType;
};
TempFieldNum sFieldNum;
sFieldNum.MapTableID = pSox->GetFieldNum( "MapTableID" );
sFieldNum.GameModeType = pSox->GetFieldNum( "GameModeType" );
sFieldNum.Allow_Breakin_PlayingGame = pSox->GetFieldNum( "Allow_Breakin_PlayingGame" );
sFieldNum.ItemUsageType = pSox->GetFieldNum( "ItemUsageType" );
sFieldNum.AllowItemDrop = pSox->GetFieldNum( "AllowItemDrop" );
sFieldNum.IsGuildBattleGround = pSox->GetFieldNum( "IsGuildBattleGround" );
sFieldNum.ReleaseShow = pSox->GetFieldNum( "ReleaseShow" );
sFieldNum.LadderType = pSox->GetFieldNum( "_LadderType" );
sFieldNum.GameModeTableID.reserve(10);
for( int j=1 ; j<=10 ; ++j )
{
sprintf_s( szTemp, "GameModeTableID_%d", j );
sFieldNum.GameModeTableID.push_back( pSox->GetFieldNum(szTemp) );
}
sFieldNum.NumOfPlayersOption.reserve(5);
for( int j=1 ; j<= 5 ; ++j )
{
sprintf_s( szTemp, "NumOfPlayersOption%d", j );
sFieldNum.NumOfPlayersOption.push_back( pSox->GetFieldNum(szTemp) );
}
//##################################################################
// Load
//##################################################################
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
{
int nItemID = pSox->GetItemID(i);
int iIdx = pSox->GetIDXprimary(nItemID);
int nMapTableID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.MapTableID )->GetInteger();
if( nMapTableID == 0 )
continue;
// _ASSERT( nMapTableID == nItemID );
TPvPMapTable* pPvPMapTable = new TPvPMapTable;
pPvPMapTable->vGameModeTableID.reserve( 10 );
pPvPMapTable->vNumOfPlayerOption.reserve( 5 );
// GameType
pPvPMapTable->uiGameType = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.GameModeType )->GetInteger();
_ASSERT( pPvPMapTable->uiGameType < PvPCommon::GameType::Max );
// GameMode
for( int j=1 ; j<=10 ; ++j )
{
int iTableID = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.GameModeTableID[j-1] )->GetInteger();
if( iTableID == 0 )
break;
pPvPMapTable->vGameModeTableID.push_back( iTableID );
}
_ASSERT( pPvPMapTable->vGameModeTableID.size() );
// <20>ο<EFBFBD><CEBF><EFBFBD>
for( int j=1 ; j<= 5 ; ++j )
{
int nCount = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.NumOfPlayersOption[j-1] )->GetInteger();
if( nCount <= 0 )
break;
_ASSERT( nCount <= PvPCommon::Common::MaxPlayer );
pPvPMapTable->vNumOfPlayerOption.push_back( nCount );
}
_ASSERT( pPvPMapTable->vNumOfPlayerOption.size() );
// <20><><EFBFBD>԰<EFBFBD><D4B0><EFBFBD>Flag
pPvPMapTable->bIsBreakInto = ( pSox->GetFieldFromLablePtr( iIdx, sFieldNum.Allow_Breakin_PlayingGame )->GetInteger() == 0 ) ? false : true;
// PvPCommon::ItemUsageType
int nItemUsageType = pSox->GetFieldFromLablePtr( iIdx, sFieldNum.ItemUsageType )->GetInteger();
_ASSERT( nItemUsageType >= 0 && nItemUsageType < PvPCommon::ItemUsageType::Max );
// <20><><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD><DBB5><EFBFBD> Flag
pPvPMapTable->bIsAllowItemDrop = ( pSox->GetFieldFromLablePtr( iIdx, sFieldNum.AllowItemDrop )->GetInteger() == 0 ) ? false : true;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> Flag
pPvPMapTable->bIsGuildBattleGround = ( pSox->GetFieldFromLablePtr( iIdx, sFieldNum.IsGuildBattleGround )->GetInteger() == 0 ) ? false : true;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pPvPMapTable->bIsReleaseShow = ( pSox->GetFieldFromLablePtr( iIdx, sFieldNum.ReleaseShow )->GetInteger() == 0 ) ? false : true;
pPvPMapTable->MatchType = static_cast<LadderSystem::MatchType::eCode>(pSox->GetFieldFromLablePtr( iIdx, sFieldNum.LadderType )->GetInteger() );
std::pair<TPvPMapTableData::iterator,bool> Ret = m_PvPMapTable.insert( make_pair( nMapTableID, pPvPMapTable ) );
if( Ret.second == false )
delete pPvPMapTable;
}
SAFE_DELETE(pSox);
return true;
}
const TPvPMapTable* CDNExtManager::GetPvPMapTable( const int nItemID )
{
TPvPMapTableData::iterator itor = m_PvPMapTable.find( nItemID );
if( itor != m_PvPMapTable.end() )
return itor->second;
return NULL;
}
bool CDNExtManager::LoadGuildWarMapInfoTable()
{
DNTableFileFormat *pSox = LoadExtTable( "pvpguildwarmapmaketable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"pvpguildwarmapmaketable failed\r\n");
SAFE_DELETE(pSox);
return false;
}
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
{
int nItemID = pSox->GetItemID(i);
TGuildWarMapInfo GuildWarMapInfo;
GuildWarMapInfo.uiMapTableID = pSox->GetFieldFromLablePtr( nItemID, "_PvPMapTableID" )->GetInteger();
GuildWarMapInfo.cGuildWarUseMonth = pSox->GetFieldFromLablePtr( nItemID, "_GuildWarUseMonth" )->GetInteger();
m_GuildWarMapInfo.insert( make_pair( GuildWarMapInfo.cGuildWarUseMonth, GuildWarMapInfo ) );
}
SAFE_DELETE(pSox);
return true;
}
UINT CDNExtManager::GetGuildWarMapInfoID(char cMonth)
{
TGuildWarMapInfoData::iterator itor = m_GuildWarMapInfo.find( cMonth );
if( itor != m_GuildWarMapInfo.end() )
return itor->second.uiMapTableID;
return 0;
}
const TPvPGameModeTable* CDNExtManager::GetPvPGameModeTable( const int nItemID )
{
TPvPGameModeTableData::iterator itor = m_PvPGameModeTable.find( nItemID );
if( itor != m_PvPGameModeTable.end() )
return &(itor)->second;
return NULL;
}
bool CDNExtManager::LoadScheduleTable()
{
DNTableFileFormat *pSox = LoadExtTable( "ScheduleTable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"ScheduleTable failed\r\n");
SAFE_DELETE(pSox);
return false;
}
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
{
int nItemID = pSox->GetItemID(i);
TSchedule Schedule;
Schedule.cHour = pSox->GetFieldFromLablePtr( nItemID, "_Hour" )->GetInteger();
Schedule.cMinute = pSox->GetFieldFromLablePtr( nItemID, "_Minute" )->GetInteger();
Schedule.nCycle = pSox->GetFieldFromLablePtr( nItemID, "_Cycle" )->GetInteger();
m_ScheduleTable.insert( make_pair( nItemID, Schedule ) );
}
SAFE_DELETE(pSox);
return true;
}
TPvPGameStartConditionTable* CDNExtManager::GetPvPGameStartConditionTable( const UINT uiMaxUser )
{
TPvPGameStartConditionData::iterator itor = m_PvPGameStartConditionTable.find( uiMaxUser );
if( itor != m_PvPGameStartConditionTable.end() )
return itor->second;
return NULL;
}
const TPvPGameModeTable* CDNExtManager::GetPvPGameModeTableByMatchType( LadderSystem::MatchType::eCode MatchType )
{
std::map<LadderSystem::MatchType::eCode,std::vector<int>>::iterator itor = m_MatchTypePvPGameModeID.find( MatchType );
if( itor == m_MatchTypePvPGameModeID.end() )
{
_ASSERT(0);
return NULL;
}
if ((*itor).second.size() <= 0)
{
_ASSERT(0);
return NULL;
}
::srand( timeGetTime() );
int iRandIndex = static_cast<int>(::rand()%(*itor).second.size());
TPvPGameModeTableData::iterator itor2 = m_PvPGameModeTable.find( (*itor).second[iRandIndex] );
if( itor2 == m_PvPGameModeTable.end() )
{
_ASSERT(0);
return NULL;
}
return &(*itor2).second;
}
TSchedule* CDNExtManager::GetSchedule( int nSchedule )
{
TScheduleData::iterator itor = m_ScheduleTable.find( nSchedule );
if( itor != m_ScheduleTable.end() )
{
return &(itor->second);
}
return NULL;
}
#endif
bool CDNExtManager::LoadPCBangData()
{
DNTableFileFormat *pSox = LoadExtTable( "PCCafeTable" );
if( !pSox )
{
g_Log.Log( LogType::_FILELOG, L"PCCafeTable failed\r\n");
SAFE_DELETE(pSox);
return false;
}
//##################################################################
// FieldNum <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>
//##################################################################
struct TempFieldNum
{
int _Type;
int _PCParam[PCParamMax];
int _PremiumPCParam[PCParamMax];
int _GoldPCParam[PCParamMax];
int _SilverPCParam[PCParamMax];
int _RedPCParam[PCParamMax];
};
TempFieldNum sFieldNum;
sFieldNum._Type = pSox->GetFieldNum( "_Type" );
sFieldNum._PCParam[0] = pSox->GetFieldNum( "_PCParam1" );
sFieldNum._PCParam[1] = pSox->GetFieldNum( "_PCParam2" );
sFieldNum._PremiumPCParam[0] = pSox->GetFieldNum( "_PremiumPCParam1" );
sFieldNum._PremiumPCParam[1] = pSox->GetFieldNum( "_PremiumPCParam2" );
sFieldNum._GoldPCParam[0] = pSox->GetFieldNum( "_GoldPCParam1" );
sFieldNum._GoldPCParam[1] = pSox->GetFieldNum( "_GoldPCParam2" );
sFieldNum._SilverPCParam[0] = pSox->GetFieldNum( "_SilverPCParam1" );
sFieldNum._SilverPCParam[1] = pSox->GetFieldNum( "_SilverPCParam2" );
sFieldNum._RedPCParam[0] = pSox->GetFieldNum( "_RedPCParam1" );
sFieldNum._RedPCParam[1] = pSox->GetFieldNum( "_RedPCParam1" );
//##################################################################
// Load
//##################################################################
for( int i=0 ; i<pSox->GetItemCount() ; ++i )
{
int iIdx = pSox->GetIDXprimary( pSox->GetItemID(i) );
int nType = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._Type )->GetInteger();
TPCBangData *pPCBangData = GetPCBangData(nType);
if (!pPCBangData){
pPCBangData = new TPCBangData;
pPCBangData->cType = nType;
m_pPCBangData.insert(make_pair(nType, pPCBangData));
}
TPCBangParam Normal = {0,}, Premium = {0,}, Gold = {0,}, Silver = {0,}, Red = {0,};
for (int j = 0; j < PCParamMax; j++){
Normal.nParam[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._PCParam[j] )->GetInteger();
Premium.nParam[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._PremiumPCParam[j] )->GetInteger();
Gold.nParam[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._GoldPCParam[j] )->GetInteger();
Silver.nParam[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._SilverPCParam[j] )->GetInteger();
Red.nParam[j] = pSox->GetFieldFromLablePtr( iIdx, sFieldNum._RedPCParam[j] )->GetInteger();
}
}
SAFE_DELETE(pSox);
return true;
}
int CDNExtManager::GetPCBangDataCount()
{
return (int)m_pPCBangData.size();
}
TPCBangData *CDNExtManager::GetPCBangData(int nPCBangType)
{
if (m_pPCBangData.empty()) return NULL;
TMapPCBangData::iterator iter = m_pPCBangData.find(nPCBangType);
if (iter == m_pPCBangData.end()) return NULL;
return iter->second;
}
int CDNExtManager::GetPCBangParam1(int nPCBangType, int nPCBangGrade)
{
TPCBangData *pPCBangData = GetPCBangData(nPCBangType);
if (!pPCBangData) return 0;
int nValue = 0;
switch (nPCBangGrade)
{
case PCBang::Grade::None: // <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>̵<EFBFBD> <20>ƴϵ<C6B4> <20><EFBFBD><E2BABB><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28>Ϲݿ<CFB9><DDBF><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>;<EFBFBD><CDBE><EFBFBD>)
case PCBang::Grade::Normal:
{
if (!pPCBangData->VecPCBangParam.empty())
nValue = pPCBangData->VecPCBangParam[0].nParam[0];
}
break;
case PCBang::Grade::Premium:
{
if (!pPCBangData->VecPremiumPCBangParam.empty())
nValue = pPCBangData->VecPremiumPCBangParam[0].nParam[0];
}
break;
case PCBang::Grade::Gold:
{
if (!pPCBangData->VecGoldPCBangParam.empty())
nValue = pPCBangData->VecGoldPCBangParam[0].nParam[0];
}
break;
case PCBang::Grade::Silver:
{
if (!pPCBangData->VecSilverPCBangParam.empty())
nValue = pPCBangData->VecSilverPCBangParam[0].nParam[0];
}
break;
case PCBang::Grade::Red:
{
if (!pPCBangData->VecRedPCBangParam.empty())
nValue = pPCBangData->VecRedPCBangParam[0].nParam[0];
}
break;
}
return nValue;
}
int CDNExtManager::GetPCBangParam2(int nPCBangType, int nPCBangGrade)
{
TPCBangData *pPCBangData = GetPCBangData(nPCBangType);
if (!pPCBangData) return 0;
int nValue = 0;
switch (nPCBangGrade)
{
case PCBang::Grade::None: // <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>̵<EFBFBD> <20>ƴϵ<C6B4> <20><EFBFBD><E2BABB><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28>Ϲݿ<CFB9><DDBF><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>;<EFBFBD><CDBE><EFBFBD>)
case PCBang::Grade::Normal:
{
if (!pPCBangData->VecPCBangParam.empty())
nValue = pPCBangData->VecPCBangParam[0].nParam[1];
}
break;
case PCBang::Grade::Premium:
{
if (!pPCBangData->VecPremiumPCBangParam.empty())
nValue = pPCBangData->VecPremiumPCBangParam[0].nParam[1];
}
break;
case PCBang::Grade::Gold:
{
if (!pPCBangData->VecGoldPCBangParam.empty())
nValue = pPCBangData->VecGoldPCBangParam[0].nParam[1];
}
break;
case PCBang::Grade::Silver:
{
if (!pPCBangData->VecSilverPCBangParam.empty())
nValue = pPCBangData->VecSilverPCBangParam[0].nParam[1];
}
break;
case PCBang::Grade::Red:
{
if (!pPCBangData->VecRedPCBangParam.empty())
nValue = pPCBangData->VecRedPCBangParam[0].nParam[1];
}
break;
}
return nValue;
}
int CDNExtManager::GetPCBangNestClearCount(int nPCBangGrade, int nMapID)
{
TPCBangData *pPCBangData = GetPCBangData(PCBang::Type::NestClearCount);
if (!pPCBangData) return 0;
int nClearCount = 0;
switch (nPCBangGrade)
{
case PCBang::Grade::None:
break;
case PCBang::Grade::Normal:
{
if (!pPCBangData->VecPCBangParam.empty()){
for (int i = 0; i < (int)pPCBangData->VecPCBangParam.size(); i++){
if (pPCBangData->VecPCBangParam[i].nParam[0] == nMapID){
nClearCount = pPCBangData->VecPCBangParam[i].nParam[1];
break;
}
}
}
}
break;
case PCBang::Grade::Premium:
{
if (!pPCBangData->VecPremiumPCBangParam.empty()){
for (int i = 0; i < (int)pPCBangData->VecPremiumPCBangParam.size(); i++){
if (pPCBangData->VecPremiumPCBangParam[i].nParam[0] == nMapID){
nClearCount = pPCBangData->VecPremiumPCBangParam[i].nParam[1];
break;
}
}
}
}
break;
case PCBang::Grade::Gold:
{
if (!pPCBangData->VecGoldPCBangParam.empty()){
for (int i = 0; i < (int)pPCBangData->VecGoldPCBangParam.size(); i++){
if (pPCBangData->VecGoldPCBangParam[i].nParam[0] == nMapID){
nClearCount = pPCBangData->VecGoldPCBangParam[i].nParam[1];
break;
}
}
}
}
break;
case PCBang::Grade::Silver:
{
if (!pPCBangData->VecSilverPCBangParam.empty()){
for (int i = 0; i < (int)pPCBangData->VecSilverPCBangParam.size(); i++){
if (pPCBangData->VecSilverPCBangParam[i].nParam[0] == nMapID){
nClearCount = pPCBangData->VecSilverPCBangParam[i].nParam[1];
break;
}
}
}
}
break;
case PCBang::Grade::Red:
{
if (!pPCBangData->VecRedPCBangParam.empty()){
for (int i = 0; i < (int)pPCBangData->VecRedPCBangParam.size(); i++){
if (pPCBangData->VecRedPCBangParam[i].nParam[0] == nMapID){
nClearCount = pPCBangData->VecRedPCBangParam[i].nParam[1];
break;
}
}
}
}
break;
}
return nClearCount;
}
bool CDNExtManager::GetPCBangClearBoxFlag(int nPCBangGrade)
{
if (nPCBangGrade == PCBang::Grade::None) return false;
int nValue = GetPCBangParam1(PCBang::Type::ClearBox, nPCBangGrade);
return (nValue == 1) ? true : false;
}
void CDNExtManager::GetXMLAccountDBID(UINT nAccountDBID, std::wstring &wstrOut)
{
if (nAccountDBID <= 0) return;
wstrOut = FormatW(L"<root><Account AccountID=\"%d\"/></root>", nAccountDBID);
}
void CDNExtManager::GetXMLAccountName(WCHAR *pAccountName, std::wstring &wstrOut)
{
if (!pAccountName) return;
wstrOut = FormatW(L"<root><Account AccountName=\"%s\"/></root>", pAccountName);
}
void CDNExtManager::GetXMLCharacterDBID(INT64 biCharacterDBID, std::wstring &wstrOut)
{
if (biCharacterDBID <= 0) return;
wstrOut = FormatW(L"<root><Character CharacterID=\"%I64d\"/></root>", biCharacterDBID);
}
void CDNExtManager::GetXMLCharacterName(WCHAR *pCharacterName, std::wstring &wstrOut)
{
if (!pCharacterName) return;
wstrOut = FormatW(L"<root><Character CharacterName=\"%s\"/></root>", pCharacterName);
}
void CDNExtManager::GetXMLItems(int nItemTotalCount, TSpecialBoxItemInfo *Items, std::wstring &wstrOut)
{
if (nItemTotalCount <= 0) return;
std::wstring wstrItem;
wstrOut.append(L"<root>");
for (int i = 0; i < nItemTotalCount; i++){
wstrItem = FormatW(L"<Item ProductFlag=\"%d\" ItemID=\"%d\" ItemCount=\"%d\" ItemDurability=\"%d\" RandomSeed=\"%d\" ItemLevel=\"%d\" ItemPotential=\"%d\" SoulBoundFlag=\"%d\" SealCount=\"%d\" ItemOption=\"%d\" ItemLifespan=\"%d\" EternityFlag=\"%d\"/>",
Items[i].bCashItem, Items[i].RewardItem.nItemID, Items[i].RewardItem.wCount, (short)Items[i].RewardItem.wDur, Items[i].RewardItem.nRandomSeed, Items[i].RewardItem.cLevel, Items[i].RewardItem.cPotential,
Items[i].RewardItem.bSoulbound, Items[i].RewardItem.cSealCount, Items[i].RewardItem.cOption, Items[i].RewardItem.nLifespan, Items[i].RewardItem.bEternity);
wstrOut.append(wstrItem.c_str());
}
wstrOut.append(L"</root>");
}
extern CDNExtManager* g_pExtManager;