1466 lines
40 KiB
C++
1466 lines
40 KiB
C++
|
|
#include "StdAfx.h"
|
|||
|
|
#include "StdItemProvider.h"
|
|||
|
|
#include "../misc/caches/StdItemConfigCacher.h"
|
|||
|
|
#include "../base/Container.hpp"
|
|||
|
|
using namespace wylib::stream;
|
|||
|
|
|
|||
|
|
LPCTSTR CStdItemProvider::StdItemCacheFile = _T(
|
|||
|
|
"./data/runtime/cache/StdItems.cch");
|
|||
|
|
|
|||
|
|
CStdItemProvider::CStdItemProvider() :
|
|||
|
|
Inherited(), Inherited2(), m_DataAllocator(_T("ItemDataAlloc")), m_DeriveDataAllocator(
|
|||
|
|
_T("EquipDeriveDataAlloc")), m_SmithDataAllocator(
|
|||
|
|
_T("SmithDataAllocator")), m_FiveAttrDataAllocator(
|
|||
|
|
_T("FiveAttrDataAllocator")), m_FiveAttrListDataAllocator(
|
|||
|
|
_T("FiveAttrListDataAllocator")), m_SuitAttrDataAllocator(_T("SuitAttrDataAllocator")){
|
|||
|
|
//m_pStdItemsBack = 0;
|
|||
|
|
m_nItemCount = 0;
|
|||
|
|
memset(m_orangeEquipAttr, 0, sizeof(m_orangeEquipAttr));
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CStdItemProvider::~CStdItemProvider() {
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CStdItemProvider::LoadStdItems(LPCTSTR sFilePath, bool bBackLoad) {
|
|||
|
|
bool Result = false;
|
|||
|
|
DWORD dwSrcCRC;
|
|||
|
|
CMemoryStream ms;
|
|||
|
|
CCustomLuaPreProcessor pp;
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
if (!bBackLoad) {
|
|||
|
|
#ifdef _DEBUG
|
|||
|
|
if (IsDebuggerPresent())
|
|||
|
|
{
|
|||
|
|
if (readCacheData(-1))
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmTip, "[StdItemProvider] StdItem data force loaded from cache. you may delete cache file to cause load from source!");
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//从文件加载配置脚本
|
|||
|
|
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);
|
|||
|
|
// //计算脚本文本CRC值
|
|||
|
|
// dwSrcCRC = ~CRC32Update(0xFFFFFFFF, sText, (int)strlen(sText));
|
|||
|
|
// //尝试从缓存文件快速读取配置数据,如果无法从缓存中读取或数据已经变更则重新加载源数据
|
|||
|
|
// Result = readCacheData(dwSrcCRC, bBackLoad);
|
|||
|
|
// if (Result) {
|
|||
|
|
// OutputMsg(rmTip,
|
|||
|
|
// "[StdItemProvider] StdItem config data loaded from cache");
|
|||
|
|
// } else {
|
|||
|
|
//设置脚本内容
|
|||
|
|
if (!setScript(sText))
|
|||
|
|
showError(_T("syntax error on StdItem config"));
|
|||
|
|
FILE* fp = fopen("scripterror.txt", "wb");
|
|||
|
|
if (fp)
|
|||
|
|
{
|
|||
|
|
fputs(sText, fp);
|
|||
|
|
fclose(fp);
|
|||
|
|
}
|
|||
|
|
//读取标准物品配置数据
|
|||
|
|
Result = readStdItems(bBackLoad);
|
|||
|
|
//保存物品配置数据缓存
|
|||
|
|
if (Result)
|
|||
|
|
saveCacheData(dwSrcCRC);
|
|||
|
|
// }
|
|||
|
|
} catch (RefString &s) {
|
|||
|
|
OutputMsg(rmError, _T("load StdItem config error: %s"), s.rawStr());
|
|||
|
|
} catch (...) {
|
|||
|
|
OutputMsg(rmError, _T("unexpected error on load StdItem config"));
|
|||
|
|
}
|
|||
|
|
//销毁脚本虚拟机
|
|||
|
|
setScript(NULL);
|
|||
|
|
return Result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CStdItemProvider::completeRead(CStdItem *pStdItems,
|
|||
|
|
const INT_PTR nItemCount, CDataAllocator &dataAllocator,
|
|||
|
|
bool bBackLoad) {
|
|||
|
|
if (bBackLoad) {
|
|||
|
|
m_Lock.Lock();
|
|||
|
|
//m_pStdItemsBack = pStdItems;
|
|||
|
|
m_ItemBack.reserve(0);
|
|||
|
|
m_ItemBack.trunc(0);
|
|||
|
|
m_ItemBack.addArray(pStdItems, nItemCount);
|
|||
|
|
m_nItemCount = nItemCount;
|
|||
|
|
m_DataAllocatorBack.~CObjectAllocator();
|
|||
|
|
m_DataAllocatorBack = dataAllocator;
|
|||
|
|
ZeroMemory(&dataAllocator, sizeof(dataAllocator));
|
|||
|
|
m_Lock.Unlock();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//读取物品配置完成,将临时列表中的物品数据全部拷贝到自身中
|
|||
|
|
reserve(nItemCount);
|
|||
|
|
trunc(0);
|
|||
|
|
addArray(pStdItems, nItemCount);
|
|||
|
|
//调用自身的物品属性申请器的析构函数,以便释放之前的物品属性的内存块
|
|||
|
|
m_DataAllocator.~CObjectAllocator();
|
|||
|
|
//将临时的物品属性申请器的内存数据拷贝到自身申请器中
|
|||
|
|
m_DataAllocator = dataAllocator;
|
|||
|
|
//情况临时物品属性申请器的内存数据,防止新读取的物品属性数据被销毁
|
|||
|
|
ZeroMemory(&dataAllocator, sizeof(dataAllocator));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CStdItemProvider::UpdateItemConfig() {
|
|||
|
|
reserve(m_nItemCount);
|
|||
|
|
trunc(0);
|
|||
|
|
//addArray(m_pStdItemsBack, m_nItemCount);
|
|||
|
|
addList(m_ItemBack);
|
|||
|
|
m_DataAllocator.~CObjectAllocator();
|
|||
|
|
m_DataAllocator = m_DataAllocatorBack;
|
|||
|
|
|
|||
|
|
//m_pStdItemsBack = 0;
|
|||
|
|
m_nItemCount = 0;
|
|||
|
|
ZeroMemory(&m_DataAllocatorBack, sizeof(m_DataAllocatorBack));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CStdItemProvider::readStdItems(bool bBackLoad) {
|
|||
|
|
|
|||
|
|
if (!openGlobalTable("StdItems"))
|
|||
|
|
return false;
|
|||
|
|
CBaseList<CStdItem> itemList;
|
|||
|
|
//获取配置中的物品数量
|
|||
|
|
const INT_PTR nItemCount = lua_objlen(m_pLua, -1) + 1;
|
|||
|
|
//如果物品数量为0则输出未配置任何物品的错误
|
|||
|
|
if (nItemCount <= 0)
|
|||
|
|
showError(_T("no item data on StdItem config"));
|
|||
|
|
//申请出物品数据并将物品数据内存块清空
|
|||
|
|
itemList.reserve(nItemCount);
|
|||
|
|
CStdItem *pStdItems = itemList;
|
|||
|
|
ZeroMemory(pStdItems, sizeof(CStdItem) * nItemCount);
|
|||
|
|
|
|||
|
|
//循环读取物品配置数据
|
|||
|
|
if (enumTableFirst()) {
|
|||
|
|
INT_PTR nIdx = 1;
|
|||
|
|
CDataAllocator dataAllocator;
|
|||
|
|
do {
|
|||
|
|
//读取物品配置数据
|
|||
|
|
//CStdItem item = pStdItems[nIdx];
|
|||
|
|
int index = getFieldInt("id");
|
|||
|
|
CStdItem& item = pStdItems[index];
|
|||
|
|
if(index > nItemCount)
|
|||
|
|
{
|
|||
|
|
showErrorFormat(_T("readItemData itemindex %d, maxCount %d"),index, nItemCount);
|
|||
|
|
endTableEnum();
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if(!readItemData(dataAllocator, item))
|
|||
|
|
break;
|
|||
|
|
item.m_nIndex = index;
|
|||
|
|
//如果该物品的ID不是期望的值,则输出错误并终止读取
|
|||
|
|
// if (item.m_nIndex != nIdx) {
|
|||
|
|
// showErrorFormat(_T("unexpected itemindex %d, request %d"),
|
|||
|
|
// item.m_nIndex, nIdx);
|
|||
|
|
// endTableEnum();
|
|||
|
|
// break;
|
|||
|
|
// }
|
|||
|
|
nIdx++;
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
//完成数据读取,将读取的数据应用到自身
|
|||
|
|
completeRead(pStdItems, nItemCount, dataAllocator, bBackLoad);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
closeTable();
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
void CStdItemProvider::ReadItemForge()
|
|||
|
|
{
|
|||
|
|
if (!openGlobalTable("ForgeConfig"))
|
|||
|
|
return;
|
|||
|
|
int nDef = 0;
|
|||
|
|
if(enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
ItemForgeCfg forge;
|
|||
|
|
forge.nId = getFieldInt("id", &nDef);
|
|||
|
|
forge.nDropId = getFieldInt("dropid", &nDef);
|
|||
|
|
forge.nLevel = getFieldInt("level", &nDef);
|
|||
|
|
m_forgeList.push_back(forge);
|
|||
|
|
}while(enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
|
|||
|
|
if (!openGlobalTable("ForgeBaseConfig"))
|
|||
|
|
return;
|
|||
|
|
nForgeItemId = getFieldInt("itemID",&nDef);
|
|||
|
|
nOnceForgeCost = getFieldInt("one",&nDef);
|
|||
|
|
nTenForgeCost = getFieldInt("ten",&nDef);
|
|||
|
|
nBagone = getFieldInt("bagone",&nDef);
|
|||
|
|
nBagten = getFieldInt("bagten",&nDef);
|
|||
|
|
nEquipment = getFieldInt("equipment",&nDef);
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CStdItemProvider::ReadItemCompose()
|
|||
|
|
{
|
|||
|
|
if (!openGlobalTable("ItemMergeConfig"))
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
int nDef = 0;
|
|||
|
|
if(enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
if(enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
if(enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
ItemComposeCfg compose;
|
|||
|
|
compose.nId = getFieldInt("Eid", &nDef);
|
|||
|
|
compose.nLevelLimt = getFieldInt("level", &nDef);
|
|||
|
|
|
|||
|
|
compose.nOpenServerDay = getFieldInt("openserverday", &nDef);
|
|||
|
|
compose.nArea = getFieldInt("area", &nDef);
|
|||
|
|
if(feildTableExists("table") && openFieldTable("table"))
|
|||
|
|
{
|
|||
|
|
if(enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
ComposeTableCfg tf;
|
|||
|
|
tf.nType = getFieldInt("type");
|
|||
|
|
tf.nCount = getFieldInt("count");
|
|||
|
|
tf.nId = getFieldInt("id");
|
|||
|
|
compose.table.push_back(tf);
|
|||
|
|
}while(enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(feildTableExists("compose") && openFieldTable("compose"))
|
|||
|
|
{
|
|||
|
|
compose.composeItem.nType = getFieldInt("type");
|
|||
|
|
compose.composeItem.nCount = getFieldInt("count");
|
|||
|
|
compose.composeItem.nId = getFieldInt("id");
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
if(feildTableExists("mergelimit") && openFieldTable("mergelimit"))
|
|||
|
|
{
|
|||
|
|
compose.nCircle = getFieldInt("zsLevel", &nDef);
|
|||
|
|
compose.nOfficeId = getFieldInt("office", &nDef);
|
|||
|
|
compose.nVipLimit = getFieldInt("vip", &nDef);
|
|||
|
|
compose.nGhostLevelLimit = getFieldInt("smLevel", &nDef);
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
m_composeList[compose.nId] = compose;
|
|||
|
|
}while(enumTableNext());
|
|||
|
|
}
|
|||
|
|
}while(enumTableNext());
|
|||
|
|
}
|
|||
|
|
}while(enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CStdItemProvider::readItemData(CDataAllocator &dataAllocator, CStdItem &item) {
|
|||
|
|
INT_PTR nLevel;
|
|||
|
|
int nDefVal = 0;
|
|||
|
|
|
|||
|
|
getFieldStringBuffer("name", item.m_sName, sizeof(item.m_sName));
|
|||
|
|
item.m_btType = (BYTE) getFieldInt("type");
|
|||
|
|
item.m_wIcon = (WORD) getFieldInt("icon");
|
|||
|
|
item.m_wShape = (WORD) getFieldInt("shape", &nDefVal);
|
|||
|
|
item.m_wBack = (WORD) getFieldInt("back", &nDefVal);
|
|||
|
|
//item.m_dwDura = (UINT) getFieldInt("dura", &nDefVal);
|
|||
|
|
double nDwDefVal = 0;
|
|||
|
|
//item.m_dwUseDurDrop = (UINT) getFieldInt("useDurDrop", &nDefVal);
|
|||
|
|
item.m_nCDTime = getFieldInt("cdTime", &nDefVal);
|
|||
|
|
item.m_wDupCount = (WORD) getFieldInt("dup");
|
|||
|
|
item.m_btColGroup = (BYTE) getFieldInt("colGroup");
|
|||
|
|
if (item.m_btColGroup >= CUserBag::s_nMaxItemCDGroupCount)
|
|||
|
|
return false;
|
|||
|
|
|
|||
|
|
item.m_btDealType = (BYTE) getFieldInt("dealType");
|
|||
|
|
item.m_nPrice = getFieldInt("dealPrice");
|
|||
|
|
item.m_UseTime = getFieldInt("time");
|
|||
|
|
//item.m_btSmithId = (BYTE) getFieldInt("smithId", &nDefVal);
|
|||
|
|
item.m_nRecoverId = getFieldInt("recoverid", &nDefVal);
|
|||
|
|
item.m_wSuitID = getFieldInt("suitId", &nDefVal); //套装的ID
|
|||
|
|
item.m_wResonanceId = getFieldInt("resonanceId", &nDefVal); //共鸣ID
|
|||
|
|
item.b_showQuality = getFieldInt("showQuality", &nDefVal); //显示的品质
|
|||
|
|
item.m_nDropBroadcast = getFieldInt("dropBroadcast", &nDefVal);
|
|||
|
|
//item.w_candidateIconCount = (WORD) getFieldInt("candidateIconCount",
|
|||
|
|
// &nDefVal); //获取图标
|
|||
|
|
//item.b_specRing = (BYTE) getFieldInt("specRing", &nDefVal);
|
|||
|
|
item.m_btBatchType = (BYTE) getFieldInt("batchType", &nDefVal);
|
|||
|
|
item.m_nBatchValue = getFieldInt("batchValue", &nDefVal);
|
|||
|
|
item.m_nSillId = 0;//getFieldInt("skillID2", &nDefVal);
|
|||
|
|
//item.m_nConsignType = getFieldInt("consignType", &nDefVal);
|
|||
|
|
item.m_DropCount = 0;
|
|||
|
|
|
|||
|
|
//nDefVal = -1;
|
|||
|
|
//item.m_nValidFbId = getFieldInt("validFbId", &nDefVal); // 物品生效的副本ID。默认为-1
|
|||
|
|
//item.m_nValidSceneId = getFieldInt("validSceneId", &nDefVal);// 物品生效的场景ID。默认为-1
|
|||
|
|
|
|||
|
|
item.m_nPackageType = getFieldInt("packageType");
|
|||
|
|
item.m_ndropGroupid = getFieldInt("dropGroupid", &nDefVal);
|
|||
|
|
item.m_nsuggVocation = getFieldInt("suggVocation",&nDefVal);
|
|||
|
|
|
|||
|
|
item.m_nItemlvl = getFieldInt("itemlvl",&nDefVal);
|
|||
|
|
item.nRecycling = getFieldInt("recycling",&nDefVal);
|
|||
|
|
item.nItemlevel = getFieldInt("itemlevel",&nDefVal);
|
|||
|
|
item.nJpdrop = getFieldInt("jpdrop",&nDefVal);
|
|||
|
|
item.nTips = getFieldInt("tipsid",&nDefVal);
|
|||
|
|
|
|||
|
|
item.m_nOpenDaylimit = getFieldInt("openDaylimit", &nDefVal);
|
|||
|
|
|
|||
|
|
bool boDefVal = false;
|
|||
|
|
item.m_Flags.canMoveKb = (bool)getFieldInt("canMoveKb", &nDefVal);
|
|||
|
|
item.m_Flags.denyDeal = (bool)getFieldInt("denyDeal", &nDefVal);
|
|||
|
|
item.m_Flags.denySell = (bool)getFieldInt("denySell", &nDefVal);
|
|||
|
|
item.m_Flags.denyDestroy = (bool)getFieldInt("denyDestroy", &nDefVal);
|
|||
|
|
item.m_Flags.recordLog = (bool)getFieldInt("recordLog", &nDefVal);
|
|||
|
|
|
|||
|
|
item.m_CanUseType = 0;
|
|||
|
|
item.m_CanUseCount = 0;
|
|||
|
|
if (feildTableExists("UseLimit") && openFieldTable("UseLimit"))
|
|||
|
|
{
|
|||
|
|
item.m_CanUseType = getFieldInt("CanUseType", &nDefVal);
|
|||
|
|
item.m_CanUseCount = getFieldInt("CanUseCount", &nDefVal);
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (feildTableExists("deathsplit") && openFieldTable("deathsplit")) {
|
|||
|
|
if(enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
ItemDeathSplit splt;
|
|||
|
|
splt.nType = getFieldInt("type",&nDefVal);
|
|||
|
|
splt.nItemId = getFieldInt("id",&nDefVal);
|
|||
|
|
splt.nCount = getFieldInt("count",&nDefVal);
|
|||
|
|
item.m_nDeathsplit.push_back(splt);
|
|||
|
|
}while(enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (feildTableExists("select") && openFieldTable("select")) {
|
|||
|
|
if(enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
SelectItemInfo info;
|
|||
|
|
info.nIndex = getFieldInt("index",&nDefVal);
|
|||
|
|
info.m_ndropGroupid = getFieldInt("dorpid",&nDefVal);
|
|||
|
|
if (feildTableExists("item") && openFieldTable("item")) {
|
|||
|
|
ItemDeathSplit splt;
|
|||
|
|
splt.nType = getFieldInt("type",&nDefVal);
|
|||
|
|
splt.nItemId = getFieldInt("id",&nDefVal);
|
|||
|
|
splt.nCount = getFieldInt("count",&nDefVal);
|
|||
|
|
info.items.push_back(splt);
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
item.m_SelectItems.push_back(info);
|
|||
|
|
}while(enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
// 读取物品可存在的场景集合
|
|||
|
|
item.m_existScenes.nCount = 0;
|
|||
|
|
if (feildTableExists("existScenes") && openFieldTable("existScenes")) {
|
|||
|
|
INT_PTR count = lua_objlen(m_pLua, -1);
|
|||
|
|
item.m_existScenes.nCount = count;
|
|||
|
|
item.m_existScenes.pSceneId = (int *) dataAllocator.allocObjects(
|
|||
|
|
count * sizeof(*(item.m_existScenes.pSceneId)));
|
|||
|
|
INT_PTR index = 0;
|
|||
|
|
if (count > 0 && enumTableFirst()) {
|
|||
|
|
do {
|
|||
|
|
int nSceneId = getFieldInt(NULL);
|
|||
|
|
if (index < count) {
|
|||
|
|
item.m_existScenes.pSceneId[index] = nSceneId;
|
|||
|
|
index++;
|
|||
|
|
if (nSceneId == -1) // -1表示不限制场景
|
|||
|
|
{
|
|||
|
|
endTableEnum();
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
endTableEnum();
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
} else {
|
|||
|
|
// 默认不配置表示所有场景都能用
|
|||
|
|
item.m_existScenes.nCount = 1;
|
|||
|
|
item.m_existScenes.pSceneId = (int *) dataAllocator.allocObjects(
|
|||
|
|
item.m_existScenes.nCount
|
|||
|
|
* sizeof(*(item.m_existScenes.pSceneId)));
|
|||
|
|
item.m_existScenes.pSceneId[0] = -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//读取物品静态属性
|
|||
|
|
if (feildTableExists("staitcAttrs") && openFieldTable("staitcAttrs")) {
|
|||
|
|
readItemAttributeTable(dataAllocator, item.m_StaticAttrs);
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
//读取物品品质属性
|
|||
|
|
if (feildTableExists("qualityAttrs") && openFieldTable("qualityAttrs")) {
|
|||
|
|
if (enumTableFirst()) {
|
|||
|
|
nLevel = 0;
|
|||
|
|
do {
|
|||
|
|
readItemAttributeTable(dataAllocator,
|
|||
|
|
item.m_QualityAttrs[nLevel]);
|
|||
|
|
nLevel++;
|
|||
|
|
if (nLevel >= CStdItem::MaxItemQuality) {
|
|||
|
|
endTableEnum();
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
//读取物品强化属性
|
|||
|
|
if (feildTableExists("strongAttrs") && openFieldTable("strongAttrs")) {
|
|||
|
|
if (enumTableFirst()) {
|
|||
|
|
nLevel = 0;
|
|||
|
|
do {
|
|||
|
|
readItemAttributeTable(dataAllocator,
|
|||
|
|
item.m_StrongAttrs[nLevel]);
|
|||
|
|
nLevel++;
|
|||
|
|
if (nLevel >= CStdItem::MaxItemStrong) {
|
|||
|
|
endTableEnum();
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
//item.m_StrongCount = (BYTE) nLevel;
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
//读取物品联合属性
|
|||
|
|
/*
|
|||
|
|
if ( feildTableExists("unitedAttrs") && openFieldTable("unitedAttrs") )
|
|||
|
|
{
|
|||
|
|
item.m_UnitedAttrs.nCount = lua_objlen(m_pLua, -1);
|
|||
|
|
if ( enumTableFirst() )
|
|||
|
|
{
|
|||
|
|
CStdItem::UnitedAttributeGroup *pUnitedGroups;
|
|||
|
|
item.m_UnitedAttrs.pGroups = pUnitedGroups = (CStdItem::UnitedAttributeGroup*)dataAllocator.allocObjects(
|
|||
|
|
sizeof(*pUnitedGroups) * item.m_UnitedAttrs.nCount);
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
//读取联合属性的联合物品表
|
|||
|
|
if ( feildTableExists("items") && openFieldTable("items") )
|
|||
|
|
{
|
|||
|
|
readUnitedItemTable(dataAllocator, *pUnitedGroups);
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
//读取联合属性表
|
|||
|
|
if ( feildTableExists("attrs") && openFieldTable("attrs") )
|
|||
|
|
{
|
|||
|
|
readItemAttributeTable(dataAllocator, *pUnitedGroups);
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
pUnitedGroups++;
|
|||
|
|
}
|
|||
|
|
while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
//读取精锻随机属性
|
|||
|
|
/*
|
|||
|
|
if ( feildTableExists("smithAttrs") && openFieldTable("smithAttrs") )
|
|||
|
|
{
|
|||
|
|
item.m_SmithAttrs.nCount = lua_objlen(m_pLua, -1);
|
|||
|
|
item.m_SmithAttrs.pAttrs = (PRANDOMATTRTERM)dataAllocator.allocObjects(
|
|||
|
|
sizeof(*item.m_SmithAttrs.pAttrs) * item.m_SmithAttrs.nCount);
|
|||
|
|
CRandAttrReader randReader;
|
|||
|
|
randReader.readConfig(m_pLua, item.m_SmithAttrs.pAttrs, item.m_SmithAttrs.nCount);
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
//读取物品标志属性
|
|||
|
|
if (feildTableExists("flags") && openFieldTable("flags")) {
|
|||
|
|
readItemFlags(item);
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
//读取物品使用条件表
|
|||
|
|
if (feildTableExists("conds") && openFieldTable("conds")) {
|
|||
|
|
readItemConditionTable(dataAllocator, item.m_Conditions);
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
//读取物品预留配置
|
|||
|
|
if (feildTableExists("reserves") && openFieldTable("reserves")) {
|
|||
|
|
readItemReservesTable(dataAllocator, item.m_Reserves);
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CStdItemProvider::readItemAttributeTable(CDataAllocator &dataAllocator,
|
|||
|
|
CStdItem::AttributeGroup &AttrGroup) {
|
|||
|
|
PGAMEATTR pAttr;
|
|||
|
|
AttrGroup.nCount = lua_objlen(m_pLua, -1);
|
|||
|
|
|
|||
|
|
if (enumTableFirst()) {
|
|||
|
|
pAttr = AttrGroup.pAttrs = (PGAMEATTR) dataAllocator.allocObjects(
|
|||
|
|
sizeof(*AttrGroup.pAttrs) * AttrGroup.nCount);
|
|||
|
|
do {
|
|||
|
|
// read type
|
|||
|
|
pAttr->type = getFieldInt("type");
|
|||
|
|
//判断物品属性类型是否有效
|
|||
|
|
if (pAttr->type < aUndefined || pAttr->type >= GameAttributeCount) {
|
|||
|
|
showErrorFormat(_T("item type config error %d"), pAttr->type);
|
|||
|
|
}
|
|||
|
|
// read value
|
|||
|
|
switch (AttrDataTypes[pAttr->type]) {
|
|||
|
|
case adSmall:
|
|||
|
|
case adShort:
|
|||
|
|
case adInt:
|
|||
|
|
pAttr->value.nValue = getFieldInt("value");
|
|||
|
|
break;
|
|||
|
|
case adUSmall:
|
|||
|
|
case adUShort:
|
|||
|
|
case adUInt:
|
|||
|
|
pAttr->value.uValue = (UINT) getFieldInt64("value");
|
|||
|
|
break;
|
|||
|
|
case adFloat:
|
|||
|
|
pAttr->value.fValue = (float) getFieldNumber("value");
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
pAttr++;
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CStdItemProvider::readUnitedItemTable(CDataAllocator &dataAllocator,
|
|||
|
|
CStdItem::UnitedAttributeGroup &unitedGroup) {
|
|||
|
|
unitedGroup.nUnitedItemCount = lua_objlen(m_pLua, -1);
|
|||
|
|
if (enumTableFirst()) {
|
|||
|
|
PWORD pItemIds;
|
|||
|
|
unitedGroup.pUnitedItemIds = pItemIds =
|
|||
|
|
(PWORD) dataAllocator.allocObjects(
|
|||
|
|
sizeof(*unitedGroup.pUnitedItemIds)
|
|||
|
|
* unitedGroup.nUnitedItemCount);
|
|||
|
|
do {
|
|||
|
|
*pItemIds = getFieldInt(NULL);
|
|||
|
|
pItemIds++;
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
bool CStdItemProvider::readItemFlags(CStdItem &item) {
|
|||
|
|
bool boDefVal = false;
|
|||
|
|
//item.m_Flags.recordLog = getFieldBoolean("recordLog", &boDefVal);
|
|||
|
|
item.m_Flags.denyStorage = getFieldBoolean("denyStorage", &boDefVal);
|
|||
|
|
item.m_Flags.denyGuildDepot = getFieldBoolean("denyGuildDepot", &boDefVal);
|
|||
|
|
item.m_Flags.autoBindOnTake = getFieldBoolean("autoBindOnTake", &boDefVal);
|
|||
|
|
item.m_Flags.autoStartTime = getFieldBoolean("autoStartTime", &boDefVal);
|
|||
|
|
//item.m_Flags.denyDeal = getFieldBoolean("denyDeal", &boDefVal);
|
|||
|
|
//item.m_Flags.denySell = getFieldBoolean("denySell", &boDefVal);
|
|||
|
|
//item.m_Flags.denyDestroy = getFieldBoolean("denyDestroy", &boDefVal);
|
|||
|
|
item.m_Flags.destroyOnOffline = getFieldBoolean("destroyOnOffline",&boDefVal);
|
|||
|
|
|
|||
|
|
item.m_Flags.destroyOnDie = getFieldBoolean("destroyOnDie", &boDefVal);
|
|||
|
|
item.m_Flags.denyDropdown = getFieldBoolean("denyDropdown", &boDefVal);
|
|||
|
|
item.m_Flags.dieDropdown = getFieldBoolean("dieDropdown", &boDefVal);
|
|||
|
|
item.m_Flags.offlineDropdown = getFieldBoolean("offlineDropdown",
|
|||
|
|
&boDefVal);
|
|||
|
|
// //item.m_Flags.inlayable = getFieldBoolean("inlayable", &boDefVal);
|
|||
|
|
// //item.m_Flags.hideDura = getFieldBoolean("hideDura", &boDefVal);
|
|||
|
|
// item.m_Flags.denySplite = getFieldBoolean("denySplite", &boDefVal);
|
|||
|
|
item.m_Flags.asQuestItem = getFieldBoolean("asQuestItem", &boDefVal);
|
|||
|
|
// item.m_Flags.monAlwaysDropdown = getFieldBoolean("monAlwaysDropdown",
|
|||
|
|
// &boDefVal);
|
|||
|
|
// item.m_Flags.hideQualityName = getFieldBoolean("hideQualityName",
|
|||
|
|
// &boDefVal);
|
|||
|
|
// item.m_Flags.denyTipsAutoLine = getFieldBoolean("denyTipsAutoLine",
|
|||
|
|
// &boDefVal);
|
|||
|
|
item.m_Flags.showLootTips = getFieldBoolean("showLootTips", &boDefVal);
|
|||
|
|
// item.m_Flags.denyDropDua = getFieldBoolean("denyDropDua", &boDefVal);
|
|||
|
|
//item.m_Flags.denyRepair = getFieldBoolean("denyRepair", &boDefVal);
|
|||
|
|
// item.m_Flags.canDig = getFieldBoolean("canDig", &boDefVal);
|
|||
|
|
// item.m_Flags.fullDel = getFieldBoolean("fullDel", &boDefVal);
|
|||
|
|
item.m_Flags.denyBuffOverlay = getFieldBoolean("denyBuffOverlay", &boDefVal);
|
|||
|
|
// item.m_Flags.skillRemoveItem = getFieldBoolean("skillRemoveItem",
|
|||
|
|
// &boDefVal);
|
|||
|
|
// item.m_Flags.denyHeroUse = getFieldBoolean("denyHeroUse", &boDefVal);
|
|||
|
|
item.m_Flags.matchAllSuit = getFieldBoolean("matchAllSuit", &boDefVal);
|
|||
|
|
//item.m_Flags.canMoveKb = getFieldBoolean("canMoveKb", &boDefVal);
|
|||
|
|
// item.m_Flags.notConsumeForCircleForge = getFieldBoolean(
|
|||
|
|
// "notConsumeForCircleForge", &boDefVal);
|
|||
|
|
// item.m_Flags.notShowAppear = getFieldBoolean("notShowAppear", &boDefVal);
|
|||
|
|
// item.m_Flags.boDelete = getFieldBoolean("isDelete", &boDefVal);
|
|||
|
|
// item.m_Flags.showdura = getFieldBoolean("showdura", &boDefVal);
|
|||
|
|
// item.m_Flags.bMeltingFlag = getFieldBoolean("MeltingFlag", &boDefVal);
|
|||
|
|
// item.m_Flags.bCanIdentify = getFieldBoolean("canIdentify", &boDefVal);//是否可以被鉴定,默认不可鉴定
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CStdItemProvider::readItemConditionTable(CDataAllocator &dataAllocator,
|
|||
|
|
CStdItem::ItemUseCondTable &condTable) {
|
|||
|
|
condTable.nCount = lua_objlen(m_pLua, -1);
|
|||
|
|
if (enumTableFirst()) {
|
|||
|
|
CStdItem::ItemUseCondition *pConds;
|
|||
|
|
condTable.pConds = pConds =
|
|||
|
|
(CStdItem::ItemUseCondition*) dataAllocator.allocObjects(
|
|||
|
|
sizeof(*condTable.pConds) * condTable.nCount);
|
|||
|
|
do {
|
|||
|
|
pConds->btCond = getFieldInt("cond");
|
|||
|
|
pConds->nValue = getFieldInt("value");
|
|||
|
|
pConds++;
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CStdItemProvider::readItemReservesTable(CDataAllocator &dataAllocator,
|
|||
|
|
CStdItem::ItemReservesTable &table) {
|
|||
|
|
table.nCount = lua_objlen(m_pLua, -1);
|
|||
|
|
if (enumTableFirst()) {
|
|||
|
|
CStdItem::ItemReserve *pConfigs;
|
|||
|
|
table.pConfigs = pConfigs =
|
|||
|
|
(CStdItem::ItemReserve*) dataAllocator.allocObjects(
|
|||
|
|
sizeof(*table.pConfigs) * table.nCount);
|
|||
|
|
do {
|
|||
|
|
pConfigs->nValue1 = getFieldInt("value1");
|
|||
|
|
pConfigs->nValue2 = getFieldInt("value2");
|
|||
|
|
pConfigs++;
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CStdItemProvider::readCacheData(DWORD dwSrcCRC32, bool bBackLoad) {
|
|||
|
|
#ifdef _DEBUG
|
|||
|
|
CStdItem *pStdItems;
|
|||
|
|
INT_PTR nItemCount;
|
|||
|
|
CStdItemConfigCacher cache;
|
|||
|
|
CDataAllocator allocator;
|
|||
|
|
|
|||
|
|
if ( !cache.LoadFromCache(StdItemCacheFile, dwSrcCRC32, allocator, (void**)&pStdItems, nItemCount) )
|
|||
|
|
return false;
|
|||
|
|
completeRead(pStdItems, nItemCount, allocator, bBackLoad);
|
|||
|
|
return true;
|
|||
|
|
#else
|
|||
|
|
return false;
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CStdItemProvider::saveCacheData(DWORD dwSrcCRC32) {
|
|||
|
|
#ifdef _DEBUG
|
|||
|
|
bool result = false;
|
|||
|
|
const CStdItem *pStdItems = *this;
|
|||
|
|
CStdItemConfigCacher cache;
|
|||
|
|
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
result = cache.SaveToCache(StdItemCacheFile, dwSrcCRC32, m_DataAllocator, pStdItems, count());
|
|||
|
|
if ( !result )
|
|||
|
|
{
|
|||
|
|
showError(_T("save StdItem config data cache failure!"));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (RefString &s)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, s.rawStr());
|
|||
|
|
}
|
|||
|
|
catch (...)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("unexpected error on save StdItem config cache!"));
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
#else
|
|||
|
|
return false;
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CStdItemProvider::showError(LPCTSTR sError) {
|
|||
|
|
m_sLastErrDesc = sError;
|
|||
|
|
RefString s = _T("[StdItemProvider]");
|
|||
|
|
s += sError;
|
|||
|
|
throw s;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CStdItemProvider::LoadSmithData(LPCTSTR sFilePath) {
|
|||
|
|
|
|||
|
|
CMemoryStream ms;
|
|||
|
|
CCustomLuaPreProcessor pp;
|
|||
|
|
|
|||
|
|
bool Result = true;
|
|||
|
|
try {
|
|||
|
|
|
|||
|
|
//从文件加载配置脚本
|
|||
|
|
if (ms.loadFromFile(sFilePath) <= 0)
|
|||
|
|
showErrorFormat(_T("unable to load from %s"), sFilePath);
|
|||
|
|
|
|||
|
|
LPCTSTR sText = pp.parse((LPCTSTR) ms.getMemory(), sFilePath);
|
|||
|
|
|
|||
|
|
//设置脚本内容
|
|||
|
|
if (!setScript(sText)) {
|
|||
|
|
showError(_T("syntax error on StdItem config"));
|
|||
|
|
} else {
|
|||
|
|
CDataAllocator smithDataAllocator;
|
|||
|
|
Result = ReadSmithData(smithDataAllocator);
|
|||
|
|
m_SmithDataAllocator.~CObjectAllocator();
|
|||
|
|
m_SmithDataAllocator = smithDataAllocator;
|
|||
|
|
ZeroMemory(&smithDataAllocator, sizeof(smithDataAllocator));
|
|||
|
|
if (!Result) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
} catch (RefString &s) {
|
|||
|
|
OutputMsg(rmError, _T("load Item smith config error: %s"), s.rawStr());
|
|||
|
|
} catch (...) {
|
|||
|
|
OutputMsg(rmError, _T("unexpected error on mith config config"));
|
|||
|
|
}
|
|||
|
|
//销毁脚本虚拟机
|
|||
|
|
setScript(NULL);
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//读取
|
|||
|
|
bool CStdItemProvider::ReadEquipDerive() {
|
|||
|
|
if (!openGlobalTable("EquipDeriveConfig"))
|
|||
|
|
return false;
|
|||
|
|
INT_PTR nIndex = 0;
|
|||
|
|
CDataAllocator deriveDataAllocator;
|
|||
|
|
if (enumTableFirst()) {
|
|||
|
|
do {
|
|||
|
|
INT_PTR levelIndex = 0; //配置索引
|
|||
|
|
if (enumTableFirst()) {
|
|||
|
|
do {
|
|||
|
|
int nLevel = getFieldInt("level"); //强化效果所需星星数
|
|||
|
|
if (nIndex == 0) //装备强化衍生光效配置
|
|||
|
|
{
|
|||
|
|
int nDefVal = 0;
|
|||
|
|
STARDERIVE star;
|
|||
|
|
star.wStarCount = (WORD) nLevel;
|
|||
|
|
star.wAppear = (WORD) getFieldInt("appear", &nDefVal);
|
|||
|
|
m_starderive.add(star);
|
|||
|
|
}
|
|||
|
|
if (feildTableExists("prop") && openFieldTable("prop")) {
|
|||
|
|
if (nIndex == 0) //装备升星的加成
|
|||
|
|
{
|
|||
|
|
readItemAttributeTable(deriveDataAllocator,
|
|||
|
|
m_starderive[levelIndex++].attriGroup);
|
|||
|
|
} else if (nIndex == 1)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
} else if (nIndex == 2) //橙装的属性加成
|
|||
|
|
{
|
|||
|
|
readItemAttributeTable(deriveDataAllocator,
|
|||
|
|
m_orangeEquipAttr[levelIndex++]);
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
nIndex++;
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
m_DeriveDataAllocator.~CObjectAllocator();
|
|||
|
|
m_DeriveDataAllocator = deriveDataAllocator;
|
|||
|
|
ZeroMemory(&deriveDataAllocator, sizeof(deriveDataAllocator));
|
|||
|
|
closeTable();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CStdItemProvider::ReadQualitdataIndex(CDataAllocator& dataAllocator) {
|
|||
|
|
if (!openGlobalTable("QualityDataIndex")) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
//获取配置中的物品数量
|
|||
|
|
const INT_PTR nCount = lua_objlen(m_pLua, -1);
|
|||
|
|
//如果物品数量为0则输出未配置任何物品的错误
|
|||
|
|
if (nCount <= 0)
|
|||
|
|
showError(_T("no QualitdataIndex on QualityDataIndex"));
|
|||
|
|
INT_PTR nListIndex = 0; //当前遍历的index
|
|||
|
|
m_qualityDataIndexList.count = nCount;
|
|||
|
|
m_qualityDataIndexList.pData = (DataList<int>*) dataAllocator.allocObjects(
|
|||
|
|
nCount * sizeof(DataList<int> ));
|
|||
|
|
if (enumTableFirst()) {
|
|||
|
|
do {
|
|||
|
|
|
|||
|
|
DataList<int>* pIndexList = m_qualityDataIndexList.pData
|
|||
|
|
+ nListIndex;
|
|||
|
|
|
|||
|
|
if (feildTableExists("index") && openFieldTable("index")) {
|
|||
|
|
const INT_PTR nDataCount = lua_objlen(m_pLua, -1);
|
|||
|
|
pIndexList->count = nDataCount;
|
|||
|
|
pIndexList->pData = (int*) dataAllocator.allocObjects(nDataCount * sizeof(int));
|
|||
|
|
if (enumTableFirst()) {
|
|||
|
|
int nDataIndex = 0;
|
|||
|
|
do{
|
|||
|
|
int* pIndex = pIndexList->pData + nDataIndex;
|
|||
|
|
*pIndex = getFieldInt(NULL);
|
|||
|
|
nDataIndex++;
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
// const INT_PTR nDataCount = lua_objlen(m_pLua, -1);
|
|||
|
|
// pIndexList->count = nDataCount;
|
|||
|
|
// pIndexList->pData = (int*) dataAllocator.allocObjects(
|
|||
|
|
// nDataCount * sizeof(int));
|
|||
|
|
// if (enumTableFirst()) {
|
|||
|
|
// int nDataIndex = 0;
|
|||
|
|
|
|||
|
|
// do {
|
|||
|
|
// int* pIndex = pIndexList->pData + nDataIndex;
|
|||
|
|
// *pIndex = getFieldInt(NULL);
|
|||
|
|
// nDataIndex++;
|
|||
|
|
// } while (enumTableNext());
|
|||
|
|
// }
|
|||
|
|
nListIndex++;
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//读取极品属性的数据
|
|||
|
|
bool CStdItemProvider::ReadSmithData(CDataAllocator &dataAllocator) {
|
|||
|
|
if (!ReadQualitdataIndex(dataAllocator)) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (!openGlobalTable("SmithConfig"))
|
|||
|
|
return false;
|
|||
|
|
CBaseList<CStdItem> itemList;
|
|||
|
|
|
|||
|
|
//获取配置中的物品数量
|
|||
|
|
const INT_PTR nSmithCount = lua_objlen(m_pLua, -1);
|
|||
|
|
//如果物品数量为0则输出未配置任何物品的错误
|
|||
|
|
if (nSmithCount <= 0)
|
|||
|
|
showError(_T("no smith data on smith config"));
|
|||
|
|
//申请出物品数据并将物品数据内存块清空
|
|||
|
|
m_smithData.count = nSmithCount;
|
|||
|
|
if (nSmithCount > 0) {
|
|||
|
|
m_smithData.pData =
|
|||
|
|
(DataList<RANDOMATTRTERM>*) dataAllocator.allocObjects(
|
|||
|
|
nSmithCount * sizeof(DataList<RANDOMATTRTERM> ));
|
|||
|
|
} else {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
INT_PTR nIndex = 0; //当前遍历的index
|
|||
|
|
if (enumTableFirst()) {
|
|||
|
|
do {
|
|||
|
|
DataList<RANDOMATTRTERM>* pSmithData = m_smithData.pData + nIndex;
|
|||
|
|
const INT_PTR nItemCount = lua_objlen(m_pLua, -1);
|
|||
|
|
pSmithData->count = nItemCount;
|
|||
|
|
|
|||
|
|
pSmithData->pData = (PRANDOMATTRTERM) dataAllocator.allocObjects(
|
|||
|
|
nItemCount * sizeof(RANDOMATTRTERM));
|
|||
|
|
CRandAttrReader randReader;
|
|||
|
|
if (randReader.readConfig(m_pLua,
|
|||
|
|
(PRANDOMATTRTERM) pSmithData->pData, dataAllocator,
|
|||
|
|
nItemCount) != nItemCount) {
|
|||
|
|
OutputMsg(rmError, "Read Smith%d.txt Error", nIndex);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
nIndex++;
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
DataList<RANDOMATTRTERM> * CStdItemProvider::GetSmithData(int nSmithId) {
|
|||
|
|
if (nSmithId == 0 || nSmithId >= m_smithData.count)
|
|||
|
|
return NULL;
|
|||
|
|
return m_smithData.pData + nSmithId;
|
|||
|
|
}
|
|||
|
|
DataList<int>* CStdItemProvider::GetQualityIndexList(int nIndex) {
|
|||
|
|
if (nIndex <= 0 || nIndex > m_qualityDataIndexList.count) {
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
return m_qualityDataIndexList.pData + nIndex - 1;
|
|||
|
|
}
|
|||
|
|
bool CStdItemProvider::ReadItemEval() {
|
|||
|
|
|
|||
|
|
if (!openGlobalTable("EquipValuation"))
|
|||
|
|
return false;
|
|||
|
|
for (INT_PTR i = 0; i < enMaxVocCount - 1; i++) {
|
|||
|
|
m_evals[i].reset();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
INT_PTR i = 0;
|
|||
|
|
if (enumTableFirst()) {
|
|||
|
|
do {
|
|||
|
|
if (enumTableFirst()) {
|
|||
|
|
do {
|
|||
|
|
tagGameAttribute attr;
|
|||
|
|
attr.type = (BYTE) getFieldInt("attrId");
|
|||
|
|
attr.value.fValue = (float) getFieldNumber("unitVal");
|
|||
|
|
|
|||
|
|
m_evals[i] << attr;
|
|||
|
|
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
i++;
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
closeTable();
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CStdItemProvider::AddItemOutPutCount(INT_PTR wItemId, int nCount,
|
|||
|
|
const INT_PTR nLogIdent) {
|
|||
|
|
bool bNeedSave = false;
|
|||
|
|
|
|||
|
|
switch (nLogIdent) {
|
|||
|
|
case GameLog::clKillMonsterItem: //杀怪获得物品
|
|||
|
|
case GameLog::clBuyItem: //用户从NPC商店购买物品
|
|||
|
|
case GameLog::clAchieveRewardItem: //成就奖励物品
|
|||
|
|
case GameLog::clQuestGiveItem: //任务奖励物品
|
|||
|
|
case GameLog::clBuyStoreItem: //购买商城物品
|
|||
|
|
bNeedSave = true;
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
default:
|
|||
|
|
bNeedSave = false;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!bNeedSave)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
if (wItemId > 0 && wItemId < Inherited::count()) {
|
|||
|
|
CStdItem* stdItem = &(this->operator CStdItem*()[wItemId]);
|
|||
|
|
if (stdItem) {
|
|||
|
|
stdItem->m_DropCount += nCount;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CStdItemProvider::SendItemOutPutToLog() {
|
|||
|
|
// for (INT_PTR i = 0; i < Inherited::count(); i++) {
|
|||
|
|
// const CStdItem* pItem = &(this->operator CStdItem*()[i]);
|
|||
|
|
// if (pItem && pItem->m_DropCount > 0) {
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CStdItemProvider::LoadGodStoveConfig(LPCTSTR sFilePath) {
|
|||
|
|
CMemoryStream ms;
|
|||
|
|
CCustomLuaPreProcessor pp;
|
|||
|
|
|
|||
|
|
bool Result = true;
|
|||
|
|
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 StdItem config"));
|
|||
|
|
} else {
|
|||
|
|
CDataAllocator dataAllocator;
|
|||
|
|
Result = ReadGodStoveConfig(dataAllocator);
|
|||
|
|
m_EquipPosStrongAllocator.~CObjectAllocator();
|
|||
|
|
m_EquipPosStrongAllocator = dataAllocator;
|
|||
|
|
ZeroMemory(&dataAllocator, sizeof(dataAllocator));
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
} catch (RefString &s) {
|
|||
|
|
OutputMsg(rmError, _T("load GodStoveStrongConfig error: %s"),
|
|||
|
|
s.rawStr());
|
|||
|
|
} catch (...) {
|
|||
|
|
OutputMsg(rmError, _T("unexpected error on GodStoveConfig "));
|
|||
|
|
}
|
|||
|
|
//销毁脚本虚拟机
|
|||
|
|
setScript(NULL);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CStdItemProvider::ReadGodStoveConfig(CDataAllocator& dataAllocator) {
|
|||
|
|
if (!openGlobalTable("GodStoveConfig")) {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
//宝石属性衍生属性加成
|
|||
|
|
if (feildTableExists("GodStoveDeriveConfig")
|
|||
|
|
&& openFieldTable("GodStoveDeriveConfig")) {
|
|||
|
|
//const INT_PTR count = lua_objlen(m_pLua, -1);
|
|||
|
|
if ( enumTableFirst()) {
|
|||
|
|
do {
|
|||
|
|
GODSTOVEDERIVE derive;
|
|||
|
|
derive.nLevel = getFieldInt("level");
|
|||
|
|
if (feildTableExists("prop") && openFieldTable("prop")) {
|
|||
|
|
readItemAttributeTable(dataAllocator, derive.attriGroup);
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
m_godStoveDerive.add(derive);
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CStdItem::AttributeGroup* CStdItemProvider::GetGodStoveDeriveAttrByLevel(
|
|||
|
|
INT_PTR nLevel) {
|
|||
|
|
for (INT_PTR i = m_godStoveDerive.count() - 1; i >= 0; i--) {
|
|||
|
|
GODSTOVEDERIVE& derive = m_godStoveDerive[i];
|
|||
|
|
if (nLevel >= derive.nLevel) {
|
|||
|
|
return &derive.attriGroup;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CStdItemProvider::LoadComposeConfig(LPCTSTR sFilePath) {
|
|||
|
|
CMemoryStream ms;
|
|||
|
|
CCustomLuaPreProcessor pp;
|
|||
|
|
|
|||
|
|
bool Result = true;
|
|||
|
|
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 StdItem config"));
|
|||
|
|
} else {
|
|||
|
|
ReadItemCompose();
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
} catch (RefString &s) {
|
|||
|
|
OutputMsg(rmError, _T("LoadComposeConfig error: %s"),
|
|||
|
|
s.rawStr());
|
|||
|
|
Result = false;
|
|||
|
|
} catch (...) {
|
|||
|
|
OutputMsg(rmError, _T("unexpected error on ComposeConfig "));
|
|||
|
|
Result = false;
|
|||
|
|
}
|
|||
|
|
//销毁脚本虚拟机
|
|||
|
|
setScript(NULL);
|
|||
|
|
return Result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CStdItemProvider::LoadForgeConfig(LPCTSTR sFilePath) {
|
|||
|
|
CMemoryStream ms;
|
|||
|
|
CCustomLuaPreProcessor pp;
|
|||
|
|
|
|||
|
|
bool Result = true;
|
|||
|
|
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 StdItem config"));
|
|||
|
|
} else {
|
|||
|
|
ReadItemForge();
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
} catch (RefString &s) {
|
|||
|
|
OutputMsg(rmError, _T("load GodStoveStrongConfig error: %s"),
|
|||
|
|
s.rawStr());
|
|||
|
|
} catch (...) {
|
|||
|
|
OutputMsg(rmError, _T("unexpected error on GodStoveConfig "));
|
|||
|
|
}
|
|||
|
|
//销毁脚本虚拟机
|
|||
|
|
setScript(NULL);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CStdItemProvider::LoadAttri(PGAMEATTR pAttr, LPCSTR reserve0Name)
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
pAttr->type = getFieldInt("type");
|
|||
|
|
//
|
|||
|
|
if ( pAttr->type < aUndefined || pAttr->type >= GameAttributeCount )
|
|||
|
|
{
|
|||
|
|
showErrorFormat(_T("LoadAttri type config error %d"),pAttr->type);
|
|||
|
|
}
|
|||
|
|
switch(AttrDataTypes[pAttr->type])
|
|||
|
|
{
|
|||
|
|
case adSmall:
|
|||
|
|
case adShort:
|
|||
|
|
case adInt:
|
|||
|
|
pAttr->value.nValue = getFieldInt("value");
|
|||
|
|
break;
|
|||
|
|
case adUSmall:
|
|||
|
|
case adUShort:
|
|||
|
|
case adUInt:
|
|||
|
|
pAttr->value.uValue = (UINT)getFieldInt64("value");
|
|||
|
|
break;
|
|||
|
|
case adFloat:
|
|||
|
|
pAttr->value.fValue = (float)getFieldNumber("value");
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
int nDef =0;
|
|||
|
|
if (reserve0Name)
|
|||
|
|
{
|
|||
|
|
pAttr->reserve[0] = getFieldInt(reserve0Name,&nDef);
|
|||
|
|
}
|
|||
|
|
++pAttr;
|
|||
|
|
}while(enumTableNext());
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
bool CStdItemProvider::LoadSuitItemConfig(LPCTSTR sFilePath) {
|
|||
|
|
CMemoryStream ms;
|
|||
|
|
CCustomLuaPreProcessor pp;
|
|||
|
|
|
|||
|
|
bool Result = true;
|
|||
|
|
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 StdItem config"));
|
|||
|
|
} else {
|
|||
|
|
ReadSuitItem();
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
} catch (RefString &s) {
|
|||
|
|
OutputMsg(rmError, _T("load ReadSuitItem error: %s"),
|
|||
|
|
s.rawStr());
|
|||
|
|
} catch (...) {
|
|||
|
|
OutputMsg(rmError, _T("unexpected error on ReadSuitItem "));
|
|||
|
|
}
|
|||
|
|
//销毁脚本虚拟机
|
|||
|
|
setScript(NULL);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
void CStdItemProvider::ReadSuitItem()
|
|||
|
|
{
|
|||
|
|
if(!openGlobalTable("SuitItemCfg"))
|
|||
|
|
return;
|
|||
|
|
int nDef = 0;
|
|||
|
|
if(enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
SuitAttr suit;
|
|||
|
|
suit.nSuitId = getFieldInt("suitid", &nDef);
|
|||
|
|
suit.nSuitNum = getFieldInt("suitnum", &nDef);
|
|||
|
|
suit.nPercent = getFieldInt("percent", &nDef);
|
|||
|
|
getFieldStringBuffer("name", suit.name, sizeof(suit.name));
|
|||
|
|
int nKey = suit.nSuitId *100 + suit.nSuitNum;
|
|||
|
|
m_SuitAttrs[nKey] = suit;
|
|||
|
|
SuitAttr* arrCfg = &m_SuitAttrs[nKey];
|
|||
|
|
if(arrCfg) {
|
|||
|
|
if(feildTableExists("attr") && openFieldTable("attr"))
|
|||
|
|
{
|
|||
|
|
int nCount = (int)lua_objlen(m_pLua,-1);
|
|||
|
|
PGAMEATTR pAttr = NULL;
|
|||
|
|
arrCfg->attri.nCount = nCount;
|
|||
|
|
if(nCount > 0)
|
|||
|
|
{
|
|||
|
|
arrCfg->attri.pAttrs = (PGAMEATTR)m_SuitAttrDataAllocator.allocObjects(sizeof(GAMEATTR) * nCount);
|
|||
|
|
ZeroMemory(arrCfg->attri.pAttrs, sizeof(GAMEATTR) * nCount);
|
|||
|
|
pAttr = arrCfg->attri.pAttrs;
|
|||
|
|
}
|
|||
|
|
if(enumTableFirst())
|
|||
|
|
{
|
|||
|
|
if(!LoadAttri(pAttr))
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
pAttr++;
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
bool CStdItemProvider::LoadNumericalConfig(LPCTSTR sFilePath) {
|
|||
|
|
CMemoryStream ms;
|
|||
|
|
CCustomLuaPreProcessor pp;
|
|||
|
|
|
|||
|
|
bool Result = true;
|
|||
|
|
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 StdItem config"));
|
|||
|
|
} else {
|
|||
|
|
ReadNumerical();
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
} catch (RefString &s) {
|
|||
|
|
OutputMsg(rmError, _T("load ReadNumerical error: %s"),
|
|||
|
|
s.rawStr());
|
|||
|
|
} catch (...) {
|
|||
|
|
OutputMsg(rmError, _T("unexpected error on ReadNumerical "));
|
|||
|
|
}
|
|||
|
|
//销毁脚本虚拟机
|
|||
|
|
setScript(NULL);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
void CStdItemProvider::ReadNumerical()
|
|||
|
|
{
|
|||
|
|
if(!openGlobalTable("NumericalIcon"))
|
|||
|
|
return;
|
|||
|
|
int nDef = 0;
|
|||
|
|
if(enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
SourceConfig config;
|
|||
|
|
config.nId = getFieldInt("id", &nDef);
|
|||
|
|
getFieldStringBuffer("name", config.name, sizeof(config.name));
|
|||
|
|
m_SourceConfigs[config.nId] = config;
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
SuitAttr* CStdItemProvider::getSuitPtrDataByKey(int nSuitId, int nSuitNum)
|
|||
|
|
{
|
|||
|
|
int nKey =nSuitId *100 + nSuitNum;
|
|||
|
|
std::map<int , SuitAttr>::iterator it = m_SuitAttrs.find(nKey);
|
|||
|
|
if( it != m_SuitAttrs.end())
|
|||
|
|
{
|
|||
|
|
return &(it->second);
|
|||
|
|
}
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
bool CStdItemProvider::SuitIsExists(int nKey)
|
|||
|
|
{
|
|||
|
|
std::map<int , SuitAttr>::iterator it = m_SuitAttrs.find(nKey);
|
|||
|
|
if( it != m_SuitAttrs.end())
|
|||
|
|
{
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CStdItemProvider::LoadRecoverItemConfig(LPCTSTR sFilePath) {
|
|||
|
|
CMemoryStream ms;
|
|||
|
|
CCustomLuaPreProcessor pp;
|
|||
|
|
|
|||
|
|
bool Result = true;
|
|||
|
|
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 RecoverItem config"));
|
|||
|
|
} else {
|
|||
|
|
ReadRecoverItemConfig();
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
} catch (RefString &s) {
|
|||
|
|
OutputMsg(rmError, _T("load RecoverItemConfig error: %s"),
|
|||
|
|
s.rawStr());
|
|||
|
|
} catch (...) {
|
|||
|
|
OutputMsg(rmError, _T("unexpected error on RecoverItemConfig "));
|
|||
|
|
}
|
|||
|
|
//销毁脚本虚拟机
|
|||
|
|
setScript(NULL);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
void CStdItemProvider::ReadRecoverItemConfig()
|
|||
|
|
{
|
|||
|
|
if (!openGlobalTable("YBrecoverConfig"))
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
int nDef = 0;
|
|||
|
|
|
|||
|
|
if(enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
ItemRecoverCfg recover;
|
|||
|
|
recover.nId = getFieldInt("id", &nDef);
|
|||
|
|
recover.nTimesLimit = getFieldInt("timeslimit", &nDef);
|
|||
|
|
recover.nTimeLimit = getFieldInt("daylimit", &nDef);
|
|||
|
|
recover.nRightLimt = getFieldInt("privilegelimit", &nDef);
|
|||
|
|
if(feildTableExists("item") && openFieldTable("item"))
|
|||
|
|
{
|
|||
|
|
if(enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
ComposeTableCfg tf;
|
|||
|
|
tf.nType = getFieldInt("type");
|
|||
|
|
tf.nCount = getFieldInt("count");
|
|||
|
|
tf.nId = getFieldInt("id");
|
|||
|
|
recover.cost.push_back(tf);
|
|||
|
|
}while(enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(feildTableExists("privilegeaward") && openFieldTable("privilegeaward"))
|
|||
|
|
{
|
|||
|
|
if(enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
int nType = getFieldInt("type");
|
|||
|
|
if(feildTableExists("award") && openFieldTable("award"))
|
|||
|
|
{
|
|||
|
|
if(enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
ComposeTableCfg tf;
|
|||
|
|
tf.nType = getFieldInt("type");
|
|||
|
|
tf.nCount = getFieldInt("count");
|
|||
|
|
tf.nId = getFieldInt("id");
|
|||
|
|
recover.nAwards[nType].push_back(tf);
|
|||
|
|
}while(enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
}while(enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(feildTableExists("recoverlimit") && openFieldTable("recoverlimit"))
|
|||
|
|
{
|
|||
|
|
recover.nLevelLimt = getFieldInt("level", &nDef);
|
|||
|
|
recover.nCircle = getFieldInt("zsLevel", &nDef);
|
|||
|
|
recover.nOpenServerDay = getFieldInt("openDay", &nDef);
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
m_recoverLists[recover.nId] = recover;
|
|||
|
|
}while(enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
bool CStdItemProvider::LoadWarehousemConfig(LPCTSTR sFilePath) {
|
|||
|
|
CMemoryStream ms;
|
|||
|
|
CCustomLuaPreProcessor pp;
|
|||
|
|
|
|||
|
|
bool Result = true;
|
|||
|
|
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 ReadWarehouse config"));
|
|||
|
|
} else {
|
|||
|
|
ReadWarehouse();
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
} catch (RefString &s) {
|
|||
|
|
OutputMsg(rmError, _T("load ReadWarehouse error: %s"),
|
|||
|
|
s.rawStr());
|
|||
|
|
} catch (...) {
|
|||
|
|
OutputMsg(rmError, _T("unexpected error on ReadWarehouse "));
|
|||
|
|
}
|
|||
|
|
//销毁脚本虚拟机
|
|||
|
|
setScript(NULL);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//仓库
|
|||
|
|
void CStdItemProvider::ReadWarehouse()
|
|||
|
|
{
|
|||
|
|
if (!openGlobalTable("WarehouseConfig"))
|
|||
|
|
return;
|
|||
|
|
int nDef = 0;
|
|||
|
|
if(feildTableExists("openprivilege") && openFieldTable("openprivilege"))
|
|||
|
|
{
|
|||
|
|
m_WarehouseCfg.nOpenLevel = getFieldInt("openlevel", &nDef);
|
|||
|
|
m_WarehouseCfg.nOpenCardLv = getFieldInt("vip", &nDef);
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
m_WarehouseCfg.nInitial = getFieldInt("initial", &nDef);
|
|||
|
|
if(feildTableExists("warehouses") && openFieldTable("warehouses"))
|
|||
|
|
{
|
|||
|
|
INT_PTR count = lua_objlen(m_pLua, -1);
|
|||
|
|
if(count <= 0)
|
|||
|
|
return;
|
|||
|
|
count += 1;
|
|||
|
|
std::vector<int> lists(count, 0);
|
|||
|
|
if(enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
int nCount = getFieldInt("count", &nDef);
|
|||
|
|
int nCardlv = getFieldInt("vip", &nDef);
|
|||
|
|
lists[nCardlv] = nCount;
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
m_WarehouseCfg.v_warehouses = lists;
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
}
|