Files
mir_server/server/LogicServer/config/DropGroupCfg.cpp

500 lines
12 KiB
C++
Raw Normal View History

2025-01-09 17:45:40 +08:00
#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; // nType1 为随机
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; // nType1 为随机
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);
}
}
}