135 lines
3.2 KiB
C++
135 lines
3.2 KiB
C++
//===== 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 <tier0/memdbgon.h>
|
|
|
|
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 <tier0/memdbgoff.h>
|
|
|