#include "stdafx.h" #include "DnCostumeRandomMixDataMgr.h" #ifdef PRE_ADD_COSRANDMIX #include "DnCommonUtil.h" //#if defined (_SERVER) || defined (_CLIENT) #include "DnCommonDef.h" //#endif #ifdef _SERVER #include "DNGameDataManager.h" #elif _CLIENT #include "DnItemSlotButton.h" #include "DnItem.h" #include "DnItemTask.h" #endif #ifdef PRE_ADD_COSRANDMIX_MIXERTYPE #include "./boost/tuple/tuple_comparison.hpp" #endif #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif CDnCostumeRandomMixDataMgr::CDnCostumeRandomMixDataMgr() #if defined _WORK || defined _KR || defined _KRAZ || defined _TABLEVERIFIER || defined _CH : m_bEnableCosRandomMix(true) #else : m_bEnableCosRandomMix(false) #endif , m_nCosMixProbabilityResultCount(21) { #ifdef _CLIENT #ifdef PRE_ADD_COSRANDMIX_ACCESSORY m_OpenType = CostumeMix::RandomMix::OpenFail; #endif #ifdef PRE_ADD_COSRANDMIX_MIXERTYPE m_nMixerEnablePartsType = CostumeMix::RandomMix::MixerCanMixPartsAll; #endif #endif } #if defined (_WORK) && defined (_SERVER) bool CDnCostumeRandomMixDataMgr::LoadData(bool bReload/* = false*/) #else //#if defined (_WORK) && defined (_SERVER) bool CDnCostumeRandomMixDataMgr::LoadData() #endif //#if defined (_WORK) && defined (_SERVER) { if (IsEnableCosRandomMix() == false) return true; #if defined (_WORK) && defined (_SERVER) DNTableFileFormat* pCosRandMixTable = NULL; if (bReload) pCosRandMixTable = CDnTableDB::GetInstance().ReLoadSox(CDnTableDB::TCOSMIXINFO); else pCosRandMixTable = GetDNTable(CDnTableDB::TCOSMIXINFO); if (pCosRandMixTable == NULL) { g_Log.Log( LogType::_FILELOG, L"costumemixinfo.ext failed\r\n"); return false; } DNTableFileFormat* pItemTable = NULL; if (bReload) pItemTable = CDnTableDB::GetInstance().ReLoadSox(CDnTableDB::TITEM); else pItemTable = GetDNTable(CDnTableDB::TITEM); if (pItemTable == NULL) { g_Log.Log( LogType::_FILELOG, L"itemtable.ext failed\r\n"); return false; } DNTableFileFormat* pPartsTable = NULL; if (bReload) pPartsTable = CDnTableDB::GetInstance().ReLoadSox(CDnTableDB::TPARTS); else pPartsTable = GetDNTable(CDnTableDB::TPARTS); if (pPartsTable == NULL) { g_Log.Log( LogType::_FILELOG, L"partstable.ext failed\r\n"); return false; } DNTableFileFormat* pCosRandMixProbabilityTable = GetDNTable(CDnTableDB::TCOSRANDOMMIXINFO); if (bReload) pCosRandMixProbabilityTable = CDnTableDB::GetInstance().ReLoadSox(CDnTableDB::TCOSRANDOMMIXINFO); else pCosRandMixProbabilityTable = GetDNTable(CDnTableDB::TCOSRANDOMMIXINFO); if (pCosRandMixProbabilityTable == NULL) { g_Log.Log( LogType::_FILELOG, L"costumemixtable.ext failed\r\n"); return false; } #elif defined (_SERVER) || defined (_CLIENT) DNTableFileFormat* pCosRandMixTable = GetDNTable(CDnTableDB::TCOSMIXINFO); if (pCosRandMixTable == NULL) { g_Log.Log( LogType::_FILELOG, L"costumemixinfo.ext failed\r\n"); return false; } DNTableFileFormat* pItemTable = GetDNTable(CDnTableDB::TITEM); if (pItemTable == NULL) { g_Log.Log( LogType::_FILELOG, L"itemtable.ext failed\r\n"); return false; } DNTableFileFormat* pPartsTable = GetDNTable(CDnTableDB::TPARTS); if (pPartsTable == NULL) { g_Log.Log( LogType::_FILELOG, L"partstable.ext failed\r\n"); return false; } DNTableFileFormat* pCosRandMixProbabilityTable = GetDNTable(CDnTableDB::TCOSRANDOMMIXINFO); if (pCosRandMixProbabilityTable == NULL) { g_Log.Log( LogType::_FILELOG, L"costumemixtable.ext failed\r\n"); return false; } #else DNTableFileFormat* pCosRandMixTable = LoadExtFile("costumemixinfo.ext"); if (pCosRandMixTable == NULL) { #ifdef _TABLEVERIFIER EXPECT_FALSE(true) << "CANNOT load costumemixinfo.ext"; #endif return false; } DNTableFileFormat* pItemTable = LoadExtFile("itemtable.ext"); if (pItemTable == NULL) { #ifdef _TABLEVERIFIER EXPECT_FALSE(true) << "CANNOT load itemtable.ext"; #endif return false; } DNTableFileFormat* pPartsTable = LoadExtFile("partstable.ext"); if (pPartsTable == NULL) { #ifdef _TABLEVERIFIER EXPECT_FALSE(true) << "CANNOT load partstable.ext"; #endif return false; } DNTableFileFormat* pCosRandMixProbabilityTable = LoadExtFile("costumemixtable.ext"); if (pCosRandMixProbabilityTable == NULL) { #ifdef _TABLEVERIFIER EXPECT_FALSE(true) << "CANNOT load costumemixtable.ext"; #endif return false; } #endif m_CosRandomMixResultList.clear(); #ifdef PRE_FIX_68828 m_CosRandomMixResultListForRef.clear(); #endif int i = 0; for (; i < pCosRandMixTable->GetItemCount(); ++i) { int nItemID = pCosRandMixTable->GetItemID(i); std::vector enableJobList; CommonUtil::GetItemJobUsable(enableJobList, nItemID, pItemTable); DNTableCell* pPartsCell = pPartsTable->GetFieldFromLablePtr(nItemID, "_Parts"); if (pPartsCell == NULL) { OutputDebug("[RANDMIX] There is NO %d item in parts table\n", nItemID); continue; } int nPartsId = pPartsCell->GetInteger(); DNTableCell* pRankCell = pCosRandMixTable->GetFieldFromLablePtr(nItemID, "_MixRank"); if (pRankCell == NULL) { OutputDebug("[RANDMIX] There is NO _MixRank : %d item\n", nItemID); continue; } int nRankId = pRankCell->GetInteger(); DNTableCell* pWorldMsgCell = pCosRandMixTable->GetFieldFromLablePtr(nItemID, "_MixMsg"); if (pWorldMsgCell == NULL) { OutputDebug("[RANDMIX] There is NO _MixMsg : %d item\n", nItemID); continue; } bool bShowWorldMsg = (pWorldMsgCell->GetInteger() > 0) ? true : false; DNTableCell* pEnableCell = pCosRandMixTable->GetFieldFromLablePtr(nItemID, "_MixUseCompound"); if (pEnableCell == NULL) { OutputDebug("[RANDMIX] There is NO _MixUseCompound : %d item\n", nItemID); continue; } bool bEnableMix = (pEnableCell->GetInteger() == TRUE) ? true : false; if (bEnableMix) { SRandomMixEnableData data; data.nRank = nRankId; data.bShowWorldMsg = bShowWorldMsg; m_CosRandomMixEnableList.insert(std::make_pair(nItemID, data)); } DNTableCell* pResultCell = pCosRandMixTable->GetFieldFromLablePtr(nItemID, "_MixResultAble"); if (pResultCell == NULL) { OutputDebug("[RANDMIX] There is NO _MixResultAble : %d item\n", nItemID); continue; } bool bResultEnable = (pResultCell->GetInteger() == TRUE) ? true : false; if (bResultEnable == false) continue; #if defined (PRE_FIX_68828) && defined (_SERVER) SRandomMixEnableData resultData; resultData.nRank = nRankId; resultData.bShowWorldMsg = bShowWorldMsg; m_CosRandomMixResultListForRef.insert(std::make_pair(nItemID, resultData)); #endif std::vector::const_iterator jobIter = enableJobList.begin(); for (; jobIter != enableJobList.end(); ++jobIter) { const int& nJobId = (*jobIter); COSTUME_RANDOM_MIX_LIST::iterator iter = m_CosRandomMixResultList.find(std::make_pair(nJobId, nPartsId)); if (iter != m_CosRandomMixResultList.end()) { COSTUME_RANDOM_MIX_RANKLIST& rankList = (*iter).second; COSTUME_RANDOM_MIX_RANKLIST::iterator rankListIter = rankList.find(nRankId); if (rankListIter != rankList.end()) { std::vector& rankItemList = (*rankListIter).second; rankItemList.push_back(nItemID); } else { std::vector rankItemList; MakeRankList(rankList, rankItemList, nRankId, nItemID); } } else { std::vector rankItemList; COSTUME_RANDOM_MIX_RANKLIST rankList; MakeRankList(rankList, rankItemList, nRankId, nItemID); m_CosRandomMixResultList.insert(std::make_pair(std::make_pair(nJobId, nPartsId), rankList)); } } } m_CosRandomMixProbabilityList.clear(); for (i = 0; i < pCosRandMixProbabilityTable->GetItemCount(); ++i) { int nItemID = pCosRandMixProbabilityTable->GetItemID(i); DNTableCell* pRank1Cell = pCosRandMixProbabilityTable->GetFieldFromLablePtr(nItemID, "_MixRank1"); if (pRank1Cell == NULL) { OutputDebug("[RANDMIX] There is NO _MixRank1 field\n"); continue; } int nMixRank1 = pRank1Cell->GetInteger(); DNTableCell* pRank2Cell = pCosRandMixProbabilityTable->GetFieldFromLablePtr(nItemID, "_MixRank2"); if (pRank2Cell == NULL) { OutputDebug("[RANDMIX] There is NO _MixRank2 field\n"); continue; } int nMixRank2 = pRank2Cell->GetInteger(); #ifdef PRE_ADD_COSRANDMIX_MIXERTYPE DNTableCell* pMixTypeCell = pCosRandMixProbabilityTable->GetFieldFromLablePtr(nItemID, "_MixType"); if (pMixTypeCell == NULL) { OutputDebug("[RANDMIX] There is NO _MixType field\n"); continue; } int nMixType = pMixTypeCell->GetInteger(); COSRANDMIX_PROBABLE_LIST::const_iterator iter = m_CosRandomMixProbabilityList.find(boost::make_tuple(nMixType, nMixRank1, nMixRank2)); #else COSRANDMIX_PROBABLE_LIST::const_iterator iter = m_CosRandomMixProbabilityList.find(std::make_pair(nMixRank1, nMixRank2)); #endif if (iter != m_CosRandomMixProbabilityList.end()) { OutputDebug("[RANDMIX] Duplicate Costume Random Mix Probability List KEY (_MixRank1:%d, _MixRank2:%d)\n", nMixRank1, nMixRank2); continue; } std::vector probList; int j = 0; std::string fieldName; float fRateSum = 0.f; for (; j < m_nCosMixProbabilityResultCount; ++j) { fieldName = FormatA("_ResultRate%d", j); DNTableCell* pCell = pCosRandMixProbabilityTable->GetFieldFromLablePtr(nItemID, fieldName.c_str()); if (pCell == NULL) { if (fRateSum >= 100.1f || fRateSum < 99.9f) { OutputDebug("[RANDMIX] Costume Random Mix Probability SUM Error: rowId:%d value:%f\n", nItemID, fRateSum); #if defined (_SERVER) || defined (_CLIENT) g_Log.Log(LogType::_ERROR, L"[RANDMIX] Costume Random Mix Probability SUM Error: rowId:%d value:%f\n", nItemID, fRateSum); #endif } return false; } float fCurProb = pCell->GetFloat(); probList.push_back(fCurProb); fRateSum += fCurProb; } if (fRateSum >= 100.1f || fRateSum < 99.9f) { OutputDebug("[RANDMIX] Costume Random Mix Probability SUM Error: rowId:%d value:%f\n", nItemID, fRateSum); #if defined (_SERVER) || defined (_CLIENT) g_Log.Log(LogType::_ERROR, L"[RANDMIX] Costume Random Mix Probability SUM Error: rowId:%d value:%f\n", nItemID, fRateSum); #endif return false; } #ifdef PRE_ADD_COSRANDMIX_MIXERTYPE boost::tuple keyTuple = boost::make_tuple(nMixType, nMixRank1, nMixRank2); m_CosRandomMixProbabilityList.insert(std::make_pair(keyTuple, probList)); #else std::pair keyPair = std::make_pair(nMixRank1, nMixRank2); m_CosRandomMixProbabilityList.insert(std::make_pair(keyPair, probList)); #endif #ifdef PRE_ADD_COSRANDMIX_ACCESSORY DNTableCell* pFeeCell = pCosRandMixProbabilityTable->GetFieldFromLablePtr(nItemID, "_CompoundFee"); if (pFeeCell == NULL) { OutputDebug("[RANDMIX] Costume Random Mix NO Fee Error: rowId:%d\n", nItemID); #if defined (_SERVER) || defined (_CLIENT) g_Log.Log(LogType::_ERROR, L"[RANDMIX] Costume Random Mix NO Fee Error: rowId:%d\n", nItemID); #endif continue; } INT64 compoundFee = pFeeCell->GetInteger(); #ifdef PRE_ADD_COSRANDMIX_MIXERTYPE m_CosRandomMixFeeList.insert(std::make_pair(keyTuple, compoundFee)); #else m_CosRandomMixFeeList.insert(std::make_pair(keyPair, compoundFee)); #endif // PRE_ADD_COSRANDMIX_MIXERTYPE #endif } #ifdef _SERVER m_Random.srand(timeGetTime()); #endif return true; } void CDnCostumeRandomMixDataMgr::MakeRankList(COSTUME_RANDOM_MIX_RANKLIST& rankResultList, std::vector& itemResultList, const int& rank, const ITEMCLSID& itemId) { itemResultList.push_back(itemId); rankResultList.insert(std::make_pair(rank, itemResultList)); } #ifdef _CLIENT bool CDnCostumeRandomMixDataMgr::IsEnableCostumeRandomMixStuff(const CDnItem* pStuff) const { if (pStuff == NULL || pStuff->IsEternityItem() == false) return false; std::map::const_iterator iter = m_CosRandomMixEnableList.find(pStuff->GetClassID()); #ifdef PRE_ADD_COSRANDMIX_MIXERTYPE if (iter == m_CosRandomMixEnableList.end()) return false; int nMixerEnableParts = GetMixerEnablePartsType(); if (nMixerEnableParts == CostumeMix::RandomMix::MixerCanMixPartsAll) return true; int nCurPartsType = (int)CDnParts::GetPartsType(pStuff->GetClassID()); if (nMixerEnableParts == CostumeMix::RandomMix::MixerCanMixBasicParts) { return (nCurPartsType >= 0 && nCurPartsType < CDnParts::OverlapPartsTypeEnum_Amount); } else { return (nMixerEnableParts == nCurPartsType); } #else return (iter != m_CosRandomMixEnableList.end()); #endif } #ifdef PRE_ADD_COSRANDMIX_MIXERTYPE void CDnCostumeRandomMixDataMgr::SetMixerEnablePartsType(int nPartsType) { m_nMixerEnablePartsType = nPartsType; } #endif #ifdef PRE_ADD_COSRANDMIX_ACCESSORY bool CDnCostumeRandomMixDataMgr::MakePreviewItemList(std::vector& itemList, const CDnParts::PartsTypeEnum& partsType) const { itemList.clear(); if (CDnItemTask::IsActive() && CDnActor::s_hLocalActor) { typedef SRandomProgressData SRPData; int classId = ((CDnPlayerActor*)CDnActor::s_hLocalActor.GetPointer())->GetClassID(); const COSTUME_RANDOM_MIX_RANKLIST* pCommonItemRankList = GetRandomMixRankList(0, (int)partsType); const COSTUME_RANDOM_MIX_RANKLIST* pRankList = GetRandomMixRankList(classId, (int)partsType); if (pRankList == NULL && pCommonItemRankList == NULL) return false; if (pRankList) DoMakePreviewItemList(itemList, *pRankList); if (pCommonItemRankList) DoMakePreviewItemList(itemList, *pCommonItemRankList); } return true; } void CDnCostumeRandomMixDataMgr::DoMakePreviewItemList(std::vector& itemList, const COSTUME_RANDOM_MIX_RANKLIST& srcList) const { COSTUME_RANDOM_MIX_RANKLIST::const_iterator iter = srcList.begin(); for (; iter != srcList.end(); ++iter) { const std::vector& subList = (*iter).second; std::vector::const_iterator subIter = subList.begin(); for (; subIter != subList.end(); ++subIter) { SRandomProgressData data; data.progressItem = (*subIter); itemList.push_back(data); } } } #ifdef _CLIENT void CDnCostumeRandomMixDataMgr::OnStartMixDlg(CostumeMix::RandomMix::eOpenType type) { m_OpenType = type; } #endif #else // PRE_ADD_COSRANDMIX_ACCESSORY bool CDnCostumeRandomMixDataMgr::MakePreviewItemList(std::vector& itemList, const CDnParts::PartsTypeEnum& partsType, const std::vector& stuffItemIDs) const { itemList.clear(); if (CDnItemTask::IsActive()) { typedef SRandomProgressData SRPData; int classId = ((CDnPlayerActor*)CDnActor::s_hLocalActor.GetPointer())->GetClassID(); const CDnCostumeRandomMixDataMgr::COSTUME_RANDOM_MIX_RANKLIST* pRankList = GetRandomMixRankList(classId, (int)partsType); if (pRankList == NULL) return false; if (stuffItemIDs.size() != MAX_COSTUME_RANDOMMIX_STUFF) { return false; } int i = 0; int nStuffRank[MAX_COSTUME_RANDOMMIX_STUFF] = {-1, }; for (; i < MAX_COSTUME_RANDOMMIX_STUFF; ++i) nStuffRank[i] = GetRandomMixStuffItemRank(stuffItemIDs[i]); #ifdef PRE_ADD_COSRANDMIX_MIXERTYPE const std::vector* pProbList = GetRandomMixProbableList(partsType, nStuffRank[0], nStuffRank[1]); #else const std::vector* pProbList = GetRandomMixProbableList(nStuffRank[0], nStuffRank[1]); #endif if (pProbList == NULL) return false; float fSum = 0.f; CDnCostumeRandomMixDataMgr::COSTUME_RANDOM_MIX_RANKLIST::const_iterator iter = pRankList->begin(); for (; iter != pRankList->end(); ++iter) { int nRank = (*iter).first; if (nRank < 0 || nRank > (int)pProbList->size()) continue; SRPData data; data.fShowRatio = (*pProbList)[nRank]; data.progressItemList = (*iter).second; fSum += data.fShowRatio; itemList.push_back(data); } if (fSum < 99.9f || fSum > 100.1f) { int nLargestIndex = 0; float fLargest = 0.f, fOtherSum = 0.f; int i = 0; for (; i < (int)itemList.size(); ++i) { SRPData& cur = itemList[i]; if (cur.fShowRatio > fLargest) { fLargest = cur.fShowRatio; nLargestIndex = i; } else { fOtherSum += cur.fShowRatio; } } if (nLargestIndex >= 0) itemList[nLargestIndex].fShowRatio = (100.f - fOtherSum); } } return true; } #endif // PRE_ADD_COSRANDMIX_ACCESSORY #endif // _CLIENT #ifdef _SERVER bool CDnCostumeRandomMixDataMgr::IsEnableCostumeRandomMixStuff(const std::vector& stuffs, int userClassId) const { if (stuffs.empty() || (int)stuffs.size() != MAX_COSTUME_RANDOMMIX_STUFF) return false; int nPartsType = 0; int i = 0; for (; i < MAX_COSTUME_RANDOMMIX_STUFF; ++i) { const TItem& stuff = stuffs[i]; if (stuff.bEternity == false) return false; std::map::const_iterator iter = m_CosRandomMixEnableList.find(stuff.nItemID); if (iter == m_CosRandomMixEnableList.end()) return false; if (stuff.wCount != 1) return false; // ´Üǰ¸¸ °¡´É TItemData *pItemData = g_pDataManager->GetItemData(stuff.nItemID); if (pItemData == NULL) return false; if (g_pDataManager->IsItemNeedJob(stuff.nItemID, userClassId) == false) return false; TPartData *pPartData = g_pDataManager->GetPartData(pItemData->nItemID); if (!pPartData) return false; if (i != 0 && nPartsType != pPartData->nParts) return false; nPartsType = pPartData->nParts; } int stuffRank0 = GetRandomMixStuffItemRank(stuffs[0].nItemID); int stuffRank1 = GetRandomMixStuffItemRank(stuffs[1].nItemID); #ifdef PRE_ADD_COSRANDMIX_MIXERTYPE const std::vector* pCurRankProbList = GetRandomMixProbableList(nPartsType, stuffRank0, stuffRank1); #else const std::vector* pCurRankProbList = GetRandomMixProbableList(stuffRank0, stuffRank1); #endif if (pCurRankProbList == NULL) return false; return true; } int CDnCostumeRandomMixDataMgr::DoRandomMix(const INT64* pStuffSerials, int stuffCount, int userClassId, const CDNUserItem& userItem, const INT64& mixerCharacterDBID, eError& lastError) { if (pStuffSerials == NULL || stuffCount != MAX_COSTUME_RANDOMMIX_STUFF) { g_Log.Log(LogType::_FILELOG, L"[CDBID:%I64d] COSRANDOMMIX : ILLEGAL STUFF_ITEM - NULL or NOT_ENOUGH_STUFFCOUNT(%d)\r\n", mixerCharacterDBID, stuffCount); return 0; } std::vector stuffIDs; int i = 0; for (; i < stuffCount; ++i) { const TItem* pItem = userItem.GetCashInventory(pStuffSerials[i]); if (pItem == NULL) { g_Log.Log(LogType::_FILELOG, L"[CDBID:%I64d] COSRANDOMMIX : ILLEGAL STUFF_ITEM - THERE IS NO STUFF ITEM IN CASH INVENTORY! SERIAL:(%I64d)\r\n", mixerCharacterDBID, pStuffSerials[i]); return 0; } stuffIDs.push_back(*pItem); } return DoRandomMix(stuffIDs, userClassId, userItem, mixerCharacterDBID, lastError); } int CDnCostumeRandomMixDataMgr::DoRandomMix(const std::vector& stuffItemIDs, int userClassId, const CDNUserItem& userItem, const INT64& mixerCharacterDBID, eError& lastError) { std::vector nStuffsRankList; int nPartsType = -1; GetStuffsRankAndPartsType(nStuffsRankList, nPartsType, stuffItemIDs, userItem, mixerCharacterDBID); int stuffRankListSize = (int)nStuffsRankList.size(); if (stuffRankListSize <= 0 || stuffRankListSize > MAX_COSTUME_RANDOMMIX_STUFF) return 0; #ifdef PRE_ADD_COSRANDMIX_MIXERTYPE const std::vector* pCurRankProbList = GetRandomMixProbableList(nPartsType, nStuffsRankList[0], nStuffsRankList[1]); #else const std::vector* pCurRankProbList = GetRandomMixProbableList(nStuffsRankList[0], nStuffsRankList[1]); #endif if (pCurRankProbList == NULL) { g_Log.Log(LogType::_FILELOG, L"[CDBID:%I64d] COSRANDOMMIX : NO PROBABILITY(%d, %d)\r\n", mixerCharacterDBID, nStuffsRankList[0], nStuffsRankList[1]); return 0; } const std::vector& curRankProbList = *pCurRankProbList; float rankValue = m_Random.rand_float(0.f, 100.f); int resultRank = -1; float fRangeAccumulator = 0.f; int i = 0; for (i = 0; i < (int)curRankProbList.size(); ++i) { fRangeAccumulator += curRankProbList[i]; if (rankValue <= fRangeAccumulator) { resultRank = i; break; } } bool bExistClassRank = false; COSTUME_RANDOM_MIX_RANKLIST::const_iterator rankIter; COSTUME_RANDOM_MIX_LIST::const_iterator resultIter = m_CosRandomMixResultList.find(std::make_pair(userClassId, nPartsType)); if (resultIter != m_CosRandomMixResultList.end()) { const COSTUME_RANDOM_MIX_RANKLIST& curRankList = (*resultIter).second; rankIter = curRankList.find(resultRank); if (rankIter != curRankList.end()) bExistClassRank = true; } bool bExistCommonRank = false; COSTUME_RANDOM_MIX_RANKLIST::const_iterator commonRankIter; COSTUME_RANDOM_MIX_LIST::const_iterator commonResultIter = m_CosRandomMixResultList.find(std::make_pair(0, nPartsType)); if (commonResultIter != m_CosRandomMixResultList.end()) { const COSTUME_RANDOM_MIX_RANKLIST& curCommonRankList = (*commonResultIter).second; commonRankIter = curCommonRankList.find(resultRank); if (commonRankIter != curCommonRankList.end()) bExistCommonRank = true; } if (bExistClassRank == false && bExistCommonRank == false) { g_Log.Log(LogType::_FILELOG, L"[CDBID:%I64d] COSRANDOMMIX : NO RESULT LIST(userClassId(%d), partsType(%d))\r\n", mixerCharacterDBID, userClassId, nPartsType); return 0; } int resultItemId = 0; if (bExistCommonRank && bExistClassRank == false) { const std::vector& commonRankList = (*commonRankIter).second; int wholeSize = (int)commonRankList.size(); if (wholeSize < 1) { g_Log.Log(LogType::_FILELOG, L"[CDBID:%I64d] COSRANDOMMIX : RESULT CALCULATION ERROR\r\n", mixerCharacterDBID); return 0; } int nNumberDrew = m_Random.rand(1, wholeSize); nNumberDrew--; resultItemId = commonRankList[nNumberDrew]; } else if (bExistClassRank && bExistCommonRank == false) { const std::vector& rankList = (*rankIter).second; int wholeSize = (int)rankList.size(); if (wholeSize < 1) { g_Log.Log(LogType::_FILELOG, L"[CDBID:%I64d] COSRANDOMMIX : RESULT CALCULATION ERROR\r\n", mixerCharacterDBID); return 0; } int nNumberDrew = m_Random.rand(1, wholeSize); nNumberDrew--; resultItemId = rankList[nNumberDrew]; } else if (bExistCommonRank && bExistClassRank) { const std::vector& rankList = (*rankIter).second; const std::vector& commonRankList = (*commonRankIter).second; int wholeSize = (int)rankList.size() + (int)commonRankList.size(); if (wholeSize < 1) { g_Log.Log(LogType::_FILELOG, L"[CDBID:%I64d] COSRANDOMMIX : RESULT CALCULATION ERROR\r\n", mixerCharacterDBID); return 0; } int nNumberDrew = m_Random.rand(1, wholeSize); if (nNumberDrew > (int)rankList.size()) { int nCommonItemIndexDrew = (nNumberDrew - (int)rankList.size()) - 1; if (nCommonItemIndexDrew < 0 || nCommonItemIndexDrew >= (int)commonRankList.size()) { g_Log.Log(LogType::_FILELOG, L"[CDBID:%I64d] COSRANDOMMIX : RESULT CALCULATION ERROR\r\n", mixerCharacterDBID); return 0; } resultItemId = commonRankList[nCommonItemIndexDrew]; } else { int nItemIndexDrew = nNumberDrew - 1; if (nItemIndexDrew < 0 || nItemIndexDrew >= (int)rankList.size()) { g_Log.Log(LogType::_FILELOG, L"[CDBID:%I64d] COSRANDOMMIX : RESULT CALCULATION ERROR\r\n", mixerCharacterDBID); return 0; } resultItemId = rankList[nItemIndexDrew]; } } return resultItemId; } void CDnCostumeRandomMixDataMgr::GetStuffsRankAndPartsType(std::vector& nStuffsRankList, int& nPartsType, const std::vector& stuffItemIDs, const CDNUserItem& userItem, const INT64& mixerCharacterDBID) const { #ifdef _WORK if (MAX_COSTUME_RANDOMMIX_STUFF < 2) { g_Log.Log(LogType::_ERROR, L"[CDBID:%I64d] COSRANDOMMIX : MAX_COSTUME_RANDOMMIX_STUFF < 2\r\n", mixerCharacterDBID); return; } #endif if (MAX_COSTUME_RANDOMMIX_STUFF != (int)stuffItemIDs.size()) { g_Log.Log(LogType::_ERROR, L"[CDBID:%I64d] COSRANDOMMIX : GetStuffsRankAndPartsType() MAX_COSTUME_RANDOMMIX_STUFF != (int)nStuffItemIDs.size()\r\n", mixerCharacterDBID); return; } int i = 0; nPartsType = -1; for (; i < (int)stuffItemIDs.size(); ++i) { int nStuffItemId = stuffItemIDs[i].nItemID; std::map::const_iterator enableListIter = m_CosRandomMixEnableList.find(nStuffItemId); if (enableListIter == m_CosRandomMixEnableList.end()) { g_Log.Log(LogType::_FILELOG, L"[CDBID:%I64d] COSRANDOMMIX : ILLEGAL STUFF_ITEM_ID(%d)\r\n", mixerCharacterDBID, nStuffItemId); return; } if (nPartsType == -1) { const TPartData *pPartData = g_pDataManager->GetPartData(nStuffItemId); if (!pPartData) { g_Log.Log(LogType::_FILELOG, L"[CDBID:%I64d] COSRANDOMMIX : STUFF ITEM IS NOT PARTSITEM(%d)\r\n", mixerCharacterDBID, nStuffItemId); return; } nPartsType = pPartData->nParts; } const SRandomMixEnableData& data = (*enableListIter).second; nStuffsRankList.push_back(data.nRank); } } #ifdef PRE_FIX_68828 bool CDnCostumeRandomMixDataMgr::IsWorldMessagingItem(int nItemId) const { std::map::const_iterator iter = m_CosRandomMixResultListForRef.find(nItemId); if (iter != m_CosRandomMixResultListForRef.end()) { const SRandomMixEnableData& data = (*iter).second; return data.bShowWorldMsg; } return false; } #endif #ifdef PRE_ADD_COSRANDMIX_MIXERTYPE const std::vector* CDnCostumeRandomMixDataMgr::GetRandomMixProbableList(int stuffPartsType, int stuffRank1, int stuffRank2) const { int stuffPartsTypeForProbableList = stuffPartsType; if (stuffPartsTypeForProbableList < 0) return NULL; if (IsBasicCashPartsType(stuffPartsTypeForProbableList)) stuffPartsTypeForProbableList = CASHEQUIPMIN; COSRANDMIX_PROBABLE_LIST::const_iterator iter = m_CosRandomMixProbabilityList.find(boost::make_tuple(stuffPartsTypeForProbableList, stuffRank1, stuffRank2)); if (iter != m_CosRandomMixProbabilityList.end()) return &((*iter).second); iter = m_CosRandomMixProbabilityList.find(boost::make_tuple(stuffPartsTypeForProbableList, stuffRank2, stuffRank1)); if (iter != m_CosRandomMixProbabilityList.end()) return &((*iter).second); return NULL; } #else // PRE_ADD_COSRANDMIX_MIXERTYPE const std::vector* CDnCostumeRandomMixDataMgr::GetRandomMixProbableList(int stuffRank1, int stuffRank2) const { COSRANDMIX_PROBABLE_LIST::const_iterator iter = m_CosRandomMixProbabilityList.find(std::make_pair(stuffRank1, stuffRank2)); if (iter != m_CosRandomMixProbabilityList.end()) return &((*iter).second); iter = m_CosRandomMixProbabilityList.find(std::make_pair(stuffRank2, stuffRank1)); if (iter != m_CosRandomMixProbabilityList.end()) return &((*iter).second); return NULL; } #endif // PRE_ADD_COSRANDMIX_MIXERTYPE #endif // _SERVER const CDnCostumeRandomMixDataMgr::COSTUME_RANDOM_MIX_RANKLIST* CDnCostumeRandomMixDataMgr::GetRandomMixRankList(int userClassId, int partsId) const { const COSTUME_RANDOM_MIX_LIST::const_iterator rankListIter = m_CosRandomMixResultList.find(std::make_pair(userClassId, partsId)); if (rankListIter == m_CosRandomMixResultList.end()) return NULL; return &((*rankListIter).second); } int CDnCostumeRandomMixDataMgr::GetRandomMixStuffItemRank(ITEMCLSID itemId) const { std::map::const_iterator iter = m_CosRandomMixEnableList.find(itemId); if (iter != m_CosRandomMixEnableList.end()) { const SRandomMixEnableData& data = (*iter).second; return data.nRank; } return -1; } #ifdef PRE_FIX_68828 int CDnCostumeRandomMixDataMgr::GetRandomMixResultItemRank(ITEMCLSID itemId) const { std::map::const_iterator iter = m_CosRandomMixResultListForRef.find(itemId); if (iter != m_CosRandomMixResultListForRef.end()) { const SRandomMixEnableData& data = (*iter).second; return data.nRank; } return -1; } #endif #ifdef PRE_ADD_COSRANDMIX_ACCESSORY INT64 CDnCostumeRandomMixDataMgr::GetRandomMixFee(const std::vector& stuffs) const { if (stuffs.size() != MAX_COSTUME_RANDOMMIX_STUFF) return -1; int nRank[MAX_COSTUME_RANDOMMIX_STUFF] = {0,}; int i = 0; #ifdef PRE_ADD_COSRANDMIX_MIXERTYPE int nPartsType = -1, nLastPartsType = -1; #endif for (; i < MAX_COSTUME_RANDOMMIX_STUFF; ++i) { int nStuffItemId = stuffs[i]; std::map::const_iterator iter = m_CosRandomMixEnableList.find(nStuffItemId); if (iter == m_CosRandomMixEnableList.end()) return -1; #if defined (PRE_ADD_COSRANDMIX_MIXERTYPE) && !defined (_TABLEVERIFIER) nPartsType = GetPartsType(nStuffItemId); if (i != 0 && nPartsType != nLastPartsType) return -1; nLastPartsType = nPartsType; #endif const SRandomMixEnableData& data = (*iter).second; nRank[i] = data.nRank; } #ifdef PRE_ADD_COSRANDMIX_MIXERTYPE if (nPartsType < 0) return -1; #pragma message("RLKT DISABLED >> line 919") // if (IsBasicCashPartsType(nPartsType)) // nPartsType = CASHEQUIPMIN; COSRANDMIX_FEE_LIST::const_iterator feeIter = m_CosRandomMixFeeList.find(boost::make_tuple(nPartsType, nRank[0], nRank[1])); #else COSRANDMIX_FEE_LIST::const_iterator feeIter = m_CosRandomMixFeeList.find(std::make_pair(nRank[0], nRank[1])); #endif if (feeIter != m_CosRandomMixFeeList.end()) { return (*feeIter).second; } else { #ifdef PRE_ADD_COSRANDMIX_MIXERTYPE COSRANDMIX_FEE_LIST::const_iterator convertFeeIter = m_CosRandomMixFeeList.find(boost::make_tuple(nPartsType, nRank[1], nRank[0])); #else COSRANDMIX_FEE_LIST::const_iterator convertFeeIter = m_CosRandomMixFeeList.find(std::make_pair(nRank[1], nRank[0])); #endif if (convertFeeIter != m_CosRandomMixFeeList.end()) return (*convertFeeIter).second; } return -1; } #else // PRE_ADD_COSRANDMIX_ACCESSORY #ifdef PRE_ADD_COSRANDMIX_MIXERTYPE #ifndef _SERVER const std::vector* CDnCostumeRandomMixDataMgr::GetRandomMixProbableList(int mixType, int stuffRank1, int stuffRank2) const { if (mixType < 0) return NULL; COSRANDMIX_PROBABLE_LIST::const_iterator iter = m_CosRandomMixProbabilityList.find(boost::make_tuple(mixType, stuffRank1, stuffRank2)); if (iter != m_CosRandomMixProbabilityList.end()) return &((*iter).second); iter = m_CosRandomMixProbabilityList.find(boost::make_tuple(mixType, stuffRank2, stuffRank1)); if (iter != m_CosRandomMixProbabilityList.end()) return &((*iter).second); return NULL; } #endif // _SERVER #else const std::vector* CDnCostumeRandomMixDataMgr::GetRandomMixProbableList(int stuffRank1, int stuffRank2) const { COSRANDMIX_PROBABLE_LIST::const_iterator iter = m_CosRandomMixProbabilityList.find(std::make_pair(stuffRank1, stuffRank2)); if (iter != m_CosRandomMixProbabilityList.end()) return &((*iter).second); iter = m_CosRandomMixProbabilityList.find(std::make_pair(stuffRank2, stuffRank1)); if (iter != m_CosRandomMixProbabilityList.end()) return &((*iter).second); return NULL; } #endif // PRE_ADD_COSRANDMIX_MIXERTYPE #endif // PRE_ADD_COSRANDMIX_ACCESSORY #if defined (PRE_ADD_COSRANDMIX_MIXERTYPE) && !defined (_TABLEVERIFIER) int CDnCostumeRandomMixDataMgr::GetPartsType(int nItemId) const { #ifdef _SERVER const TPartData *pPartData = g_pDataManager->GetPartData(nItemId); if (!pPartData) return -1; return pPartData->nParts; #else return (int)CDnParts::GetPartsType(nItemId); #endif } bool CDnCostumeRandomMixDataMgr::IsBasicCashPartsType(int nPartsType) const { #ifdef _SERVER return (nPartsType >= CASHEQUIPMIN && nPartsType <= CASHEQUIP_FOOT); #else return (nPartsType >= CDnParts::CashHelmet && nPartsType <= CDnParts::CashFoot); #endif } #endif // PRE_ADD_COSRANDMIX_MIXERTYPE #ifdef PRE_FIX_68828 #else #if defined(_SERVER) bool CDnCostumeRandomMixDataMgr::IsWorldMessagingItem(int nItemId) const { std::map::const_iterator iter = m_CosRandomMixEnableList.find(nItemId); if (iter != m_CosRandomMixEnableList.end()) { const SRandomMixEnableData& data = (*iter).second; return data.bShowWorldMsg; } return false; } #endif // #if defined(_SERVER) #endif #endif // PRE_ADD_COSRANDMIX