bool LuaScriptMgr::Call_GlobalFunc( const char* pFuncName , const char* pFormat,...)
{
if(!pFuncName || 0 == *pFuncName || !pFormat)
return false;
LuaPopAll pup (m_pLuaState);
lua_getglobal(m_pLuaState, pFuncName);
va_list t_oParamList;
int t_sArgNum = 0;
int t_sRes = 0;
va_start(t_oParamList,pFormat);
for (t_sArgNum=0; 0!= *pFormat; ++t_sArgNum){
switch(*pFormat++)
{
case 'd':
case 'D':
{
double d = va_arg(t_oParamList, double);
lua_pushnumber(m_pLuaState, d);
}
break;
case 'f':
case 'F':
{
double f = va_arg(t_oParamList, double);
lua_pushnumber(m_pLuaState, f);
};
break;
case 'u':
case 'U':
{
unsigned int u = va_arg(t_oParamList, unsigned int);
lua_pushnumber(m_pLuaState, u);
}
break;
case 'i': // int参数
case 'I':
{
int i = va_arg(t_oParamList, int);
lua_pushinteger(m_pLuaState, i);
}
break;
case 's': // 字符串参数
case 'S':
{
char* c = (char*)va_arg(t_oParamList, unsigned int);
lua_pushstring(m_pLuaState, c);
}
break;
case '-': // 参数结束
{
goto Jump_ArgEnd;
}
break;
default:
{
assert(0&&"Script Call Param Error !\n");//Note: BM_Add 12.10.17-15.49
}
break;
};
};
Jump_ArgEnd:
t_sRes = strlen(pFormat);
if(0 != lua_pcall(m_pLuaState, t_sArgNum, t_sRes, 0) )
{
va_end(t_oParamList);
MHFS_LOGERROR("脚本", "脚本文件:%s执行错误,返回码:%d!", pFuncName , t_sRes);
return false;
}
//Note:
#ifdef _DEBUG
int t_sReturnNum = lua_gettop(m_pLuaState);
if(t_sRes != t_sReturnNum){
assert("Require Return Num != Actually Return Num.");
}
#endif//
int nIndex = -t_sRes;
while( 0 > nIndex ){
switch(*pFormat++)
{
case 'd': // double结果
case 'D':
{
*va_arg(t_oParamList, double*) = lua_tonumber(m_pLuaState, nIndex);
};
break;
case 'f': // float结果
case 'F':
{
*va_arg(t_oParamList, float*) = lua_tonumber(m_pLuaState, nIndex);
};
break;
case 'u': // dword结果
case 'U':
{
*va_arg(t_oParamList, unsigned int*) = lua_tonumber(m_pLuaState, nIndex);
};
break;
case 'i': // int结果
case 'I':
{
*va_arg(t_oParamList, int*) = lua_tointeger(m_pLuaState, nIndex);
}
break;
case 'b': // BOOL结果
case 'B':
{
*va_arg(t_oParamList, bool*) = lua_toboolean(m_pLuaState, nIndex);
};
break;
default:
{
assert(0&&"Script Call Param Error !\n");//Note: BM_Add 12.10.17-15.49
}
break;
};
++nIndex;
}
lua_pop(m_pLuaState, t_sRes);
va_end(t_oParamList);
return true;
};
/*Note:
函数目的:
{
解决c++ 调用lua 方式! 避免重复写逻辑对应的lua 函数
}
使用方法
{
假如 你想调用 Lua 函数
function PVP_Can_BeginPVP(uLevel)
if uLevel < 2 then
return false
end
return true
end
次函数需要1个参数传入! 1个参数返回
那就这样
unsigned int RoleEevel = Role->GetLvel()
bool bCanEnter;
Call_GlobalFunc("PVP_Can_BeginPVP","u-b",RoleEevel,&bCanEnter)
其中 bCanEnter 是 记录lua 函数的返回值
"u-b" 规则! ‘-’前是声明传入参数的类型 '-'后是返回的类型
d/D f/F = double
u/U = unsgined int
i/I = int
s/S = char*
}
函数弱点:
{
不能返回 string
}
*/
bool Call_GlobalFunc(const char* pFuncName , const char* pFormat,...);//Note: BM_Add