You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
4.2 KiB
190 lines
4.2 KiB
//========== Copyright © 2008, Valve Corporation, All rights reserved. ======== |
|
// |
|
// Purpose: |
|
// |
|
//============================================================================= |
|
|
|
#include "cbase.h" |
|
#include "vscript_client.h" |
|
#include "icommandline.h" |
|
#include "tier1/utlbuffer.h" |
|
#include "tier1/fmtstr.h" |
|
#include "filesystem.h" |
|
#include "characterset.h" |
|
#include "isaverestore.h" |
|
#include "gamerules.h" |
|
#ifdef _WIN32 |
|
//#include "vscript_client_nut.h" |
|
#endif |
|
|
|
extern IScriptManager *scriptmanager; |
|
extern ScriptClassDesc_t * GetScriptDesc( CBaseEntity * ); |
|
|
|
// #define VMPROFILE 1 |
|
|
|
#ifdef VMPROFILE |
|
|
|
#define VMPROF_START float debugStartTime = Plat_FloatTime(); |
|
#define VMPROF_SHOW( funcname, funcdesc ) DevMsg("***VSCRIPT PROFILE***: %s %s: %6.4f milliseconds\n", (##funcname), (##funcdesc), (Plat_FloatTime() - debugStartTime)*1000.0 ); |
|
|
|
#else // !VMPROFILE |
|
|
|
#define VMPROF_START |
|
#define VMPROF_SHOW |
|
|
|
#endif // VMPROFILE |
|
|
|
//----------------------------------------------------------------------------- |
|
// |
|
//----------------------------------------------------------------------------- |
|
static float Time() |
|
{ |
|
return gpGlobals->curtime; |
|
} |
|
|
|
static const char *GetMapName() |
|
{ |
|
return engine->GetLevelName(); |
|
} |
|
|
|
static const char *DoUniqueString( const char *pszBase ) |
|
{ |
|
static char szBuf[512]; |
|
g_pScriptVM->GenerateUniqueKey( pszBase, szBuf, ARRAYSIZE(szBuf) ); |
|
return szBuf; |
|
} |
|
|
|
bool DoIncludeScript( const char *pszScript, HSCRIPT hScope ) |
|
{ |
|
if ( !VScriptRunScript( pszScript, hScope, true ) ) |
|
{ |
|
g_pScriptVM->RaiseException( CFmtStr( "Failed to include script \"%s\"", ( pszScript ) ? pszScript : "unknown" ) ); |
|
return false; |
|
} |
|
return true; |
|
} |
|
|
|
bool VScriptClientInit() |
|
{ |
|
VMPROF_START |
|
|
|
if( scriptmanager != NULL ) |
|
{ |
|
ScriptLanguage_t scriptLanguage = SL_DEFAULT; |
|
|
|
char const *pszScriptLanguage; |
|
if ( CommandLine()->CheckParm( "-scriptlang", &pszScriptLanguage ) ) |
|
{ |
|
if( !Q_stricmp(pszScriptLanguage, "gamemonkey") ) |
|
{ |
|
scriptLanguage = SL_GAMEMONKEY; |
|
} |
|
else if( !Q_stricmp(pszScriptLanguage, "squirrel") ) |
|
{ |
|
scriptLanguage = SL_SQUIRREL; |
|
} |
|
else if( !Q_stricmp(pszScriptLanguage, "python") ) |
|
{ |
|
scriptLanguage = SL_PYTHON; |
|
} |
|
else |
|
{ |
|
DevWarning("-scriptlang does not recognize a language named '%s'. virtual machine did NOT start.\n", pszScriptLanguage ); |
|
scriptLanguage = SL_NONE; |
|
} |
|
|
|
} |
|
if( scriptLanguage != SL_NONE ) |
|
{ |
|
if ( g_pScriptVM == NULL ) |
|
g_pScriptVM = scriptmanager->CreateVM( scriptLanguage ); |
|
|
|
if( g_pScriptVM ) |
|
{ |
|
Log_Msg( LOG_VScript, "VSCRIPT: Started VScript virtual machine using script language '%s'\n", g_pScriptVM->GetLanguageName() ); |
|
ScriptRegisterFunction( g_pScriptVM, GetMapName, "Get the name of the map."); |
|
ScriptRegisterFunction( g_pScriptVM, Time, "Get the current server time" ); |
|
ScriptRegisterFunction( g_pScriptVM, DoIncludeScript, "Execute a script (internal)" ); |
|
|
|
if ( GameRules() ) |
|
{ |
|
GameRules()->RegisterScriptFunctions(); |
|
} |
|
|
|
//g_pScriptVM->RegisterInstance( &g_ScriptEntityIterator, "Entities" ); |
|
|
|
if ( scriptLanguage == SL_SQUIRREL ) |
|
{ |
|
//g_pScriptVM->Run( g_Script_vscript_client ); |
|
} |
|
|
|
VScriptRunScript( "mapspawn", false ); |
|
|
|
VMPROF_SHOW( pszScriptLanguage, "virtual machine startup" ); |
|
|
|
return true; |
|
} |
|
else |
|
{ |
|
DevWarning("VM Did not start!\n"); |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
Log_Msg( LOG_VScript, "\nVSCRIPT: Scripting is disabled.\n" ); |
|
} |
|
g_pScriptVM = NULL; |
|
return false; |
|
} |
|
|
|
void VScriptClientTerm() |
|
{ |
|
if( g_pScriptVM != NULL ) |
|
{ |
|
if( g_pScriptVM ) |
|
{ |
|
scriptmanager->DestroyVM( g_pScriptVM ); |
|
g_pScriptVM = NULL; |
|
} |
|
} |
|
} |
|
|
|
|
|
class CVScriptGameSystem : public CAutoGameSystemPerFrame |
|
{ |
|
public: |
|
// Inherited from IAutoServerSystem |
|
virtual void LevelInitPreEntity( void ) |
|
{ |
|
m_bAllowEntityCreationInScripts = true; |
|
VScriptClientInit(); |
|
} |
|
|
|
virtual void LevelInitPostEntity( void ) |
|
{ |
|
m_bAllowEntityCreationInScripts = false; |
|
} |
|
|
|
virtual void LevelShutdownPostEntity( void ) |
|
{ |
|
VScriptClientTerm(); |
|
} |
|
|
|
virtual void FrameUpdatePostEntityThink() |
|
{ |
|
if ( g_pScriptVM ) |
|
g_pScriptVM->Frame( gpGlobals->frametime ); |
|
} |
|
|
|
bool m_bAllowEntityCreationInScripts; |
|
}; |
|
|
|
CVScriptGameSystem g_VScriptGameSystem; |
|
|
|
bool IsEntityCreationAllowedInScripts( void ) |
|
{ |
|
return g_VScriptGameSystem.m_bAllowEntityCreationInScripts; |
|
} |
|
|
|
|
|
|