This commit is contained in:
aixianling
2025-01-09 17:45:40 +08:00
commit 5c9f1dae4a
3482 changed files with 1146531 additions and 0 deletions

View File

@@ -0,0 +1,858 @@
#include "StdAfx.h"
#include "EnvirConfig.h"
CBufferAllocator* CEnvirConfig::m_pAllocator = NULL;
typedef int (*compfn)(const void*, const void*);
int compare(int* q1, int* q2)
{
if ( *q1 < *q2)
return -1;
else if (*q1 > *q2)
return 1;
else
return 0;
}
CEnvirConfig::CEnvirConfig() : m_DataAllocator(_T("EnvirConfigAlloc"))
{
}
CEnvirConfig::~CEnvirConfig()
{
}
bool CEnvirConfig::LoadConfig(LPCTSTR sFileName)
{
bool result = TRUE;
LPCTSTR sResult = NULL;
wylib::stream::CMemoryStream ms;
CCustomLuaPreProcessor pp;
try
{
//OutputMsg(rmTip,_T("开始装载配置"));
GetLogicServer()->GetVSPDefine().RegisteToPreprocessor(pp);
if ( ms.loadFromFile(sFileName) > 0 )
{
sResult = pp.parse((LPCTSTR)ms.getMemory(), sFileName);
}
if (sResult ==NULL)
{
OutputMsg(rmError,_T("预处理文件%s失败"),sFileName);
result = FALSE;
}
if ( !setScript(sResult) )
{
OutputMsg(rmError,_T("读取预处理后的配置文件失败"));
result = FALSE;
}
if (result)
{
//OutputMsg(rmTip,_T("装载配置ok"));
if (LoadSceneConfig())
{
//OutputMsg(rmTip,_T("装载地图场景配置ok"));
}
else
{
//OutputMsg(rmError,_T("装载地图场景配置失败!"));
result = FALSE;
}
m_pAllocator->CheckFreeBuffers(true); //强制把一些没必要的内存释放掉
}
}
catch (RefString &s)
{
OutputMsg(rmError, _T("load Envir config error: %s"), s.rawStr());
result = FALSE;
FILE* fp = fopen("scripterror.txt", "wb");
if (fp)
{
fputs(sResult, fp);
fclose(fp);
}
}
catch (...)
{
OutputMsg(rmError, _T("unexpected error on load Envir config"));
result = FALSE;
}
//销毁脚本虚拟机
setScript(NULL);
m_pAllocator->CheckFreeBuffers(true);
return result;
}
bool CEnvirConfig::LoadSceneConfig()
{
//场景配置表
int s_nSceneCount = 0;
SCENECONFIG* s_pSceneConfig = NULL;
if (openGlobalTable("Scenes"))
{
s_nSceneCount = (int)lua_objlen(m_pLua, -1);
if (s_nSceneCount > 0)
{
int nSize = sizeof(SCENECONFIG) * s_nSceneCount;
s_pSceneConfig = (SCENECONFIG*)m_DataAllocator.allocObjects(nSize);
ZeroMemory(s_pSceneConfig,nSize);
}
int nFuBenScenePos = 0;
int nSceneId = 0;
if (enumTableFirst())
{
do
{
nSceneId = getFieldInt("sceneid");
nFuBenScenePos = nSceneId - 1;
if (nSceneId == 0)
{
continue;
}
if (nFuBenScenePos >= s_nSceneCount || nFuBenScenePos < 0)
{
OutputMsg(rmError,_T("load scene id error!nSceneId=%d"),nSceneId);
return false;
}
SCENECONFIG* sceneConf = s_pSceneConfig + nFuBenScenePos;
sceneConf->nScenceId = nSceneId;
int nDef =0;
bool boDef = false;
bool bMaxAnger = false;
bool bBroadcast = false;
sceneConf->nDefaultX = getFieldInt("defaultX",&nDef);
sceneConf->nDefaultY = getFieldInt("defaultY",&nDef);
sceneConf->boCanCall = getFieldInt("iscall", &nDef);
//场景的类型
sceneConf->bSceneType = getFieldInt("sceneType",&nDef);
sceneConf->nMapGgroup = getFieldInt("mapGgroup",&nDef);
sceneConf->bIsNoPickUp = getFieldInt("isNoPickUp",&nDef);
getFieldStringBuffer("scencename",sceneConf->szScenceName,ArrayCount(sceneConf->szScenceName));
getFieldStringBuffer("mapfilename",sceneConf->szMapFileName,ArrayCount(sceneConf->szMapFileName));
//读取刷怪配置
if(!LoadRefreshConfig(sceneConf))
{
OutputMsg(rmError,_T("load scene monster error!sceneid=%d,scenename=%s"),sceneConf->nScenceId,sceneConf->szScenceName);
return false;
}
//读取区域配置
if (!LoadAreasConfig(sceneConf))
{
OutputMsg(rmError,_T("load scene area error!sceneid=%d,scenename=%s"),sceneConf->nScenceId,sceneConf->szScenceName);
return false;
}
//读取npc
if(!LoadNpcConfig(sceneConf))
{
OutputMsg(rmError,_T("load scene Npc error!sceneid=%d,scenename=%s"),sceneConf->nScenceId,sceneConf->szScenceName);
return false;
}
//teleport传送点
if (!LoadTelePortConfig(sceneConf))
{
OutputMsg(rmError,_T("load scene Teleport error!sceneid=%d,scenename=%s"),sceneConf->nScenceId,sceneConf->szScenceName);
return false;
}
} while (enumTableNext());
}
} else return FALSE;
//GOODS_TAG DefConsumeList[3]={ {-1,-1,-1},{-1,-1,-1},{-1,-1,-1} };
//副本配置表
if (openGlobalTable("StaticFubens"))
{
int nDef_0 = 0;
int nDef_1 = 1;
int nDef_f1 = -1;
bool bDef_true = false;
int nCount = (int)lua_objlen(m_pLua,-1);
//读取每个副本的配置
for (size_t i = 0; i <= nCount; i++)
{
if (!getFieldIndexTable(i)) return false;
COMMONFUBENCONFIG* fuben = (COMMONFUBENCONFIG*)m_DataAllocator.allocObjects(sizeof(COMMONFUBENCONFIG));
fuben->nFbId = getFieldInt("fbid"); //副本ID
fuben->nFbConfType = getFieldInt("fbConfType",&nDef_0); //副本类型
memset(fuben->fbName, 0, sizeof(fuben->fbName));
getFieldStringBuffer(("fbname"),fuben->fbName,sizeof(fuben->fbName));
fuben->nFbEnterType = getFieldInt("enterType",&nDef_0); //副本进入类型
fuben->nRecommandLevel = getFieldInt("recommandLevel",&nDef_1); //推荐等级
fuben->bDisableMonsterPropAdjust = getFieldBoolean("disableMonsterPropAdjust", &bDef_true); //是否禁止动态更新怪物属性
fuben->nDestoryTime = getFieldInt("destoryTime",&nDef_0); //当副本没人时销毁时间
fuben->nDefSceneId = getFieldInt("defSceneID",&nDef_0); //进入默认场景id
memset(fuben->ConsumeList, -1, sizeof(fuben->ConsumeList));
if (feildTableExists("consumeList") && openFieldTable("consumeList"))
{
if (enumTableFirst())
{
int i = 0;
do
{
if (i >= sizeof(fuben->ConsumeList)/sizeof(GOODS_TAG)) break;
fuben->ConsumeList[i].type = getFieldInt("type", &nDef_f1);
fuben->ConsumeList[i].id = getFieldInt("id", &nDef_f1);
fuben->ConsumeList[i].count = getFieldInt("count", &nDef_f1);
i++;
} while (enumTableNext());
}
closeTable();
}
CFuBenManager* fbMgr = GetGlobalLogicEngine()->GetFuBenMgr();
CFuBenHandle hHandle;
CFuBen* pFuBen = CFuBenManager::m_FuBenMgr->Acquire(hHandle);
fbMgr->AddStaticFuBen(pFuBen);
pFuBen->SetFbId(fuben->nFbId);
pFuBen->SetHandle(hHandle);//
pFuBen->SetConfig(fuben);
//读入场景信息
pFuBen->m_vSceneConfig = (SceneConfigList*)m_DataAllocator.allocObjects(sizeof(SceneConfigList));
ZeroMemory(pFuBen->m_vSceneConfig,sizeof(SceneConfigList));
//第一个副本,含括所有场景
if (fuben->nFbId == 0)
{
pFuBen->m_vSceneConfig->nCount = s_nSceneCount;
pFuBen->Init();
if (pFuBen->m_vSceneConfig->nCount > 0)
{
int nSize = sizeof(pSCENECONFIG) * pFuBen->m_vSceneConfig->nCount;
pFuBen->m_vSceneConfig->ppList = (SCENECONFIG**)m_DataAllocator.allocObjects(nSize);
ZeroMemory(pFuBen->m_vSceneConfig->ppList, nSize);
}
for (size_t i = 0; i < pFuBen->m_vSceneConfig->nCount; i++)
{
//设置指针
SCENECONFIG* sceneConf = s_pSceneConfig + i;
*(pFuBen->m_vSceneConfig->ppList + i) = sceneConf;
//创建场景实例
if (!pFuBen->AddStaticScene(sceneConf,fbMgr,m_DataAllocator))
{
OutputMsg(rmError, _T("load fuben error!fubenid=%d"), fuben->nFbId);
return FALSE;
}
}
}
//其他副本
else
{
if (openFieldTable("scenes"))
{
pFuBen->m_vSceneConfig->nCount = (int)lua_objlen(m_pLua, -1);
pFuBen->Init();
if (pFuBen->m_vSceneConfig->nCount > 0)
{
int nSize = sizeof(pSCENECONFIG) * pFuBen->m_vSceneConfig->nCount;
pFuBen->m_vSceneConfig->ppList = (SCENECONFIG**)m_DataAllocator.allocObjects(nSize);
ZeroMemory(pFuBen->m_vSceneConfig->ppList, nSize);
}
if (enumTableFirst())
{
int i = 0;
do {
int sceneid = getFieldInt(NULL);
int nFuBenScenePos = sceneid - 1;
if (nFuBenScenePos >= s_nSceneCount || nFuBenScenePos < 0)
{
OutputMsg(rmError, _T("load fuben error!fubenid=%d,scene=%d"), fuben->nFbId, sceneid);
return FALSE;
}
if (fuben->nDefSceneId == 0)
{
fuben->nDefSceneId = sceneid;
}
//设置指针
SCENECONFIG* sceneConf = s_pSceneConfig + nFuBenScenePos;
*(pFuBen->m_vSceneConfig->ppList + i) = sceneConf;
//重复场景检测
if (pFuBen->HasScene(sceneConf->nScenceId))
{
OutputMsg(rmError,_T("It is the Same Scene id!sceneid=%d"),sceneConf->nScenceId);
return FALSE;
}
else
{
OutputMsg(rmTip,"load scene,id=%d",sceneConf->nScenceId);
}
//创建场景实例
if (!pFuBen->AddStaticScene(sceneConf,fbMgr,m_DataAllocator))
{
OutputMsg(rmError, _T("load fuben error!fubenid=%d"), fuben->nFbId);
return FALSE;
}
i++;
}while (enumTableNext());
}
closeTable();//close scene
} else return FALSE;
}
closeTable();//end StaticFubens[i]
}
closeTable();//close FuBen
} else return FALSE;
GetGlobalLogicEngine()->GetFuBenMgr()->CreateFreeFb();
return true;
}
void CEnvirConfig::showError(LPCTSTR sError)
{
m_sLastErrDesc = sError;
RefString s = _T("[Config Error]");
s += sError;
throw s;
}
//读取刷怪配置
bool CEnvirConfig::LoadRefreshConfig( SCENECONFIG* sceneConf )
{
if (!openFieldTable("refresh"))
{
return FALSE;
}
sceneConf->vRefreshList.nCount = (int)lua_objlen(m_pLua, -1);
if (sceneConf->vRefreshList.nCount > 0)
{
int nSize = sizeof(REFRESHCONFIG)*sceneConf->vRefreshList.nCount;
sceneConf->vRefreshList.pList = (REFRESHCONFIG*)m_DataAllocator.allocObjects(nSize);
ZeroMemory(sceneConf->vRefreshList.pList,nSize);
}
int refreshPos = 0;
if (enumTableFirst())
{
do
{
REFRESHCONFIG* refreshData = sceneConf->vRefreshList.pList + refreshPos;
refreshData->nCount = getFieldInt("count");
refreshData->nNextRefreshTime = getFieldInt("time"); //每次刷怪的时间
if (refreshData->nNextRefreshTime < 0)
{
refreshData->nNextRefreshTime = MAXINT;//只刷一次
}
refreshData->nFirstTime = getFieldInt("firstTime");
refreshData->nNextRefreshTime = refreshData->nNextRefreshTime * 1000;//这个单位是秒
refreshData->nFirstTime = refreshData->nFirstTime * 1000;//这个单位是秒
/*
int nPosX1 = getFieldInt("mapx1");
int nPosX2 = getFieldInt("mapx2",&nPosX1);
int nPosY1 = getFieldInt("mapy1");
int nPosY2 = getFieldInt("mapy2",&nPosY1);
if (nPosX1 > nPosX2 || nPosY1 > nPosY2)
{
OutputMsg(rmError,",sceneid=%d,point error,mapx1 > mapx2 or mapy1> mapy2, mapx1=%d,mapx2=%d,mapy1=%d,mapy2=%d",
sceneConf->nScenceId,nPosX1,nPosX2,nPosY1,nPosY2);
return false;
}
*/
//refreshData->nEntityType = getFieldInt("entitytype");
refreshData->nEntityId = getFieldInt("entityid");
refreshData->nMobX = getFieldInt("x");
refreshData->nMobY = getFieldInt("y");
refreshData->nMobRange = getFieldInt("range");
int nDef = 0;
refreshData->nLiveTime = getFieldInt("livetime",&nDef);
char sMapFullBuff[40]; //地图文件的全名
sprintf(sMapFullBuff,"data/map/%s",sceneConf->szMapFileName);
CAbstractMap* pMap = GetGlobalLogicEngine()->GetFuBenMgr()->GetMapData(sMapFullBuff);
if (!pMap)
{
OutputMsg(rmError,"Map File Is NULL!filename=%s",sceneConf->szMapFileName);
return false;
}
/*
refreshData->nPointsCount = 0;
refreshData->Points = (MAPPOINT*)m_DataAllocator.allocObjects(sizeof(MAPPOINT)*(nPosX2-nPosX1+1) * (nPosY2-nPosY1+1) );
for (int x = nPosX1; x <= nPosX2; x++)
{
for(int y=nPosY1; y <= nPosY2; y ++ )
if (pMap->canMove((DWORD)x, (DWORD)y))
{
MAPPOINT p;
p.x = (int)x;
p.y = (int)y;
refreshData->Points[refreshData->nPointsCount] = p;
refreshData->nPointsCount++;
}
}
if (refreshData->nPointsCount <= 0)
{
//全部刷怪点都无效
OutputMsg(rmError,"Monster Refresh Config Error!filename=%s,sceneid=%d,refresh Point=%d,x=%d,y=%d",sceneConf->szMapFileName,sceneConf->nScenceId,refreshPos,(int)nPosX1,(int)nPosX2);
return false;
}
*/
refreshPos++;
} while (enumTableNext());
}
closeTable();//close Refresh
return true;
}
//读区域配置
bool CEnvirConfig::LoadAreasConfig( SCENECONFIG* sceneConf )
{
//读取特殊区域列表
if (!openFieldTable("area"))
{
OutputMsg(rmError,_T("Scene Config Open area table error!sceneid=%d"),sceneConf->nScenceId);
return FALSE;
}
sceneConf->vAreaList.nCount = (int)lua_objlen(m_pLua, -1) + 1;
if (sceneConf->vAreaList.nCount > 0)
{
int nSize = sizeof(SCENEAREA)*sceneConf->vAreaList.nCount;
sceneConf->vAreaList.pList = (SCENEAREA*)m_DataAllocator.allocObjects(nSize);
ZeroMemory(sceneConf->vAreaList.pList,nSize);
//第0个默认属性
SCENEAREA* area = sceneConf->vAreaList.pList;
ZeroMemory(area,sizeof(SCENEAREA));
area->boInherit = false;
area->szName[0] = 0;
area->NoTips = (byte) 1;
// 默认全局区域
{
char sMapFullBuff[40]; //地图文件的全名
sprintf(sMapFullBuff,"data/map/%s",sceneConf->szMapFileName);
CAbstractMap* pMap = GetGlobalLogicEngine()->GetFuBenMgr()->GetMapData(sMapFullBuff);
if (!pMap)
{
OutputMsg(rmError,"Map File Is NULL!filename=%s",sceneConf->szMapFileName);
return false;
}
area->nPointCount = 4;
area->lpPoints= (LPPOINT)m_DataAllocator.allocObjects(sizeof(area->lpPoints[0])*4);
area->lpPoints[0].x = 0;
area->lpPoints[0].y = 0;
area->lpPoints[1].x = pMap->m_dwWidth;
area->lpPoints[1].y = 0;
area->lpPoints[2].x = pMap->m_dwWidth;
area->lpPoints[2].y = pMap->m_dwHeight;
area->lpPoints[3].x = 0;
area->lpPoints[3].y = pMap->m_dwHeight;
}
// 默认全局区域中心点
{
area->Center[0] = sceneConf->nDefaultX;
area->Center[1] = sceneConf->nDefaultY;
}
// 默认全局区域无属性
area->attri[0].bType = 0;
area->attri[0].nCount = 0;
}
else
{
OutputMsg(rmTip,_T("Scene area config is NULL!sceneid=%d"),sceneConf->nScenceId);
sceneConf->vAreaList.pList = nullptr;
closeTable();
return TRUE;
}
int nAreaPos = 1;
if (enumTableFirst())
{
do
{
SCENEAREA* area = sceneConf->vAreaList.pList + nAreaPos;
ZeroMemory(area,sizeof(SCENEAREA));
nAreaPos++;
area->szName[0] = 0;
getFieldStringBuffer("name",area->szName,ArrayCount(area->szName));
int nDef = 0;
area->NoTips = (byte)getFieldInt("notips", &nDef);
if (area->szName[0] == 0)
{
OutputMsg(rmError,_T("Scene area name is NULL!sceneid=%d,areapos=%d"),sceneConf->nScenceId,nAreaPos);
return false;
}
if (nAreaPos == 0)
{
area->boInherit = false;
}
else
{
bool boDefault = true;
area->boInherit = getFieldBoolean("inherit",&boDefault);
}
if(! LoadAreaRangeConfig(sceneConf, area))
{
return false;
}
if (!LoadAreaCenterConfig(sceneConf, area))
{
return false;
}
if(!LoadAreaAttriConfig(sceneConf, area))
{
return false;
}
} while (enumTableNext());
}
closeTable();
if (sceneConf->vAreaList.nCount <= 0)
{
OutputMsg(rmError,"load scene config error!range is NULL!sceneid=%d",sceneConf->nScenceId);
return false;
}
return true;
}
bool CEnvirConfig::LoadAreaRangeConfig( SCENECONFIG* sceneConf, SCENEAREA* area )
{
if ( !openFieldTable("range") )
{
OutputMsg(rmError,_T("Scene Config Open range table error!sceneid=%d"),sceneConf->nScenceId);
return false;
}
area->nPointCount = (int)lua_objlen(m_pLua, -1);
if (area->nPointCount < 0 || area->nPointCount % 2 != 0)
{
OutputMsg(rmError,_T("scene config area error!Range Point Count Error!sceneid=%d,count=%d"),sceneConf->nScenceId,area->nPointCount);
return false;
}
if (area->nPointCount == 0)
{
char sMapFullBuff[40]; //地图文件的全名
sprintf(sMapFullBuff,"data/map/%s",sceneConf->szMapFileName);
CAbstractMap* pMap = GetGlobalLogicEngine()->GetFuBenMgr()->GetMapData(sMapFullBuff);
if (!pMap)
{
OutputMsg(rmError,"Map File Is NULL!filename=%s",sceneConf->szMapFileName);
return false;
}
area->nPointCount = 4;
area->lpPoints= (LPPOINT)m_DataAllocator.allocObjects(sizeof(area->lpPoints[0])*4);
area->lpPoints[0].x = 0;
area->lpPoints[0].y = 0;
area->lpPoints[1].x = pMap->m_dwWidth;
area->lpPoints[1].y = 0;
area->lpPoints[2].x = pMap->m_dwWidth;
area->lpPoints[2].y = pMap->m_dwHeight;
area->lpPoints[3].x = 0;
area->lpPoints[3].y = pMap->m_dwHeight;
}
else
{
area->nPointCount = area->nPointCount / 2;
if (area->nPointCount > 0)
{
area->lpPoints= (LPPOINT)m_DataAllocator.allocObjects(sizeof(area->lpPoints[0])*area->nPointCount);
}
int index = 0;
if (enumTableFirst())
{
do
{
if (index >= area->nPointCount) break;
area->lpPoints[index].x = getFieldInt(NULL);
enumTableNext();
area->lpPoints[index].y = getFieldInt(NULL);
index++;
} while (enumTableNext());
}
}
closeTable();
return true;
}
bool CEnvirConfig::LoadAreaAttriConfig( SCENECONFIG* sceneConf, SCENEAREA* area )
{
if (area->boInherit)//继承第一个区域的属性
{
SCENEAREA* pFirst = sceneConf->vAreaList.pList;
for (INT_PTR i = 0; i < aaAttriCount; i++)
{
area->attri[i].bType = pFirst->attri[i].bType;
INT_PTR nCount = area->attri[i].nCount = pFirst->attri[i].nCount;
area->attri[i].pValues = pFirst->attri[i].pValues;
if (nCount > 0)
{
INT_PTR nSize = sizeof(int)*nCount;
area->attri[i].pValues = (int*)m_DataAllocator.allocObjects(nSize);
memcpy(area->attri[i].pValues,pFirst->attri[i].pValues,nSize);
}
}
}
if (!openFieldTable("attri"))
{
OutputMsg(rmError,_T("Scene Config Open attri table error!sceneid=%d"),sceneConf->nScenceId);
return true;
}
if (enumTableFirst())
{
do
{
int type = getFieldInt("type");
if (type < 0 || type >= aaAttriCount)
{
OutputMsg(rmError,_T("scene config error:attri type error!type=%d,sceneid=%d"),type,sceneConf->nScenceId);
return false;
}
area->attri[type].bType = type;
if (!openFieldTable("value"))
{
OutputMsg(rmError,_T("scene config error:attri table error!sceneid=%d"),sceneConf->nScenceId);
return false;
}
area->attri[type].nCount = (int)lua_objlen(m_pLua,-1);
if (area->attri[type].nCount > 0)
{
area->attri[type].pValues = (int*)m_DataAllocator.allocObjects(sizeof(int)*area->attri[type].nCount);
}
int index = 0;
if (enumTableFirst())
{
do
{
area->attri[type].pValues[index++] = getFieldInt(NULL);
} while (enumTableNext());
}
closeTable();
//检查参数个数对不对
if (!checkParam(area,type))
{
OutputMsg(rmError,_T("scene area config error:attri param count error!sceneid=%d,type=%d"),sceneConf->nScenceId,type);
return false;
}
} while (enumTableNext());
}
closeTable();
//统计一下区域属性的数量
ZeroMemory(area->attrBits,sizeof(area->attrBits));
for (INT_PTR i = 0; i < aaAttriCount; i++)
{
if (area->attri[i].bType == i)
{
INT_PTR nIndex = i / 32;
INT_PTR nBit = i % 32;
area->attrBits[nIndex] |= (1 << nBit);
}
}
return true;
}
bool CEnvirConfig::LoadAreaCenterConfig( SCENECONFIG* sceneConf, SCENEAREA* area )
{
if ( !openFieldTable("center") )//获取场景列表
{
OutputMsg(rmError,_T("Scene Config Open center table error!sceneid=%d"),sceneConf->nScenceId);
return false;
}
size_t count = lua_objlen(m_pLua, -1);
if (count != 2)
{
OutputMsg(rmError,"load scene config error!range center config error!sceneid=%d",sceneConf->nScenceId);
return false;
}
count = 0;
if (enumTableFirst())
{
do
{
area->Center[count++] = getFieldInt(NULL);
} while (enumTableNext());
}
closeTable();
return true;
}
bool CEnvirConfig::checkParam( SCENEAREA* pArea,INT_PTR nType )
{
if ((nType < 0) || (nType >= aaAttriCount)) return false;
AreaAttri& attri = pArea->attri[nType];
bool boSort = true;//参数是否需要排序,默认是排序
switch(nType)
{
case aaAddBuff:
case aaLeaveDelBuf:
{
boSort = false;
if ( attri.nCount <= 0) return false;
INT_PTR nMaxBuffCount = GetLogicServer()->GetDataProvider()->GetBuffProvider().GetBuffCount();
for (INT_PTR i = 0; i < attri.nCount; i++)//增加N个buff
{
int nBuffId = attri.pValues[i];
if (nBuffId <= 0 || nBuffId > (int)nMaxBuffCount)
{
return false;
}
}
break;
}
case aaForcePkMode:
case aaSceneMaxLevel:
case asSceneAreaMode:
{
if (attri.nCount != 1) return false;//需要且只需要1个参数
break;
}
case aaSaftRelive:
{
boSort = false;
break;
}
case aaSceneLevel://需要多个参数
{
if ( attri.nCount < 1 )
{
return false;
}
boSort = false;
break;
}
case aaChangeModel:
case aaChangeWeapon:
{
if (attri.nCount != 2)
{
return false;
}
boSort = false;
break;
}
}
//从小到大排序
if (boSort && attri.nCount > 0)
qsort(attri.pValues,attri.nCount,sizeof(*(attri.pValues)),(compfn)compare);
return true;
}
//读取Npc
bool CEnvirConfig::LoadNpcConfig( SCENECONFIG* sceneConf )
{
if (!openFieldTable("npc"))
{
return FALSE;
}
size_t nItemCount = lua_objlen(m_pLua, -1);
sceneConf->NpcList.nCount = (int)nItemCount;
if (nItemCount > 0)
{
INT_PTR nSize = sizeof(NPCPOS)*nItemCount;
sceneConf->NpcList.pPosList = (NPCPOS*)m_DataAllocator.allocObjects(nSize);
ZeroMemory(sceneConf->NpcList.pPosList,nSize);
if (enumTableFirst())
{
int idx = 0;
int nDef = 0;
do
{
NPCPOS* pNpc = sceneConf->NpcList.pPosList + idx;
pNpc->nId = getFieldInt("id", &nDef);
if (pNpc->nId == 0)
{
OutputMsg(rmError, _T("场景%d配置的npcID为0"), sceneConf->nScenceId);
}
pNpc->nPosX = getFieldInt("posx");
pNpc->nPosY = getFieldInt("posy");
idx++;
} while (enumTableNext());
}
}
closeTable();
return true;
}
//读取传送点
bool CEnvirConfig::LoadTelePortConfig( SCENECONFIG* sceneConf )
{
if (!openFieldTable("teleport"))
{
return FALSE;
}
size_t nItemCount = lua_objlen(m_pLua, -1);
sceneConf->TeleportList.nCount = (int)nItemCount;
if (nItemCount > 0)
{
INT_PTR nSize = sizeof(TeleportConfig)*nItemCount;
sceneConf->TeleportList.pList = (TeleportConfig*)m_DataAllocator.allocObjects(nSize);
ZeroMemory(sceneConf->TeleportList.pList,nSize);
if (enumTableFirst())
{
int idx = 0;
do
{
TeleportConfig* pTele = sceneConf->TeleportList.pList + idx;
pTele->nSceneId = getFieldInt("toSceneid");//toSceneid
pTele->nPosX = getFieldInt("posx");
pTele->nPosY = getFieldInt("posy");
pTele->nToPosX = getFieldInt("toPosx");
pTele->nToPosY = getFieldInt("toPosy");
pTele->nModelId = getFieldInt("modelid");
bool boUsed = true;
pTele->bUse = getFieldBoolean("used", &boUsed); //默认是可用的
int nValue = 0;
pTele->nPassId = getFieldInt("passid",&nValue);
pTele->nOpendayLimit = getFieldInt("opendayLimit",&nValue);
pTele->nToPosRadius = getFieldInt("toPosRadius", &nValue);//
nValue = 1;
pTele->nDist = getFieldInt("dist",&nValue);
getFieldStringBuffer("name",pTele->szName,ArrayCount(pTele->szName));
idx++;
} while (enumTableNext());
}
}
closeTable();
return true;
}