init
This commit is contained in:
288
server/LogicServer/config/QuestProvider.cpp
Normal file
288
server/LogicServer/config/QuestProvider.cpp
Normal file
@@ -0,0 +1,288 @@
|
||||
#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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user