//===== Copyright © Valve Corporation, All rights reserved. ======// // // Purpose: Defines scripting system. // //===========================================================================// #include "gameuiscriptsystem.h" #include "tier1/utlbuffer.h" #include "tier1/fmtstr.h" #include "filesystem.h" #include "gameuisystemmgr.h" // memdbgon must be the last include file in a .cpp file!!! #include IScriptVM *GameUIScriptSystemCreate( ) { IScriptVM *pScriptVM = NULL; ScriptLanguage_t scriptLanguage = SL_LUA; if( scriptLanguage != SL_NONE ) { pScriptVM = g_pScriptManager->CreateVM( scriptLanguage ); if( pScriptVM ) { DevMsg("VSCRIPT: Started VScript virtual machine using script language '%s'\n", pScriptVM->GetLanguageName() ); char SZFullPath[ MAX_PATH ]; g_pFullFileSystem->RelativePathToFullPath( "scripts/vguiedit/modules", "GAME", SZFullPath, sizeof( SZFullPath ) ); pScriptVM->AddSearchPath( SZFullPath ); } } return pScriptVM; } HSCRIPT GameUIScriptSystemCompile( IScriptVM *pScriptVM, const char *pszScriptName, bool bWarnMissing ) { if ( !pScriptVM ) { return NULL; } static const char *pszExtensions[] = { "", // SL_NONE ".gm", // SL_GAMEMONKEY ".nut", // SL_SQUIRREL ".lua", // SL_LUA ".py", // SL_PYTHON }; const char *pszVMExtension = pszExtensions[ pScriptVM->GetLanguage() ]; const char *pszIncomingExtension = V_strrchr( pszScriptName , '.' ); if ( pszIncomingExtension && V_stricmp( pszIncomingExtension, pszVMExtension ) != 0 ) { Msg( "Script file type does not match VM type\n" ); return NULL; } CFmtStr scriptPath; if ( pszIncomingExtension ) { scriptPath.sprintf( "scripts/%s", pszScriptName ); } else { scriptPath.sprintf( "scripts/%s%s", pszScriptName, pszVMExtension ); } const char *pBase; CUtlBuffer bufferScript; if ( pScriptVM->GetLanguage() == SL_PYTHON ) { // python auto-loads raw or precompiled modules - don't load data here pBase = NULL; } else { bool bResult = g_pFullFileSystem->ReadFile( scriptPath, "GAME", bufferScript ); if( !bResult ) { Warning( "Script not found (%s) \n", scriptPath.operator const char *() ); } pBase = (const char *) bufferScript.Base(); if ( !pBase || !*pBase ) { return NULL; } } const char *pszFilename = V_strrchr( scriptPath, '/' ); pszFilename++; HSCRIPT hScript = pScriptVM->CompileScript( pBase, pszFilename ); if ( hScript == INVALID_HSCRIPT ) { DevMsg( "FAILED to compile and execute script file named %s\n", scriptPath.operator const char *() ); } return hScript; } bool GameUIScriptSystemRun( IScriptVM *pScriptVM, const char *pszScriptName, HSCRIPT hScope, bool bWarnMissing ) { HSCRIPT hScript = GameUIScriptSystemCompile( pScriptVM, pszScriptName, bWarnMissing ); bool bSuccess = false; if ( hScript != INVALID_HSCRIPT ) { // if ( gpGlobals->maxClients == 1 ) //{ //CBaseEntity *pPlayer = UTIL_GetLocalPlayer(); //if ( pPlayer ) //{ //g_pScriptVM->SetValue( "player", pPlayer->GetScriptInstance() ); //} //} bSuccess = ( pScriptVM->Run( hScript, hScope ) != SCRIPT_ERROR ); if ( !bSuccess ) { DevMsg( "Error running script named %s\n", pszScriptName ); } pScriptVM->ReleaseScript( hScript ); } return bSuccess; } #include