500 lines
12 KiB
C++
500 lines
12 KiB
C++
|
|
|
|||
|
|
#include "StdAfx.h"
|
|||
|
|
DropGroupCfg::DropGroupCfg()
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
DropGroupCfg::~DropGroupCfg()
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
bool DropGroupCfg::LoadDropGroupsConfig( LPCTSTR sFilePath )
|
|||
|
|
{
|
|||
|
|
bool boResult = false;
|
|||
|
|
CMemoryStream ms;
|
|||
|
|
CCustomLuaPreProcessor pp;
|
|||
|
|
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
//从文件加载配置脚本
|
|||
|
|
if ( ms.loadFromFile(sFilePath) <= 0 )
|
|||
|
|
showErrorFormat(_T("%s unable to load from %s"), __FUNCTION__, sFilePath);
|
|||
|
|
//对配置脚本进行预处理
|
|||
|
|
GetLogicServer()->GetVSPDefine().RegisteToPreprocessor(pp);
|
|||
|
|
LPCTSTR sText = pp.parse((LPCTSTR)ms.getMemory(), sFilePath);
|
|||
|
|
//设置脚本内容
|
|||
|
|
if ( !setScript(sText) )
|
|||
|
|
showErrorFormat(_T("%s syntax error on Load config:%s"), __FUNCTION__, sFilePath);
|
|||
|
|
//读取标准物品配置数据
|
|||
|
|
boResult = ReadDropGroupsConfig();
|
|||
|
|
ReadDropInfosConfig();
|
|||
|
|
ReadDropAttributeConfig();
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
catch (RefString &s)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("load %s config error: %s"),sFilePath, s.rawStr());
|
|||
|
|
}
|
|||
|
|
catch (...)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("unexpected error on load %s config"), sFilePath);
|
|||
|
|
}
|
|||
|
|
//销毁脚本虚拟机
|
|||
|
|
setScript(NULL);
|
|||
|
|
|
|||
|
|
return boResult;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool DropGroupCfg::ReadDropGroupsConfig()
|
|||
|
|
{
|
|||
|
|
if (!openGlobalTable("DropGroupConfig"))
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
// size_t nCount = lua_objlen(m_pLua, -1);
|
|||
|
|
int nDefValue = 0;
|
|||
|
|
m_GiftDropGroupMaps.clear();
|
|||
|
|
if (enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
int nId = getFieldInt("id");
|
|||
|
|
GIFTDROPGROUP group;
|
|||
|
|
group.nType = (WORD)getFieldInt("type");
|
|||
|
|
group.vGiftDropGroups.clear();
|
|||
|
|
group.maxRate = ReadTableConfigByTable(nId,"group", group.vGiftDropGroups);
|
|||
|
|
m_GiftDropGroupMaps.insert(std::make_pair(nId, group));
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int DropGroupCfg::ReadTableConfigByTable(int nDropid, LPCSTR sTableName, std::vector<DROPINFO>& vInfos)
|
|||
|
|
{
|
|||
|
|
int nDefValue = 0;
|
|||
|
|
int maxRate = 0;
|
|||
|
|
if(feildTableExists(sTableName) && openFieldTable(sTableName))
|
|||
|
|
{
|
|||
|
|
size_t nCount = lua_objlen(m_pLua, -1);
|
|||
|
|
// if (nCount <= 0)
|
|||
|
|
// {
|
|||
|
|
// closeTable();
|
|||
|
|
// return maxRate;
|
|||
|
|
// }
|
|||
|
|
if(enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
DROPINFO info;
|
|||
|
|
info.nRate = getFieldInt("rate", &nDefValue);
|
|||
|
|
info.nId = getFieldInt("id", &nDefValue);
|
|||
|
|
info.nCount = getFieldInt("count", &nDefValue);
|
|||
|
|
info.nType = getFieldInt("type", &nDefValue);
|
|||
|
|
info.bNoDrop = getFieldInt("nodrop", &nDefValue);
|
|||
|
|
info.nDropId = nDropid;
|
|||
|
|
maxRate += info.nRate;
|
|||
|
|
vInfos.push_back(info);
|
|||
|
|
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
return maxRate;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool DropGroupCfg::ReadDropInfosConfig()
|
|||
|
|
{
|
|||
|
|
if (!openGlobalTable("DropTableConfig"))
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
// size_t nCount = lua_objlen(m_pLua, -1);
|
|||
|
|
int nDefValue = 0;
|
|||
|
|
m_GiftDropTableMaps.clear();
|
|||
|
|
if (enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
int nId = getFieldInt("id");
|
|||
|
|
GIFTDROPTABLE group;
|
|||
|
|
group.nType = (WORD)getFieldInt("type", &nDefValue);
|
|||
|
|
group.isDropbest = getFieldInt("isDropbest",&nDefValue);
|
|||
|
|
group.nLimitServerOpenDay = getFieldInt("limitopenserverDay",&nDefValue);
|
|||
|
|
group.nCloseOpenDay = getFieldInt("closeopenday",&nDefValue);
|
|||
|
|
group.vGiftDropTables.clear();
|
|||
|
|
group.maxRate = ReadTableConfigByTable(nId,"table", group.vGiftDropTables);
|
|||
|
|
m_GiftDropTableMaps[nId] = group;
|
|||
|
|
char time[50];
|
|||
|
|
memset(&time, 0, sizeof(time));
|
|||
|
|
getFieldStringBuffer("timeLimit",time, sizeof(time));
|
|||
|
|
int nDefV = 0;
|
|||
|
|
group.nLootType = (WORD)getFieldInt("loottype", &nDefV);
|
|||
|
|
for(int i = 0; i < sizeof(time); i++)
|
|||
|
|
{
|
|||
|
|
if(time[i] == '*')
|
|||
|
|
time[i] = '0';
|
|||
|
|
}
|
|||
|
|
sscanf(time, "%d-%d-%d %d:%d ^ %d-%d-%d %d:%d", &group.startTime.wYear, &group.startTime.wMonth,&group.startTime.wDay,&group.startTime.wHour,&group.startTime.wMinute,
|
|||
|
|
&group.endTime.wYear, &group.endTime.wMonth, &group.endTime.wDay,&group.endTime.wHour,&group.endTime.wMinute);
|
|||
|
|
//group.timmLimit = time;
|
|||
|
|
if(feildTableExists("weeklimit") && openFieldTable("weeklimit"))
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
// size_t nCount = lua_objlen(m_pLua, -1);
|
|||
|
|
// if (nCount <= 0)
|
|||
|
|
// {
|
|||
|
|
// closeTable();
|
|||
|
|
// break;
|
|||
|
|
// }
|
|||
|
|
if(enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
int week = getFieldInt(NULL);
|
|||
|
|
group.vWeekLimt.push_back(week);
|
|||
|
|
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
m_GiftDropTableMaps[nId] = group;
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
bool DropGroupCfg::ReadDropAttributeConfig()
|
|||
|
|
{
|
|||
|
|
if (!openGlobalTable("dropAttributeConfig"))
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
// size_t nCount = lua_objlen(m_pLua, -1);
|
|||
|
|
// if (nCount <= 0)
|
|||
|
|
// {
|
|||
|
|
// return false;
|
|||
|
|
// }
|
|||
|
|
int nDefValue = 0;
|
|||
|
|
m_DropAttributeMaps.clear();
|
|||
|
|
if (enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
int nId = getFieldInt("type",&nDefValue);
|
|||
|
|
DROPATTRIBUTECFG group;
|
|||
|
|
group.nRate = (WORD)getFieldInt("rate",&nDefValue);
|
|||
|
|
group.m_vAttribute.clear();
|
|||
|
|
if(feildTableExists("drop") && openFieldTable("drop"))
|
|||
|
|
{
|
|||
|
|
if(enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
DROPATTRIBUTE info;
|
|||
|
|
info.nRate = getFieldInt("rate", &nDefValue);
|
|||
|
|
info.nType = getFieldInt("type", &nDefValue);
|
|||
|
|
info.nValue = getFieldInt("value", &nDefValue);
|
|||
|
|
info.nFollowrate = getFieldInt("followrate", &nDefValue);
|
|||
|
|
info.nFollowcount = getFieldInt("followcount", &nDefValue);
|
|||
|
|
group.m_vAttribute.push_back(info);
|
|||
|
|
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
m_DropAttributeMaps[nId] = group;
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void DropGroupCfg::getGiftDropGroup(int dropGroupid, std::vector<int>& result)
|
|||
|
|
{
|
|||
|
|
std::map<int, GIFTDROPGROUP>::iterator it = m_GiftDropGroupMaps.find(dropGroupid);
|
|||
|
|
if(it != m_GiftDropGroupMaps.end())
|
|||
|
|
{
|
|||
|
|
GIFTDROPGROUP& info = it->second;
|
|||
|
|
int maxRand = 100; // nType:1 为随机
|
|||
|
|
if(info.nType == 2) //权重
|
|||
|
|
{
|
|||
|
|
maxRand = info.maxRate;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//std::vector<DROPINFO>::iterator pInfo = info.vGiftDropGroups.begin();
|
|||
|
|
|
|||
|
|
int count = info.vGiftDropGroups.size();
|
|||
|
|
int nRate = 0;
|
|||
|
|
int rand = wrand(maxRand);
|
|||
|
|
for(int i = 0; i < count; i++)
|
|||
|
|
{
|
|||
|
|
if(info.nType == 1)
|
|||
|
|
{
|
|||
|
|
nRate = info.vGiftDropGroups[i].nRate;
|
|||
|
|
rand = wrand(maxRand);
|
|||
|
|
|
|||
|
|
}else
|
|||
|
|
{
|
|||
|
|
nRate += info.vGiftDropGroups[i].nRate;
|
|||
|
|
}
|
|||
|
|
if(nRate >= rand)
|
|||
|
|
{
|
|||
|
|
result.push_back(info.vGiftDropGroups[i].nId);
|
|||
|
|
if (info.nType == 2)
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
void DropGroupCfg::GetGiftDropInfoByDropGroupId(int dropGroupid, std::vector<DROPGOODS>& result)
|
|||
|
|
{
|
|||
|
|
std::vector<int> dropIds;
|
|||
|
|
dropIds.clear();
|
|||
|
|
// void * p = (void *)::malloc(sizeof(int)*100);
|
|||
|
|
// dropIds.reserve(sizeof(int)*100);
|
|||
|
|
getGiftDropGroup(dropGroupid, dropIds);
|
|||
|
|
int count = dropIds.size();
|
|||
|
|
if(count <= 0)
|
|||
|
|
{
|
|||
|
|
//OutputMsg(rmError, _T("GetGiftDropInfoByDropGroupId size is zero dropGroupid:%d"),dropGroupid);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
for(int i= 0; i < count; i++)
|
|||
|
|
{
|
|||
|
|
GetGiftDropInfoByDropId(dropIds[i], result);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void DropGroupCfg::GetGiftDropInfoByDropId(int dropid, std::vector<DROPGOODS>& result)
|
|||
|
|
{
|
|||
|
|
std::map<int, GIFTDROPTABLE>::iterator it = m_GiftDropTableMaps.find(dropid);
|
|||
|
|
if(it != m_GiftDropTableMaps.end())
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
GIFTDROPTABLE& info = it->second;
|
|||
|
|
if(!CheckTimeLimit(info))
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
int maxRand = 100; // nType:1 为随机
|
|||
|
|
if(info.nType == 2) //权重
|
|||
|
|
{
|
|||
|
|
maxRand = info.maxRate;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//std::vector<DROPINFO>::iterator pInfo = info.vGiftDropTables.begin();
|
|||
|
|
int count = info.vGiftDropTables.size();
|
|||
|
|
int nRate = 0;//
|
|||
|
|
int rand = wrand(maxRand);
|
|||
|
|
for(int i = 0; i < count; i++)
|
|||
|
|
{
|
|||
|
|
if(info.nType == 1)
|
|||
|
|
{
|
|||
|
|
nRate = info.vGiftDropTables[i].nRate;
|
|||
|
|
rand = wrand(maxRand);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
nRate += info.vGiftDropTables[i].nRate;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(rand <= nRate)
|
|||
|
|
{
|
|||
|
|
DROPGOODS item;
|
|||
|
|
item.info = info.vGiftDropTables[i];
|
|||
|
|
if(!item.info.bNoDrop) {
|
|||
|
|
|
|||
|
|
if(item.info.nType == 0 && info.isDropbest)
|
|||
|
|
{
|
|||
|
|
const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(item.info.nId);
|
|||
|
|
if(pStdItem && Item::itUndefinedType < pStdItem->m_btType < Item::itEquipMax && pStdItem->nJpdrop)
|
|||
|
|
{
|
|||
|
|
GetDropAttribute(pStdItem->m_btType, item);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
result.push_back(item);
|
|||
|
|
}
|
|||
|
|
if(info.nType == 2)
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
GIFTDROPTABLE* DropGroupCfg::GetDropTableConfig(int droptableid)
|
|||
|
|
{
|
|||
|
|
std::map<int, GIFTDROPTABLE>::iterator droptableCfg = m_GiftDropTableMaps.find(droptableid);
|
|||
|
|
if(droptableCfg != m_GiftDropTableMaps.end())
|
|||
|
|
{
|
|||
|
|
return &(droptableCfg->second);
|
|||
|
|
}
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
void DropGroupCfg::GetDropAttribute(int type, DROPGOODS& item)
|
|||
|
|
{
|
|||
|
|
std::map<int, DROPATTRIBUTECFG>::iterator dropAttrCfg = m_DropAttributeMaps.find(type);
|
|||
|
|
if(dropAttrCfg != m_DropAttributeMaps.end())
|
|||
|
|
{
|
|||
|
|
DROPATTRIBUTECFG cfg = dropAttrCfg->second;
|
|||
|
|
int rand = wrand(100);
|
|||
|
|
if(rand <= cfg.nRate)
|
|||
|
|
{
|
|||
|
|
int count = cfg.m_vAttribute.size();
|
|||
|
|
for(int i = 0; i < count; i++)
|
|||
|
|
{
|
|||
|
|
DropAttribute info = cfg.m_vAttribute[i];
|
|||
|
|
int rand_ = wrand(100);
|
|||
|
|
// printf("GetDropAttribute: %d, %d\n",rand_,info.nRate);
|
|||
|
|
if(rand_ <= info.nRate)
|
|||
|
|
{
|
|||
|
|
// printf("GetDropAttribute: %d, %d\n",rand_,info.nRate);
|
|||
|
|
item.AddDropItemAttr(info);
|
|||
|
|
if(info.nFollowcount)
|
|||
|
|
{
|
|||
|
|
for(int j = 0; j < info.nFollowcount; j++)
|
|||
|
|
{
|
|||
|
|
int rand = wrand(100);
|
|||
|
|
if(rand <= info.nFollowrate)
|
|||
|
|
{
|
|||
|
|
item.AddDropItemAttr(info);
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// if(info.nFollowcount)
|
|||
|
|
// {
|
|||
|
|
// for(int j = 0; j < info.nFollowcount; j++)
|
|||
|
|
// {
|
|||
|
|
// int rand = wrand(100);
|
|||
|
|
// if(rand <= info.nFollowrate)
|
|||
|
|
// {
|
|||
|
|
// item.AddDropItemAttr(info);
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool DropGroupCfg::CheckWeekLimit(GiftDropTable& dropTable, int week)
|
|||
|
|
{
|
|||
|
|
if(dropTable.vWeekLimt.size() <= 0)
|
|||
|
|
return true;
|
|||
|
|
|
|||
|
|
int count = dropTable.vWeekLimt.size();
|
|||
|
|
for(int i= 0 ; i< count; i++)
|
|||
|
|
{
|
|||
|
|
if(dropTable.vWeekLimt[i] == week)
|
|||
|
|
{
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool DropGroupCfg::CheckTimeLimit(GiftDropTable& dropTable)
|
|||
|
|
{
|
|||
|
|
/*
|
|||
|
|
* 表示不限制
|
|||
|
|
[]是星期几,不填或[*] 或 []表示不限
|
|||
|
|
| 表示确定的两个时间点之间内
|
|||
|
|
*/
|
|||
|
|
SYSTEMTIME nowTime;
|
|||
|
|
GetLocalTime(&nowTime);
|
|||
|
|
int nDays = GetLogicServer()->GetDaysSinceOpenServer();
|
|||
|
|
if( CheckLimit(dropTable.startTime.wYear, dropTable.endTime.wYear, nowTime.wYear) &&
|
|||
|
|
CheckLimit(dropTable.startTime.wMonth, dropTable.endTime.wMonth, nowTime.wMonth) &&
|
|||
|
|
CheckLimit(dropTable.startTime.wDay, dropTable.endTime.wDay, nowTime.wDay) &&
|
|||
|
|
CheckLimit(dropTable.startTime.wHour, dropTable.endTime.wHour, nowTime.wHour) &&
|
|||
|
|
CheckLimit(dropTable.startTime.wMinute, dropTable.endTime.wMinute, nowTime.wMinute) &&
|
|||
|
|
CheckWeekLimit(dropTable, nowTime.wDayOfWeek) && nDays >= dropTable.nLimitServerOpenDay &&(!dropTable.nCloseOpenDay || nDays < dropTable.nCloseOpenDay))
|
|||
|
|
{
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
return false;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool DropGroupCfg::CheckLimit(int start, int end, int now)
|
|||
|
|
{
|
|||
|
|
if(start != 0 && end != 0 && (now < start || now > end))
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
else if((start != 0 && end == 0 && now < start) || (start == 0 && end != 0 && now > end)) //start > end? 不太可能
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}else
|
|||
|
|
{
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
void DropGroupCfg::getDropItemOPParam(int nDropGroupId, std::vector<CUserItem>& dropItems)
|
|||
|
|
{
|
|||
|
|
std::vector<DROPGOODS> dropInfos;
|
|||
|
|
GetGiftDropInfoByDropGroupId(nDropGroupId, dropInfos);
|
|||
|
|
int count = dropInfos.size();
|
|||
|
|
if(count <= 0)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
for(int i = 0; i < count; i++)
|
|||
|
|
{
|
|||
|
|
CUserItem iParam;
|
|||
|
|
iParam.wItemId = dropInfos[i].info.nId;
|
|||
|
|
iParam.wCount = (WORD)dropInfos[i].info.nCount;
|
|||
|
|
iParam.btQuality =1;
|
|||
|
|
iParam.btStrong = 0;
|
|||
|
|
iParam.nType = dropInfos[i].info.nType ;
|
|||
|
|
if(dropInfos[i].info.nType == 0)
|
|||
|
|
{
|
|||
|
|
const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(dropInfos[i].info.nId);
|
|||
|
|
if(!pStdItem)
|
|||
|
|
continue;
|
|||
|
|
iParam.btQuality = pStdItem->b_showQuality;
|
|||
|
|
int num = dropInfos[i].v_bestAttr.size();
|
|||
|
|
|
|||
|
|
for(int j = 0; j < num; j++)
|
|||
|
|
{
|
|||
|
|
char buf[10];
|
|||
|
|
if(j != 0)
|
|||
|
|
strcat(iParam.cBestAttr, "|");
|
|||
|
|
|
|||
|
|
DropAttribute data = dropInfos[i].v_bestAttr[j];
|
|||
|
|
sprintf(buf, "%d,%d", data.nType, data.nValue);
|
|||
|
|
strcat(iParam.cBestAttr, buf);
|
|||
|
|
}
|
|||
|
|
iParam.cBestAttr[sizeof(iParam.cBestAttr)-1]= '\0';
|
|||
|
|
}
|
|||
|
|
dropItems.push_back(iParam);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|