void CLuaInterface_Hooks::ErrorFromLua_H( const char *err, ... ) { ILuaInterface *luaInterface = (ILuaInterface *)this; // Construct error string char szBuf[512]; va_list arg_ptr; va_start( arg_ptr, err ); _vsntprintf( szBuf, sizeof(szBuf)-1, (char *)err, arg_ptr ); va_end( arg_ptr ); // Only call hook if the state has the module loaded if ( g_LuaInterfaces.Find( luaInterface ) == -1 ) { (this->*ErrorFromLua_T)( szBuf ); return; } // Call LuaError hook ILuaObject *hookTable = luaInterface->GetGlobal( "hook" ); ILuaObject *hookCallFunction = hookTable->GetMember( "Call" ); hookCallFunction->Push(); luaInterface->Push( "LuaError" ); luaInterface->PushNil(); luaInterface->Push( szBuf ); luaInterface->Call( 3, 1 ); hookTable->UnReference(); hookCallFunction->UnReference(); // Check return value ILuaObject *returnValue = luaInterface->GetReturn( 0 ); // Call original if nothing is returned if ( returnValue->isNil() ) (this->*ErrorFromLua_T)( szBuf ); returnValue->UnReference(); }
void VFUNC newDispatchUserMessage( IBaseClientDLL *baseCLDLL, int peebis, int msg_type, bf_read &msg_data ) { for ( int i=0; i <= 1; i++) { ILuaInterface* gLua = CStateManager::GetByIndex( i ); if ( gLua == NULL ){ continue; } gLua->Push( gLua->GetGlobal("hook")->GetMember("Call") ); gLua->Push("DispatchUserMessage"); gLua->PushNil(); gLua->Push( (float) peebis ); gLua->Push( (float) msg_type ); ILuaObject *metaT = gLua->GetMetaTable( CBITREAD_NAME, CBITREAD_ID ); //Push our custom stringtable object gLua->PushUserData( metaT, &msg_data ); metaT->UnReference(); gLua->Call(4, 0); } return origDispatchUserMessage( baseCLDLL, peebis, msg_type, msg_data ); }