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

289 lines
6.7 KiB
C++

#include "StdAfx.h"
#include "QuestProvider.h"
using namespace wylib::stream;
CQuestProvider::CQuestProvider() : m_DataAllocator(_T("QuestDataAlloc"))
{
m_vAllQuestConfig.clear();
m_vMainRootQuestConfig.clear();
}
CQuestProvider::~CQuestProvider()
{
}
bool CQuestProvider::LoadQuest(LPCTSTR sFilePath)
{
bool Result = false;
CMemoryStream ms;
CCustomLuaPreProcessor pp;
try
{
//从文件加载配置脚本
if ( ms.loadFromFile(sFilePath) <= 0 )
showErrorFormat(_T("unable to load from %s"), sFilePath);
//对配置脚本进行预处理
GetLogicServer()->GetVSPDefine().RegisteToPreprocessor(pp);
LPCTSTR sText = pp.parse((LPCTSTR)ms.getMemory(), sFilePath);
//设置脚本内容
if ( !setScript(sText) )
showError(_T("syntax error on quest config"));
//读取标准物品配置数据
Result = ReadQuestItem();
}
catch (RefString &s)
{
OutputMsg(rmError, _T("load quest config error: %s"), s.rawStr());
}
catch (...)
{
OutputMsg(rmError, _T("unexpected error on load quest config"));
}
//销毁脚本虚拟机
setScript(NULL);
return Result;
}
bool CQuestProvider::ReadQuestItem()
{
if ( !openGlobalTable("TaskDisplayConfig") )
return false;
//获取配置中的物品数量
// size_t nItemCount = lua_objlen(m_pLua, -1);
// //如果物品数量为0则输出未配置任何物品的错误
// if ( nItemCount <= 0 )
// {
// showError(_T("no quest data on Quest config"));
// return FALSE;
// }
//循环读取物品配置数据
int idx = 0;
if ( enumTableFirst() )
{
do
{
if ( enumTableFirst() )
{
do
{
QuestInfoCfg cfg;
readItemData(cfg);
m_vAllQuestConfig[cfg.nQid][cfg.nState] = cfg;
if(cfg.nisFirst == -1)
m_vMainRootQuestConfig[cfg.nQid] = GetQuestConfig(cfg.nQid, cfg.nState);
}
while (enumTableNext());
}
}
while (enumTableNext());
}
closeTable();
return true;
}
bool CQuestProvider::readItemData(QuestInfoCfg& item )
{
bool boDefVal = false;
int nDef = 0;
item.nQid = getFieldInt("id");
item.nState = getFieldInt("state");
item.nLevelLimit = getFieldInt("levellimit");
item.nCircle = getFieldInt("zhuanshenglimit", &nDef);
item.nOpenDayLimit = getFieldInt("opendaylimit", &nDef);
item.nisFirst = getFieldInt("isfirst", &nDef);
item.nIscomplete = getFieldInt("iscomplete", &nDef);
item.nAnnular = getFieldInt("iscircle", &nDef);
item.nShowSchedule = getFieldInt("schedule", &nDef);
item.nFrontQid = getFieldInt("pretask", &nDef);
item.ntasktype = getFieldInt("tasktype", &nDef);
item.nAcceptState = getFieldInt("taskaccept", &nDef);
if ( feildTableExists("buttonchange") && openFieldTable("buttonchange") )
{
if(enumTableFirst())
{
do
{
ChangeQuestState state;
state.nQid = getFieldInt("taskid", &nDef);
state.nState = getFieldInt("state", &nDef);
item.button.push_back(state);
}while(enumTableNext());
}
closeTable();
}
if ( feildTableExists("autochange") && openFieldTable("autochange") )
{
if(enumTableFirst())
{
do
{
ChangeQuestState state;
state.nQid = getFieldInt("taskid", &nDef);
state.nState = getFieldInt("state", &nDef);
item.nAuto.push_back(state);
}while(enumTableNext());
}
closeTable();
}
if ( feildTableExists("changeState") && openFieldTable("changeState") )
{
item.mQuestInfo.nType = getFieldInt("type", &nDef);
item.mQuestInfo.nValue = getFieldInt("value", &nDef);
item.mQuestInfo.nSubType = getFieldInt("subtype", &nDef);
if(feildTableExists("mapid") && openFieldTable("mapid"))
{
if(enumTableFirst())
{
do
{
int nId = getFieldInt(NULL);
item.mQuestInfo.nMaps.push_back(nId);
}while(enumTableNext());
}
closeTable();
}
if(feildTableExists("group") && openFieldTable("group"))
{
if(enumTableFirst())
{
do
{
int nId = getFieldInt(NULL);
item.nGroups.push_back(nId);
}while(enumTableNext());
}
closeTable();
}
if(feildTableExists("id") && openFieldTable("id"))
{
if(enumTableFirst())
{
do
{
int nId = getFieldInt(NULL);
item.mQuestInfo.nIds.push_back(nId);
}while(enumTableNext());
}
closeTable();
}
closeTable();
}
if ( feildTableExists("flyshoescost") && openFieldTable("flyshoescost") )
{
if(enumTableFirst())
{
do
{
QuestCostFlyshoe flycost;
flycost.times = getFieldInt("times", &nDef);
if(feildTableExists("cost") && openFieldTable("cost") )
{
flycost.costs.nId = getFieldInt("id",&nDef);
flycost.costs.nCount = getFieldInt("count",&nDef);
flycost.costs.nType = getFieldInt("type",&nDef);
closeTable();
}
item.m_nCostFlyShoes.push_back(flycost);
}while(enumTableNext());
}
closeTable();
}
int nType = 1;
if ( feildTableExists("tasknameclick") && openFieldTable("tasknameclick") )
{
// TeleportInfo tel;
// tel.nMapid = getFeildInt("map", &nDef);
// tel.nId = getFeildInt("id", &nDef);
// tel.nNpcId = getFeildInt("npcid", &nDef);
// tel.nX = getFeildInt("x", &nDef);
// tel.nY = getFeildInt("y", &nDef);
// tel.nRange = getFeildInt("range", &nDef);
// item.m_nTelinfo[type].push_back(tel);
if(enumTableFirst())
{
do
{
ReadTelePortInfo(item, nType);
}while(enumTableNext());
}
closeTable();
}
nType++;
if ( feildTableExists("teleportpos") && openFieldTable("teleportpos") )
{
if(enumTableFirst())
{
do
{
ReadTelePortInfo(item, nType);
}while(enumTableNext());
}
closeTable();
}
nType++;
if ( feildTableExists("flyshoespos") && openFieldTable("flyshoespos") )
{
// TeleportInfo tel;
// tel.nMapid = getFeildInt("map", &nDef);
// tel.nId = getFeildInt("id", &nDef);
// tel.nX = getFeildInt("x", &nDef);
// tel.nY = getFeildInt("y", &nDef);
// tel.nRange = getFeildInt("range", &nDef);
// tel.nNpcId = getFeildInt("npcid", &nDef);
// item.m_nTelinfo[type].push_back(tel);
if(enumTableFirst())
{
do
{
ReadTelePortInfo(item, nType);
}while(enumTableNext());
}
closeTable();
}
if ( feildTableExists("award") && openFieldTable("award") )
{
if(enumTableFirst())
{
do
{
QuestAward award;
award.nCount = getFieldInt("count", &nDef);
award.nType = getFieldInt("type", &nDef);
award.nId = getFieldInt("id", &nDef);
item.awards.push_back(award);
}while(enumTableNext());
}
closeTable();
}
return TRUE;
}
void CQuestProvider::ReadTelePortInfo(QuestInfoCfg& item , int nType)
{
TeleportInfo tel;
int nDef = 0;
tel.nId = getFieldInt("id", &nDef);
tel.nMapid = getFieldInt("map", &nDef);
tel.nX = getFieldInt("x", &nDef);
tel.nY = getFieldInt("y", &nDef);
tel.nRange = getFieldInt("range", &nDef);
tel.nIsOpen = getFieldInt("isopen", &nDef);
tel.nAuto = getFieldInt("outboard", &nDef);
tel.nTelNpcId = getFieldInt("npcid", &nDef);
item.m_nTelinfo[nType].push_back(tel);
}