Files
mir_server/server/LogicServer/config/DropGroupCfg.cpp
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

500 lines
12 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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);
}
}
}