static void JPLua_LoadPlugin( const char *pluginName, const char *fileName ) { if ( !JPLua.plugins ) { // first plugin JPLua.plugins = (jplua_plugin_t *)malloc( sizeof(jplua_plugin_t) ); JPLua.currentPlugin = JPLua.plugins; } else { JPLua.currentPlugin->next = (jplua_plugin_t *)malloc( sizeof(jplua_plugin_t) ); JPLua.currentPlugin = JPLua.currentPlugin->next; } memset( JPLua.currentPlugin, 0, sizeof(jplua_plugin_t) ); Q_strncpyz( JPLua.currentPlugin->longname, "<null>", sizeof(JPLua.currentPlugin->longname) ); Q_strncpyz( JPLua.currentPlugin->name, pluginName, sizeof(JPLua.currentPlugin->name) ); JPLua_LoadFile( JPLua.state, va( "%s%s/%s", pluginDir, pluginName, fileName ) ); if ( JPLua.currentPlugin->requiredJPLuaVersion > JPLUA_VERSION ) { jplua_plugin_t *nextPlugin = JPLua.currentPlugin->next; trap->Print( "%s requires JPLua version %i\n", pluginName, JPLua.currentPlugin->requiredJPLuaVersion ); luaL_unref( JPLua.state, LUA_REGISTRYINDEX, JPLua.currentPlugin->handle ); free( JPLua.currentPlugin ); if ( JPLua.plugins == JPLua.currentPlugin ) JPLua.plugins = nextPlugin; JPLua.currentPlugin = nextPlugin; } else { trap->Print( "%-15s%-32s%-8s0x%" PRIxPTR "\n", "Loaded plugin:", JPLua.currentPlugin->longname, JPLua.currentPlugin->version, (void*)JPLua.currentPlugin->UID ); } }
static void JPLua_LoadPlugin( const char *pluginName, const char *fileName ) { if ( !JPLua.plugins ) {//First plugin JPLua.plugins = (jplua_plugin_t *)malloc( sizeof( jplua_plugin_t ) ); JPLua.currentPlugin = JPLua.plugins; } else { JPLua.currentPlugin->next = (jplua_plugin_t *)malloc( sizeof( jplua_plugin_t ) ); JPLua.currentPlugin = JPLua.currentPlugin->next; } memset( JPLua.currentPlugin, 0, sizeof( jplua_plugin_t ) ); Q_strncpyz( JPLua.currentPlugin->name, "<null>", sizeof( JPLua.currentPlugin->name ) ); JPLua_LoadFile( JPLua.state, va( JPLUA_DIRECTORY"%s/%s", pluginName, fileName ) ); if ( JPLua.currentPlugin->requiredJPLuaVersion > JPLua.version ) { jplua_plugin_t *nextPlugin = JPLua.currentPlugin->next; Com_Printf( "%s requires JPLua version %i\n", pluginName, JPLua.currentPlugin->requiredJPLuaVersion ); luaL_unref( JPLua.state, LUA_REGISTRYINDEX, JPLua.currentPlugin->handle ); free( JPLua.currentPlugin ); if ( JPLua.plugins == JPLua.currentPlugin ) JPLua.plugins = nextPlugin; JPLua.currentPlugin = nextPlugin; } else Com_Printf( "%-15s%-32s%-8s%X\n", "Loaded plugin:", JPLua.currentPlugin->name, JPLua.currentPlugin->version, JPLua.currentPlugin->UID ); }
static void JPLua_PostInit( lua_State *L ) { char folderList[16384] = {0}, *folderName = NULL; int i=0, numFolders=0, folderLen=0; trap->Print( "^5**************** ^3JA++ Lua (SV) is initialising ^5****************\n" ); JPLua_LoadFile( L, JPLUA_DIRECTORY"init"JPLUA_EXTENSION ); lua_getfield( L, LUA_GLOBALSINDEX, "JPLua" ); lua_getfield( L, -1, "version" ); JPLua.version = lua_tointeger( L, -1 ); lua_pop( L, 1 ); trap->Print( "%-15s%-32s%-8s%s\n", " ", "Name", "Version", "Unique ID" ); numFolders = trap->FS_GetFileList( JPLUA_DIRECTORY, "/", folderList, sizeof( folderList ) ); folderName = folderList; for ( i=0; i<numFolders; i++ ) { Q_strstrip( folderName, "/\\", NULL ); folderLen = strlen( folderName ); //folderName[folderLen] = '\0'; // not necessary? if ( Q_stricmp( folderName, "." ) && Q_stricmp( folderName, ".." ) ) { char fileList[16384] = {0}, *fileName = NULL; int j=0, numFiles=0, fileLen=0; numFiles = trap->FS_GetFileList( va( JPLUA_DIRECTORY"%s", folderName ), JPLUA_EXTENSION, fileList, sizeof( fileList ) ); fileName = fileList; for ( j=0; j<numFiles; j++ ) { Q_strstrip( fileName, "/\\", NULL ); fileLen = strlen( fileName ); // fileName[fileLen] = '\0'; // not necessary? if ( !Q_stricmp( fileName, "plugin"JPLUA_EXTENSION ) ) { JPLua_LoadPlugin( folderName, fileName ); break; } fileName += fileLen+1; } } folderName += folderLen+1; } trap->Print( "^5**************** ^2JA++ Lua (SV) is initialised ^5****************\n" ); return; }
static void JPLua_PostInit( lua_State *L ) { #if defined(PROJECT_GAME) trap->Print( S_COLOR_CYAN "**************** " S_COLOR_YELLOW "JA++ Lua (SV) is initialising " S_COLOR_CYAN "****************\n" ); #elif defined(PROJECT_CGAME) trap->Print( S_COLOR_CYAN "**************** " S_COLOR_YELLOW "JA++ Lua (CL) is initialising " S_COLOR_CYAN "****************\n" ); #endif JPLua_Register_System( L ); JPLua_LoadFile( L, va( "%sinit" JPLUA_EXTENSION, baseDir ) ); JPLua.initialised = qtrue; trap->Print( "%-15s%-32s%-8s%s\n", " ", "Name", "Version", "Unique ID" ); //TODO: handle duplicates, i.e. one in pk3, one out of pk3 JPLua_LoadPluginDir( qtrue ); JPLua_LoadPluginDir( qfalse ); #if defined(PROJECT_GAME) trap->Print( S_COLOR_CYAN "**************** " S_COLOR_GREEN "JA++ Lua (SV) is initialised " S_COLOR_GREEN "****************\n" ); #elif defined(PROJECT_CGAME) trap->Print( S_COLOR_CYAN "**************** " S_COLOR_GREEN "JA++ Lua (CL) is initialised " S_COLOR_GREEN "****************\n" ); #endif }
static int JPLua_Export_Require( lua_State *L ) { const char *path = va( "%s%s", JPLua.initialised ? pluginDir : baseDir, lua_tostring( L, 1 ) ); JPLua_LoadFile( L, path ); return 0; }
static int JPLua_Export_Require( lua_State *L ) { const char *path = va( "lua/sv/%s", lua_tostring( L, 1 ) ); JPLua_LoadFile( L, path ); return 0; }