DragonNest/GameCommon/DnCostumeRandomMixDataMgr.cpp

1023 lines
32 KiB
C++
Raw Permalink Normal View History

#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<int> 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<int>::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<ITEMCLSID>& rankItemList = (*rankListIter).second;
rankItemList.push_back(nItemID);
}
else
{
std::vector<ITEMCLSID> rankItemList;
MakeRankList(rankList, rankItemList, nRankId, nItemID);
}
}
else
{
std::vector<ITEMCLSID> 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<float> 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<int, int, int> keyTuple = boost::make_tuple(nMixType, nMixRank1, nMixRank2);
m_CosRandomMixProbabilityList.insert(std::make_pair(keyTuple, probList));
#else
std::pair<int, int> 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<ITEMCLSID>& 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<int, SRandomMixEnableData>::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<SRandomProgressData>& 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<SRandomProgressData>& 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<ITEMCLSID>& subList = (*iter).second;
std::vector<ITEMCLSID>::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<SRandomProgressData>& itemList, const CDnParts::PartsTypeEnum& partsType, const std::vector<ITEMCLSID>& 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<float>* pProbList = GetRandomMixProbableList(partsType, nStuffRank[0], nStuffRank[1]);
#else
const std::vector<float>* 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<TItem>& 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<int, SRandomMixEnableData>::const_iterator iter = m_CosRandomMixEnableList.find(stuff.nItemID);
if (iter == m_CosRandomMixEnableList.end())
return false;
if (stuff.wCount != 1)
return false; // <20><>ǰ<EFBFBD><C7B0> <20><><EFBFBD><EFBFBD>
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<float>* pCurRankProbList = GetRandomMixProbableList(nPartsType, stuffRank0, stuffRank1);
#else
const std::vector<float>* 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<TItem> 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<TItem>& stuffItemIDs, int userClassId, const CDNUserItem& userItem, const INT64& mixerCharacterDBID, eError& lastError)
{
std::vector<int> 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<float>* pCurRankProbList = GetRandomMixProbableList(nPartsType, nStuffsRankList[0], nStuffsRankList[1]);
#else
const std::vector<float>* 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<float>& 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<int>& 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<int>& 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<int>& rankList = (*rankIter).second;
const std::vector<int>& 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<int>& nStuffsRankList, int& nPartsType, const std::vector<TItem>& 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<int, SRandomMixEnableData>::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<int, SRandomMixEnableData>::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<float>* 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<float>* 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<int, SRandomMixEnableData>::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<int, SRandomMixEnableData>::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<int>& 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<int, SRandomMixEnableData>::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<float>* 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<float>* 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<int, SRandomMixEnableData>::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