#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 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) //ÀÏ´Ü 0¹øÀº µðÆúÆ® 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 ¼¼ÆÃÇϱâ #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 ::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 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 TMapPlayerLevelTable; SAFE_DELETEA_PMAP( TMapPlayerLevelTable, m_nMapTable ); SAFE_DELETE_PVEC(m_pGuildWarRewardData); #endif // #if defined(_DBSERVER) || defined(_CASHSERVER) for (map >::iterator ii = m_mapDefaultUnlockSkillsByClass.begin(); ii != m_mapDefaultUnlockSkillsByClass.end(); ii++) { for (vector::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 &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 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 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; iLoad(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; iGetItemCount(); i++ ) { int nItemID = pSox->GetItemID(i); if( nItemID % PLAYER_MAX_LEVEL == 1 ) { LevelValue *pValue = new LevelValue[PLAYER_MAX_LEVEL]; for( DWORD j=0; jGetItemID(i+j); for( int k=0; kGetFieldFromLablePtr( 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 ³Ñ¾î°¡¸é¼­ i++ ½Ã۱ⶫ¿¡ Çϳª »©¼­ ÇÑ´Ù. } } SAFE_DELETE( pSox ); return true; } int CDNExtManager::GetValue( int nClassID, int nLevel, PlayerLevelTableIndex::ePlayerLevelTableIndex Index ) { std::map::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::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 ¹Ì¸® »öÀÎ //################################################################## 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 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 ¹Ì¸® »öÀÎ //################################################################## 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 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 Lock(m_Sync); BackupMapCashCommodity = m_pMapCashCommodity; m_pMapCashCommodity.clear(); } char szTemp[MAX_PATH] = { 0, }; //################################################################## // FieldNum ¹Ì¸® »öÀÎ //################################################################## struct TempFieldNum { int _SN; #if defined(_JP) int _SNJPN; #endif // #if defined(_JP) int _Category; int _SubCategory; int _NameID; std::vector _ItemID; std::vector _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 Lock(m_Sync); std::pair Ret = m_pMapCashCommodity.insert(make_pair(pCashData->nSN, pCashData)); if (Ret.second == false) delete pCashData; } SAFE_DELETE( pSox ); if (bReload) { ScopeLock Lock(m_Sync); SAFE_DELETE_PMAP(TMapCashCommodity, BackupMapCashCommodity); } return true; } bool CDNExtManager::GetCashCommodityData(int nSN, TCashCommodityData &Data) { ScopeLock 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 Lock(m_Sync); TMapCashCommodity::iterator iter = m_pMapCashCommodity.find(nSN); if (m_pMapCashCommodity.end() != iter) return (*iter).second->nPrice; //-1Àº ²ÇÂ¥ return 0; } bool CDNExtManager::IsReserveCommodity(int nSN) { ScopeLock 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 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 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 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 Lock(m_Sync); TMapCashCommodity::iterator iter = m_pMapCashCommodity.find(nSN); if (m_pMapCashCommodity.end() != iter) return (*iter).second->wPeriod; // -1Àº ¹«ÇÑ return 0; } int CDNExtManager::GetCashCommodityCount(int nSN) { ScopeLock 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 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 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 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 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 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 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 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 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 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 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 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; // ºÒ°¡´É.. return bResult; } bResult = pCashData->bNoRefund; if( !bResult && nID > 0) // ȯºÒ °¡´ÉÀ϶§ ŸÀÔÀ¸·Î Çѹø ´õ È®ÀÎÇÏÀÚ..±âȹÆÀ ½Ç¼ö ¹æÁö.. { 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 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 Lock(m_Sync); BackupMapCashPackage = m_pMapCashPackage; m_pMapCashPackage.clear(); } char szTemp[MAX_PATH] = { 0, }; //################################################################## // FieldNum ¹Ì¸® »öÀÎ //################################################################## struct TempFieldNum { int _SN; std::vector _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 Lock(m_Sync); std::pair Ret = m_pMapCashPackage.insert(make_pair(pCashData->nSN, pCashData)); if (Ret.second == false) delete pCashData; } if (bReload) { ScopeLock Lock(m_Sync); SAFE_DELETE_PMAP(TMapCashPackage, BackupMapCashPackage); } SAFE_DELETE( pSox ); return true; } bool CDNExtManager::GetCashPackageData(int nSN, TCashPackageData &Data) { ScopeLock 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 ¹Ì¸® »öÀÎ //################################################################## 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 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 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 ¿ù/ÀÏ/³â _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 ÀÏ/¿ù/³â _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 ³â/¿ù/ÀÏ _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; // ÇÑÁ¤ÆÇ¸Å ¾Æ´Ô 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ÀÏ ±âÁØÀÓ..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¿¡ ¾øÀ¸¸é ±×³É Åë°úÇÏÀÚ È¤½Ã³ª Å×ÀÌºí¿¡ Ãß°¡¾ÈÇØ¼­ ÆÇ¸Å°¡ ¾ÈµÉ±îºÁ. } 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 ¹Ì¸® »öÀÎ //################################################################## 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 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 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 ¹Ì¸® »öÀÎ //################################################################## 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 ¹Ì¸® »öÀÎ //################################################################## 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 º¸È£ À§ÇØ »ý¼ºÀÚ·Î º¯È¯ 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 ¹Ì¸® »öÀÎ //################################################################## 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 ; iGetItemCount() ; ++i ) { TMailTableData Data; int nItemID = pSox->GetItemID(i); int iIdx = pSox->GetIDXprimary( nItemID ); Data.Code = static_cast(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 ; iGetFieldFromLablePtr( 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 ¹Ì¸® »öÀÎ //################################################################## 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; iGetItemCount(); 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::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 ¹Ì¸® »öÀÎ //################################################################## 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 ; iGetItemCount() ; ++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 ) // ±âº»Á÷¾÷Àº Â÷¼ö°¡ 0 ºÎÅÍ ½ÃÀÛÀ̶ó ¼öÁ¤. return pTJobTableData; } return NULL; } bool CDNExtManager::LoadNewCharCreate() { // TODO(Cussrro): ûÓÐÕâ¸öÎļþ 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 vGateMapIndexs; TokenizeA(pszGateMapIndexs, vGateMapIndexs, ";"); std::vector vGateStartIndexs; TokenizeA(pszGateStartIndexs, vGateStartIndexs, ";"); for (int k=0; kGateMapIndexs[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 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"ä³ÎÁ¤º¸¿¡ ¾ÆÀÌÇǰ¡ µî·ÏµÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù. Á¤È«Ã¶À» ã¾ÆÁÖ¼¼¿ä!"); 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; } // »èÁ¦ ¿¹Á¤ !!! 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& 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; // ÀÏ´Ü onlineÀÎ ¾Öµé¸¸ »Ñ·ÁÁÖÀÚ #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) ¸¦ ³Ñ´Â °æ¿ì´Â ¾øÀ»°Å¶ó »ý°¢ÇÑ´Ù. 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; //¸ß°æ±¾×ÊÔ´ wprintf(L"[RLKT]NewGameRes DEFAULTQUICKSLOTMAX = 60 \n"); #else int nDEFAULTQUICKSLOTMAX = 50; //Àϰ汾×ÊÔ´ 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; jGetFieldFromLablePtr( 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; jGetFieldFromLablePtr( 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; jGetFieldFromLablePtr( 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; } // Á÷¾÷ ¾ÆÀ̵ð·Î ºÎ¸ð Á÷¾÷ ¾ÆÀ̵𸦠ãÀ½. map 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¿¡ Á¤ÀǵǾîÀִ´ë·Î, //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: µðÆúÆ® ¶ô ½ºÅ³À» ã¾Æ¼­ ³Ö¾îÁÖ´Â °ÍÀ̱⠶§¹®¿¡ °ü·ÃµÇ¾î ÇÊ¿äÇÑ Á¤º¸¸¸ ÀоîµÎ¸é µÈ´Ù. 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::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 && "µðÆúÆ®·Î ÁÖ´Â ½ºÅ³ Áß¿¡ µðÆúÆ® ¾ð¶ô ½ºÅ³·Î ¼³Á¤µÇ¾îÀÖ´Â °ÍÀÌ ÀÖÀ¸¸é ¾ÈµÊ." ); } _ASSERT( (int)m_mapDefaultUnlockSkillsByClass[ iRootJobID ].size() < DEFAULTUNLOCKSKILLMAX && "µðÆúÆ® ¾ð¶ô ½ºÅ³ ÃÖ´ë °¹¼ö Ãʰú." ); 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; idwHairColor[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; idwSkinColor[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; idwEyeColor[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 nVecList; for( int i=0; inCreateMapStartPositionX[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 >::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(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; //¸ß°æ±¾×ÊÔ´ wprintf(L"[RLKT]NewGameRes DEFAULTQUICKSLOTMAX = 60 \n"); #else int nDEFAULTQUICKSLOTMAX = 50; //Àϰ汾×ÊÔ´ 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 nVecList; for( int i=0; inCreateMapStartPositionX[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; } // ±ÝÄ¢¾î #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 ::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::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::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 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 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 ) { // ³»±¸µµ ±¸Çؼ­ ¼ÂÆÃÇÑ´Ù. 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 ; iGetItemCount() ; ++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 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 ; iGetItemCount() ; ++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; // ½Â¸®Á¶°Ç 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 ); } // Ç÷¹À̽ð£ 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(pSox->GetFieldFromLablePtr( nItemID, "LadderType" )->GetInteger()); // ºÎȰ´ë±â½Ã°£ Data.uiRespawnTimeSec = pSox->GetFieldFromLablePtr( nItemID, "Respawn_Time" )->GetInteger(); // ºÎȰ¹«Àû½Ã°£ Data.uiRespawnNoDamageTimeSec = pSox->GetFieldFromLablePtr( nItemID, "Respawn_Nodamage_Time" )->GetInteger(); // ºÎȰ ½Ã ȸº¹µÇ´Â HP% Data.uiRespawnHPPercent = pSox->GetFieldFromLablePtr( nItemID, "Respawn_HP_Percent" )->GetInteger(); // ºÎȰ ½Ã ȸº¹µÇ´Â MP% Data.uiRespawnMPPercent = pSox->GetFieldFromLablePtr( nItemID, "Respawn_MP_Percent" )->GetInteger(); // ½Â¸® º¸³Ê½º Á¡¼ö Data.uiWinXPPerRound = pSox->GetFieldFromLablePtr( nItemID, "WinXP_PerRound" )->GetInteger(); // ÆÐ¹è º¸³Ê½º Á¡¼ö Data.uiLoseXPPerRound = pSox->GetFieldFromLablePtr( nItemID, "LoseXP_PerRound" )->GetInteger(); // ÀûKO½Ãµå·Ó¾ÆÀÌÅÛ Data.uiItemDropTableID = pSox->GetFieldFromLablePtr( nItemID, "KOItemDropTableID" )->GetInteger(); // ·¹º§º¸Á¤½Ã½ºÅÛON/OFF Data.bIsLevelRegulation = ( pSox->GetFieldFromLablePtr( nItemID, "StartRegulation" )->GetInteger() == 1 ) ? true : false; // ¸±¸®Áî¹öÀü¿¡¼­³ëÃâ Data.bIsReleaseShow = ( pSox->GetFieldFromLablePtr( nItemID, "ReleaseShow" )->GetInteger() == 1 ) ? true : false; // ¸Þ´ÞÁö±ÞÁ¡¼ö Data.uiMedalExp = pSox->GetFieldFromLablePtr( nItemID, "MedalExp" )->GetInteger(); _ASSERT( Data.uiMedalExp ); // Àοø ¼ö ÃÖ¼Ò Á¦ÇÑ Data.uiNumOfPlayersMin = pSox->GetFieldFromLablePtr( nItemID, "NumOfPlayers_Min" )->GetInteger(); // Àοø ¼ö ÃÖ´ë Á¦ÇÑ Data.uiNumOfPlayersMax = pSox->GetFieldFromLablePtr( nItemID, "NumOfPlayers_Max" )->GetInteger(); // ½Â¸®½Ã ¾ò´Â PvPExp Á¡¼ö 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 ); } // ½Â¸®½Ã ¾ò´Â PvPExp º¸³Ê½º Á¡¼ö 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 ); } // ÆÐ¹è½Ã ¾ò´Â PvPExp Á¡¼ö 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 ); } // ÆÐ¹è½Ã ¾ò´Â PvPExp º¸³Ê½º Á¡¼ö 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 Ret = m_PvPGameModeTable.insert( std::make_pair(nItemID,Data) ); _ASSERT( Ret.second ); if( Data.LadderMatchType >= LadderSystem::MatchType::_1vs1 ) { std::map>::iterator itor = m_MatchTypePvPGameModeID.find( Data.LadderMatchType ); if( itor == m_MatchTypePvPGameModeID.end() ) { std::vector 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 ¹Ì¸® »öÀÎ //################################################################## struct TempFieldNum { int MapTableID; int GameModeType; std::vector GameModeTableID; std::vector 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 ; iGetItemCount() ; ++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() ); // Àοø¼ö 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() ); // ³­ÀÔ°¡´É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 ); // ¾ÆÀÌÅÛµå·Ó Flag pPvPMapTable->bIsAllowItemDrop = ( pSox->GetFieldFromLablePtr( iIdx, sFieldNum.AllowItemDrop )->GetInteger() == 0 ) ? false : true; // ±æµåÀü¿¡¼­ »ç¿ëÇÒ¼ö ÀÖ´ÂÁö Flag pPvPMapTable->bIsGuildBattleGround = ( pSox->GetFieldFromLablePtr( iIdx, sFieldNum.IsGuildBattleGround )->GetInteger() == 0 ) ? false : true; // ¸±¸®Áî¹öÀü¿¡¼­³ëÃâ pPvPMapTable->bIsReleaseShow = ( pSox->GetFieldFromLablePtr( iIdx, sFieldNum.ReleaseShow )->GetInteger() == 0 ) ? false : true; pPvPMapTable->MatchType = static_cast(pSox->GetFieldFromLablePtr( iIdx, sFieldNum.LadderType )->GetInteger() ); std::pair 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 ; iGetItemCount() ; ++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 ; iGetItemCount() ; ++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>::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(::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 ¹Ì¸® »öÀÎ //################################################################## 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 ; iGetItemCount() ; ++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: // ÇǾ¾¹æÀÌµç ¾Æ´Ïµç ±âº»°ªÀº ³Ö¾îÁà¾ßÇÔ(ÀϹݿ¡¼­ ÇǾ¾¹æ °¬À»¶§ °ª ¾ò¾î¿Í¾ßÇÔ) 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: // ÇǾ¾¹æÀÌµç ¾Æ´Ïµç ±âº»°ªÀº ³Ö¾îÁà¾ßÇÔ(ÀϹݿ¡¼­ ÇǾ¾¹æ °¬À»¶§ °ª ¾ò¾î¿Í¾ßÇÔ) 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"", nAccountDBID); } void CDNExtManager::GetXMLAccountName(WCHAR *pAccountName, std::wstring &wstrOut) { if (!pAccountName) return; wstrOut = FormatW(L"", pAccountName); } void CDNExtManager::GetXMLCharacterDBID(INT64 biCharacterDBID, std::wstring &wstrOut) { if (biCharacterDBID <= 0) return; wstrOut = FormatW(L"", biCharacterDBID); } void CDNExtManager::GetXMLCharacterName(WCHAR *pCharacterName, std::wstring &wstrOut) { if (!pCharacterName) return; wstrOut = FormatW(L"", pCharacterName); } void CDNExtManager::GetXMLItems(int nItemTotalCount, TSpecialBoxItemInfo *Items, std::wstring &wstrOut) { if (nItemTotalCount <= 0) return; std::wstring wstrItem; wstrOut.append(L""); for (int i = 0; i < nItemTotalCount; i++){ wstrItem = FormatW(L"", 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""); } extern CDNExtManager* g_pExtManager;