Squirrel system restructure

Properly decouple squirrel and game code. This makes it easier to reverse engineer more of this squirrel system, and to compile them as individual libraries later on when moving to CMake to significantly decrease compile times.
This commit is contained in:
Kawe Mazidjatari 2023-05-06 16:23:56 +02:00
parent 96ff01575f
commit 75ccebb4b6
34 changed files with 1161 additions and 972 deletions

View File

@ -28,7 +28,7 @@
//#include "client/cdll_engine_int.h"
//#include "materialsystem/cmaterialsystem.h"
//#include "studiorender/studiorendercontext.h"
#include "squirrel/sqvm.h"
#include "vscript/languages/squirrel_re/include/sqvm.h"
//#include "bsplib/bsplib.h"
//#include "ebisusdk/EbisuSDK.h"
#ifndef DEDICATED

View File

@ -55,11 +55,6 @@
#include "server/persistence.h"
#include "server/vengineserver_impl.h"
#endif // !CLIENT_DLL
#include "squirrel/sqinit.h"
#include "squirrel/sqapi.h"
#include "squirrel/sqvm.h"
#include "squirrel/sqscript.h"
#include "squirrel/sqstdaux.h"
#include "studiorender/studiorendercontext.h"
#include "rtech/rtech_game.h"
#include "rtech/rtech_utils.h"
@ -104,9 +99,15 @@
#include "engine/gl_rsurf.h"
#include "engine/debugoverlay.h"
#endif // !DEDICATED
#include "vscript/languages/squirrel_re/include/squirrel.h"
#include "vscript/languages/squirrel_re/include/sqvm.h"
#include "vscript/languages/squirrel_re/include/sqstdaux.h"
#include "vscript/languages/squirrel_re/vsquirrel.h"
#include "vscript/vscript.h"
#include "game/shared/util_shared.h"
#include "game/shared/usercmd.h"
#include "game/shared/animation.h"
#include "game/shared/vscript_shared.h"
#ifndef CLIENT_DLL
#include "game/server/ai_node.h"
#include "game/server/ai_network.h"
@ -470,13 +471,6 @@ void DetourRegister() // Register detour classes to be searched and hooked.
REGISTER(VCL_Main);
#endif // !DEDICATED
// Squirrel
REGISTER(VSqInit);
REGISTER(VSqapi);
REGISTER(HSQVM);
REGISTER(VSquirrelVM);
REGISTER(VSqStdAux);
// RTech
REGISTER(V_RTechGame);
REGISTER(V_RTechUtils);
@ -529,6 +523,16 @@ void DetourRegister() // Register detour classes to be searched and hooked.
REGISTER(VDebugOverlay); // !TODO: This also needs to be exposed to server dll!!!
#endif // !DEDICATED
// VScript
REGISTER(VSquirrel);
REGISTER(VScript);
REGISTER(VScriptShared);
// Squirrel
REGISTER(VSquirrelAPI);
REGISTER(VSquirrelAUX);
REGISTER(VSquirrelVM);
// Game/shared
REGISTER(VUserCmd);
REGISTER(VAnimation);

View File

@ -12,7 +12,7 @@
#include "engine/client/cl_rcon.h"
#include "engine/shared/shared_rcon.h"
#include "engine/net.h"
#include "squirrel/sqvm.h"
#include "vscript/languages/squirrel_re/include/sqvm.h"
#include "common/igameserverdata.h"

View File

@ -51,7 +51,7 @@
#ifndef CLIENT_DLL
#include "game/server/gameinterface.h"
#endif // !CLIENT_DLL
#include "squirrel/sqinit.h"
#include "game/shared/vscript_shared.h"
//-----------------------------------------------------------------------------
// Purpose: state machine's main processing loop

View File

@ -8,7 +8,7 @@
#include "public/iclientthinkable.h"
#include "public/iclientunknown.h"
#include "public/ihandleentity.h"
#include "public/ivscript.h"
#include "public/vscript/ivscript.h"
class C_BaseCombatCharacter

View File

@ -18,9 +18,6 @@
#endif // CLIENT_DLL
#include "engine/cmodel_bsp.h"
#include "engine/host_state.h"
#include "squirrel/sqtype.h"
#include "squirrel/sqapi.h"
#include "squirrel/sqinit.h"
#include "networksystem/pylon.h"
#ifndef CLIENT_DLL
#include "networksystem/bansystem.h"
@ -28,8 +25,10 @@
#ifndef DEDICATED
#include "networksystem/listmanager.h"
#endif // !DEDICATED
#include "vscript_shared.h"
#include "vscript/languages/squirrel_re/include/sqvm.h"
namespace VSquirrel
namespace VScriptCode
{
namespace SHARED
{

View File

@ -1,5 +1,6 @@
#pragma once
#include "squirrel/sqapi.h"
#ifndef VSCRIPT_SHARED_H
#define VSCRIPT_SHARED_H
#include "vscript/languages/squirrel_re/include/squirrel.h"
inline CMemory p_Script_Remote_BeginRegisteringFunctions;
inline auto Script_Remote_BeginRegisteringFunctions = p_Script_Remote_BeginRegisteringFunctions.RCast<void* (*)(void)>();
@ -14,7 +15,7 @@ inline uint32_t* g_nServerRemoteChecksum = nullptr;
inline uint32_t* g_nClientRemoteChecksum = nullptr;
#endif // !DEDICATED
namespace VSquirrel
namespace VScriptCode
{
namespace SHARED
{
@ -68,7 +69,7 @@ namespace VSquirrel
}
///////////////////////////////////////////////////////////////////////////////
class VSqInit : public IDetour
class VScriptShared : public IDetour
{
virtual void GetAdr(void) const
{
@ -103,3 +104,5 @@ class VSqInit : public IDetour
virtual void Detach(void) const { }
};
///////////////////////////////////////////////////////////////////////////////
#endif // !VSCRIPT_SHARED_H

View File

@ -31,11 +31,11 @@ History:
#include "networksystem/serverlisting.h"
#include "networksystem/pylon.h"
#include "networksystem/listmanager.h"
#include "squirrel/sqinit.h"
#include "vpc/keyvalues.h"
#include "vstdlib/callback.h"
#include "gameui/IBrowser.h"
#include "public/edict.h"
#include "game/shared/vscript_shared.h"
//-----------------------------------------------------------------------------
// Purpose:

View File

@ -21,7 +21,6 @@ History:
#include "windows/id3dx.h"
#include "windows/console.h"
#include "windows/resource.h"
#include "squirrel/sqtype.h"
#include "gameui/IConsole.h"
//-----------------------------------------------------------------------------

View File

@ -1,22 +0,0 @@
#ifndef IVSCRIPT_H
#define IVSCRIPT_H
enum ScriptLanguage_t
{
SL_NONE,
SL_GAMEMONKEY,
SL_SQUIRREL,
SL_LUA,
SL_PYTHON,
SL_DEFAULT = SL_SQUIRREL
};
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
DECLARE_POINTER_HANDLE(HSCRIPT);
#define INVALID_HSCRIPT ((HSCRIPT)-1)
#endif // IVSCRIPT_H

View File

@ -0,0 +1,102 @@
#ifndef IVSCRIPT_H
#define IVSCRIPT_H
#include "vscript/languages/squirrel_re/include/squirrel.h"
#include "tier1/utlvector.h"
#include "datamap.h"
//---------------------------------------------------------
DECLARE_POINTER_HANDLE(HSCRIPT);
#define INVALID_HSCRIPT ((HSCRIPT)-1)
typedef int ScriptDataType_t;
typedef void* ScriptFunctionBindingStorageType_t;
enum ScriptLanguage_t
{
SL_NONE,
SL_GAMEMONKEY,
SL_SQUIRREL,
SL_LUA,
SL_PYTHON,
SL_DEFAULT = SL_SQUIRREL
};
//---------------------------------------------------------
enum ExtendedFieldType
{
FIELD_TYPEUNKNOWN = FIELD_TYPECOUNT,
FIELD_TYPEUNKNOWN1, // Unknown field from R2
FIELD_TYPEUNKNOWN2, // Unknown field from R5
FIELD_CSTRING,
FIELD_HSCRIPT,
FIELD_VARIANT,
FIELD_TYPEUNKNOWN3,
FIELD_TYPEUNKNOWN4,
FIELD_TYPEUNKNOWN5,
FIELD_TYPEUNKNOWN6,
FIELD_ASSET,
FIELD_OSTRING
};
//---------------------------------------------------------
struct ScriptFuncDescriptor_t
{
void Init(const SQChar* scriptName, const SQChar* nativeName,
const SQChar* description, const SQChar* returnType,
const SQChar* parameters)
{
m_ScriptName = scriptName;
m_Function = nativeName;
m_Description = description;
m_ReturnType = returnType;
m_Parameters = parameters;
}
const SQChar* m_ScriptName;
const SQChar* m_Function;
const SQChar* m_Description;
const SQChar* m_ReturnType;
const SQChar* m_Parameters;
};
//---------------------------------------------------------
struct ScriptFunctionBinding_t
{
ScriptFuncDescriptor_t m_Descriptor;
bool m_bCheckParams;
bool unk29; // Last (new) parameter to 'sq_setparamscheck'
SQInteger m_nDevLevel; // TODO: confirm, this is a guess.
const SQChar* m_pszCodeHook;
short unk38; // Second last (new) parameter to 'sq_setparamscheck'
ScriptDataType_t m_ReturnType;
CUtlVector<ScriptDataType_t> m_Parameters;
ScriptFunctionBindingStorageType_t m_pFunction;
void Init(
const SQChar* scriptName, const SQChar* nativeName,
const SQChar* helpString, const SQChar* returnString,
const SQChar* parameters, const ScriptDataType_t returnType,
const ScriptFunctionBindingStorageType_t function)
{
m_Descriptor.Init(scriptName, nativeName, helpString, returnString, parameters);
m_bCheckParams = false;
unk29 = false;
m_nDevLevel = 0;
m_pszCodeHook = nullptr;
unk38 = 0;
m_ReturnType = returnType;
m_pFunction = function;
}
};
static_assert(sizeof(ScriptFunctionBinding_t) == 0x68);
#endif // IVSCRIPT_H

View File

@ -1,452 +0,0 @@
//=============================================================================//
//
// Purpose: Script VM
//
//=============================================================================//
#include "core/stdafx.h"
#include "tier0/frametask.h"
#include "tier1/cvar.h"
#include "squirrel/sqapi.h"
#include "squirrel/sqinit.h"
#include "squirrel/sqscript.h"
#include "pluginsystem/modsystem.h"
//---------------------------------------------------------------------------------
// Purpose: registers global constant for target context
// Input : *v -
// *name -
// value -
//---------------------------------------------------------------------------------
SQRESULT Script_RegisterConstant(CSquirrelVM* s, const SQChar* name, SQInteger value)
{
return v_Script_RegisterConstant(s, name, value);
}
//---------------------------------------------------------------------------------
// Purpose: registers and exposes code functions to target context
// Input : *s -
// *scriptname -
// *nativename -
// *helpstring -
// *returntype -
// *arguments -
// *functor -
//---------------------------------------------------------------------------------
SQRESULT Script_RegisterFunction(CSquirrelVM* s, const SQChar* scriptname, const SQChar* nativename,
const SQChar* helpstring, const SQChar* returntype, const SQChar* parameters, void* functor)
{
ScriptFunctionBinding_t binding;
binding.Init(scriptname, nativename, helpstring, returntype, parameters, 5, functor);
SQRESULT results = v_Script_RegisterFunction(s, &binding, 1);
return results;
}
#ifndef CLIENT_DLL
//---------------------------------------------------------------------------------
// Purpose: registers script functions in SERVER context
// Input : *s -
//---------------------------------------------------------------------------------
void Script_RegisterServerFunctions(CSquirrelVM* s)
{
Script_RegisterFunction(s, "SDKNativeTest", "Script_SDKNativeTest", "Native SERVER test function", "void", "", &VSquirrel::SHARED::SDKNativeTest);
Script_RegisterFunction(s, "GetSDKVersion", "Script_GetSDKVersion", "Gets the SDK version as a string", "string", "", &VSquirrel::SHARED::GetSDKVersion);
Script_RegisterFunction(s, "GetNumHumanPlayers", "Script_GetNumHumanPlayers", "Gets the number of human players on the server", "int", "", &VSquirrel::SERVER::GetNumHumanPlayers);
Script_RegisterFunction(s, "GetNumFakeClients", "Script_GetNumFakeClients", "Gets the number of bot players on the server", "int", "", &VSquirrel::SERVER::GetNumFakeClients);
Script_RegisterFunction(s, "GetAvailableMaps", "Script_GetAvailableMaps", "Gets an array of all available maps", "array< string >", "", &VSquirrel::SHARED::GetAvailableMaps);
Script_RegisterFunction(s, "GetAvailablePlaylists", "Script_GetAvailablePlaylists", "Gets an array of all available playlists", "array< string >", "", &VSquirrel::SHARED::GetAvailablePlaylists);
Script_RegisterFunction(s, "KickPlayerByName", "Script_KickPlayerByName", "Kicks a player from the server by name", "void", "string", &VSquirrel::SHARED::KickPlayerByName);
Script_RegisterFunction(s, "KickPlayerById", "Script_KickPlayerById", "Kicks a player from the server by handle or nucleus id", "void", "string", &VSquirrel::SHARED::KickPlayerById);
Script_RegisterFunction(s, "BanPlayerByName", "Script_BanPlayerByName", "Bans a player from the server by name", "void", "string", &VSquirrel::SHARED::BanPlayerByName);
Script_RegisterFunction(s, "BanPlayerById", "Script_BanPlayerById", "Bans a player from the server by handle or nucleus id", "void", "string", &VSquirrel::SHARED::BanPlayerById);
Script_RegisterFunction(s, "UnbanPlayer", "Script_UnbanPlayer", "Unbans a player from the server by nucleus id or ip address", "void", "string", &VSquirrel::SHARED::UnbanPlayer);
Script_RegisterFunction(s, "ShutdownHostGame", "Script_ShutdownHostGame", "Shuts the local host game down", "void", "", &VSquirrel::SHARED::ShutdownHostGame);
Script_RegisterFunction(s, "IsDedicated", "Script_IsDedicated", "Returns whether this is a dedicated server", "bool", "", &VSquirrel::SERVER::IsDedicated);
}
#endif // !CLIENT_DLL
#ifndef DEDICATED
//---------------------------------------------------------------------------------
// Purpose: registers script functions in CLIENT context
// Input : *s -
//---------------------------------------------------------------------------------
void Script_RegisterClientFunctions(CSquirrelVM* s)
{
Script_RegisterFunction(s, "SDKNativeTest", "Script_SDKNativeTest", "Native CLIENT test function", "void", "", &VSquirrel::SHARED::SDKNativeTest);
Script_RegisterFunction(s, "GetSDKVersion", "Script_GetSDKVersion", "Gets the SDK version as a string", "string", "", &VSquirrel::SHARED::GetSDKVersion);
Script_RegisterFunction(s, "GetAvailableMaps", "Script_GetAvailableMaps", "Gets an array of all available maps", "array< string >", "", &VSquirrel::SHARED::GetAvailableMaps);
Script_RegisterFunction(s, "GetAvailablePlaylists", "Script_GetAvailablePlaylists", "Gets an array of all available playlists", "array< string >", "", &VSquirrel::SHARED::GetAvailablePlaylists);
Script_RegisterFunction(s, "ShutdownHostGame", "Script_ShutdownHostGame", "Shuts the local host game down", "void", "", &VSquirrel::SHARED::ShutdownHostGame);
Script_RegisterFunction(s, "IsClientDLL", "Script_IsClientDLL", "Returns whether this build is client only", "bool", "", &VSquirrel::SHARED::IsClientDLL);
}
//---------------------------------------------------------------------------------
// Purpose: registers script functions in UI context
// Input : *s -
//---------------------------------------------------------------------------------
void Script_RegisterUIFunctions(CSquirrelVM* s)
{
Script_RegisterFunction(s, "SDKNativeTest", "Script_SDKNativeTest", "Native UI test function", "void", "", &VSquirrel::SHARED::SDKNativeTest);
Script_RegisterFunction(s, "GetSDKVersion", "Script_GetSDKVersion", "Gets the SDK version as a string", "string", "", &VSquirrel::SHARED::GetSDKVersion);
Script_RegisterFunction(s, "RefreshServerList", "Script_RefreshServerList", "Refreshes the public server list and returns the count", "int", "", &VSquirrel::UI::RefreshServerCount);
// Functions for retrieving server browser data
Script_RegisterFunction(s, "GetServerName", "Script_GetServerName", "Gets the name of the server at the specified index of the server list", "string", "int", &VSquirrel::UI::GetServerName);
Script_RegisterFunction(s, "GetServerDescription", "Script_GetServerDescription", "Gets the description of the server at the specified index of the server list", "string", "int", &VSquirrel::UI::GetServerDescription);
Script_RegisterFunction(s, "GetServerMap", "Script_GetServerMap", "Gets the map of the server at the specified index of the server list", "string", "int", &VSquirrel::UI::GetServerMap);
Script_RegisterFunction(s, "GetServerPlaylist", "Script_GetServerPlaylist", "Gets the playlist of the server at the specified index of the server list", "string", "int", &VSquirrel::UI::GetServerPlaylist);
Script_RegisterFunction(s, "GetServerCurrentPlayers", "Script_GetServerCurrentPlayers", "Gets the current player count of the server at the specified index of the server list", "int", "int", &VSquirrel::UI::GetServerCurrentPlayers);
Script_RegisterFunction(s, "GetServerMaxPlayers", "Script_GetServerMaxPlayers", "Gets the max player count of the server at the specified index of the server list", "int", "int", &VSquirrel::UI::GetServerMaxPlayers);
Script_RegisterFunction(s, "GetServerCount", "Script_GetServerCount", "Gets the number of public servers", "int", "", &VSquirrel::UI::GetServerCount);
// Misc main menu functions
Script_RegisterFunction(s, "GetPromoData", "Script_GetPromoData", "Gets promo data for specified slot type", "string", "int", &VSquirrel::UI::GetPromoData);
// Functions for creating servers
Script_RegisterFunction(s, "CreateServer", "Script_CreateServer", "Starts server with the specified settings", "void", "string, string, string, string, int", &VSquirrel::UI::CreateServer);
Script_RegisterFunction(s, "IsServerActive", "Script_IsServerActive", "Returns whether the server is active", "bool", "", &VSquirrel::SHARED::IsServerActive);
// Functions for connecting to servers
Script_RegisterFunction(s, "ConnectToServer", "Script_ConnectToServer", "Joins server by ip address and encryption key", "void", "string, string", &VSquirrel::UI::ConnectToServer);
Script_RegisterFunction(s, "ConnectToListedServer", "Script_ConnectToListedServer", "Joins listed server by index", "void", "int", &VSquirrel::UI::ConnectToListedServer);
Script_RegisterFunction(s, "ConnectToHiddenServer", "Script_ConnectToHiddenServer", "Joins hidden server by token", "void", "string", &VSquirrel::UI::ConnectToHiddenServer);
Script_RegisterFunction(s, "GetHiddenServerName", "Script_GetHiddenServerName", "Gets hidden server name by token", "string", "string", &VSquirrel::UI::GetHiddenServerName);
Script_RegisterFunction(s, "GetAvailableMaps", "Script_GetAvailableMaps", "Gets an array of all available maps", "array< string >", "", &VSquirrel::SHARED::GetAvailableMaps);
Script_RegisterFunction(s, "GetAvailablePlaylists", "Script_GetAvailablePlaylists", "Gets an array of all available playlists", "array< string >", "", &VSquirrel::SHARED::GetAvailablePlaylists);
#ifndef CLIENT_DLL
Script_RegisterFunction(s, "KickPlayerByName", "Script_KickPlayerByName", "Kicks a player from the server by name", "void", "string", &VSquirrel::SHARED::KickPlayerByName);
Script_RegisterFunction(s, "KickPlayerById", "Script_KickPlayerById", "Kicks a player from the server by handle or nucleus id", "void", "string", &VSquirrel::SHARED::KickPlayerById);
Script_RegisterFunction(s, "BanPlayerByName", "Script_BanPlayerByName", "Bans a player from the server by name", "void", "string", &VSquirrel::SHARED::BanPlayerByName);
Script_RegisterFunction(s, "BanPlayerById", "Script_BanPlayerById", "Bans a player from the server by handle or nucleus id", "void", "string", &VSquirrel::SHARED::BanPlayerById);
Script_RegisterFunction(s, "UnbanPlayer", "Script_UnbanPlayer", "Unbans a player from the server by nucleus id or ip address", "void", "string", &VSquirrel::SHARED::UnbanPlayer);
#endif // !CLIENT_DLL
Script_RegisterFunction(s, "ShutdownHostGame", "Script_ShutdownHostGame", "Shuts the local host game down", "void", "", &VSquirrel::SHARED::ShutdownHostGame);
Script_RegisterFunction(s, "IsClientDLL", "Script_IsClientDLL", "Returns whether this build is client only", "bool", "", &VSquirrel::SHARED::IsClientDLL);
}
#endif // !DEDICATED
//---------------------------------------------------------------------------------
// Purpose: Initialises a Squirrel VM instance
// Output : True on success, false on failure
//---------------------------------------------------------------------------------
bool CSquirrelVM_Init(CSquirrelVM* s, SQCONTEXT context, float curTime)
{
v_CSquirrelVM_Init(s, context, curTime);
DevMsg((eDLL_T)context, "Created %s VM: '0x%p'\n", s->GetVM()->_sharedstate->_contextname, s);
switch (context)
{
#ifndef CLIENT_DLL
case SQCONTEXT::SERVER:
g_pServerScript = s;
Script_RegisterServerFunctions(s);
break;
#endif
#ifndef DEDICATED
case SQCONTEXT::CLIENT:
g_pClientScript = s;
Script_RegisterClientFunctions(s);
break;
case SQCONTEXT::UI:
g_pUIScript = s;
Script_RegisterUIFunctions(s);
break;
#endif
}
return true; // original func always returns true
}
//---------------------------------------------------------------------------------
// Purpose: Returns the script VM pointer by context
// Input : context -
// Output : SQVM*
//---------------------------------------------------------------------------------
CSquirrelVM* Script_GetScriptHandle(const SQCONTEXT context)
{
switch (context)
{
#ifndef CLIENT_DLL
case SQCONTEXT::SERVER:
return g_pServerScript;
#endif // !CLIENT_DLL
#ifndef DEDICATED
case SQCONTEXT::CLIENT:
return g_pClientScript;
case SQCONTEXT::UI:
return g_pUIScript;
#endif // !DEDICATED
default:
return nullptr;
}
}
//---------------------------------------------------------------------------------
// Purpose: destroys the signal entry list head
// Input : *s -
// v -
// f -
// Output : true on success, false otherwise
//---------------------------------------------------------------------------------
SQBool Script_DestroySignalEntryListHead(CSquirrelVM* s, HSQUIRRELVM v, SQFloat f)
{
SQBool result = v_Script_DestroySignalEntryListHead(s, v, f);
Script_RegisterConstant(s, "DEVELOPER", developer->GetInt());
return result;
}
//---------------------------------------------------------------------------------
// Purpose: prints the global include file the compiler loads for loading scripts
// Input : *szRsonName -
//---------------------------------------------------------------------------------
SQInteger Script_LoadRson(const SQChar* rsonfile)
{
DevMsg(eDLL_T::ENGINE, "Loading RSON: '%s'\n", rsonfile);
return v_Script_LoadRson(rsonfile);
}
//---------------------------------------------------------------------------------
// Purpose: prints the scripts the compiler loads from global include to be compiled
// Input : *v -
// *path -
// *name -
// flags -
//---------------------------------------------------------------------------------
SQBool Script_LoadScript(HSQUIRRELVM v, const SQChar* path, const SQChar* name, SQInteger flags)
{
// search for mod path identifier so the mod can decide where the file is
const char* modPath = strstr(path, MOD_SCRIPT_PATH_IDENTIFIER);
if (modPath)
path = &modPath[7]; // skip "::MOD::"
///////////////////////////////////////////////////////////////////////////////
return v_Script_LoadScript(v, path, name, flags);
}
//---------------------------------------------------------------------------------
// Purpose: parses rson data to get an array of scripts to compile
// Input :
//---------------------------------------------------------------------------------
bool Script_ParseCompileListRSON(SQCONTEXT context, const char* compileListPath, RSON::Node_t* rson, char** scriptArray, int* pScriptCount, char** precompiledScriptArray, int precompiledScriptCount)
{
return v_Script_ParseCompileListRSON(context, compileListPath, rson, scriptArray, pScriptCount, precompiledScriptArray, precompiledScriptCount);
}
//---------------------------------------------------------------------------------
// Purpose: Compiles and executes input code on target VM by context
// Input : *code -
// context -
//---------------------------------------------------------------------------------
void Script_Execute(const SQChar* code, const SQCONTEXT context)
{
if (!ThreadInMainThread())
{
const string scode(code);
g_TaskScheduler->Dispatch([scode, context]()
{
Script_Execute(scode.c_str(), context);
}, 0);
return; // Only run in main thread.
}
CSquirrelVM* s = Script_GetScriptHandle(context);
if (!s)
{
Error(eDLL_T::ENGINE, NO_ERROR, "Attempted to run %s script with no handle to VM\n", SQVM_GetContextName(context));
return;
}
HSQUIRRELVM v = s->GetVM();
if (!v)
{
Error(eDLL_T::ENGINE, NO_ERROR, "Attempted to run %s script while VM isn't initialized\n", SQVM_GetContextName(context));
return;
}
SQBufState bufState = SQBufState(code);
SQRESULT compileResult = sq_compilebuffer(v, &bufState, "console", -1);
if (SQ_SUCCEEDED(compileResult))
{
sq_pushroottable(v);
SQRESULT callResult = sq_call(v, 1, false, false);
if (!SQ_SUCCEEDED(callResult))
{
Error(eDLL_T::ENGINE, NO_ERROR, "Failed to execute %s script \"%s\"\n", SQVM_GetContextName(context), code);
}
}
}
void Script_SetCompilingVM(CSquirrelVM* vm, RSON::Node_t* rson)
{
switch (vm->GetContext())
{
#ifndef CLIENT_DLL
case SQCONTEXT::SERVER:
{
v_Script_SetCompilingVM_SV(vm->GetContext(), rson);
break;
}
#endif
#ifndef DEDICATED
case SQCONTEXT::CLIENT:
case SQCONTEXT::UI:
{
v_Script_SetCompilingVM_UICL(vm->GetContext(), rson);
break;
}
#endif
}
}
void CSquirrelVM::CompileModScripts()
{
for (auto& mod : g_pModSystem->GetModList())
{
if (!mod.IsEnabled())
continue;
if (!mod.m_bHasScriptCompileList)
continue;
RSON::Node_t* rson = mod.LoadScriptCompileList(); // allocs parsed rson buffer
if (!rson)
Error(GetVM()->GetNativePrintContext(), EXIT_FAILURE, "%s: Failed to load RSON file %s\n", __FUNCTION__, mod.GetScriptCompileListPath().string().c_str());
const char* scriptPathArray[1024];
int scriptCount = 0;
Script_SetCompilingVM(this, rson);
if (Script_ParseCompileListRSON(
GetContext(),
mod.GetScriptCompileListPath().string().c_str(),
rson,
(char**)scriptPathArray, &scriptCount,
nullptr, 0))
{
std::vector<char*> newScriptPaths;
for (int i = 0; i < scriptCount; ++i)
{
// add "::MOD::" to the start of the script path so it can be identified from Script_LoadScript later
// this is so we can avoid script naming conflicts by removing the engine's forced directory of "scripts/vscripts/"
// and adding the mod path to the start
std::string scriptPath = MOD_SCRIPT_PATH_IDENTIFIER + (mod.GetBasePath() / "scripts/vscripts/" / scriptPathArray[i]).string();
char* pszScriptPath = _strdup(scriptPath.c_str());
// normalise slash direction
V_FixSlashes(pszScriptPath);
newScriptPaths.emplace_back(pszScriptPath);
scriptPathArray[i] = pszScriptPath;
}
switch (GetVM()->GetContext())
{
#ifndef CLIENT_DLL
case SQCONTEXT::SERVER:
{
v_CSquirrelVM_CompileScriptsFromArray_SV(this, GetContext(), (char**)scriptPathArray, scriptCount);
break;
}
#endif
#ifndef DEDICATED
case SQCONTEXT::CLIENT:
case SQCONTEXT::UI:
{
v_CSquirrelVM_CompileScriptsFromArray_UICL(this, GetContext(), (char**)scriptPathArray, scriptCount);
break;
}
#endif
}
// clean up our allocated script paths
for (char* path : newScriptPaths)
{
delete path;
}
}
// TODO[rexx]: clean up allocated RSON memory. example @ 1408B18E2
}
}
#ifndef DEDICATED
bool CSquirrelVM::CompileClientScripts(CSquirrelVM* vm)
{
HSQUIRRELVM v = vm->GetVM();
DevMsg(v->GetNativePrintContext(), (char*)"Loading and compiling script lists\n");
vm->CompileModScripts();
return v_CSquirrelVM_CompileClientScripts(vm);
}
#endif
#ifndef CLIENT_DLL
bool CSquirrelVM::CompileServerScripts(int numPrecompiled)
{
HSQUIRRELVM v = g_pServerScript->GetVM();
DevMsg(v->GetNativePrintContext(), (char*)"Loading and compiling script lists\n");
g_pServerScript->CompileModScripts();
return v_CSquirrelVM_CompileServerScripts(numPrecompiled);
}
#endif
//---------------------------------------------------------------------------------
void VSquirrelVM::Attach() const
{
DetourAttach((LPVOID*)&v_Script_RegisterConstant, &Script_RegisterConstant);
DetourAttach((LPVOID*)&v_CSquirrelVM_Init, &CSquirrelVM_Init);
DetourAttach((LPVOID*)&v_Script_DestroySignalEntryListHead, &Script_DestroySignalEntryListHead);
DetourAttach((LPVOID*)&v_Script_LoadRson, &Script_LoadRson);
DetourAttach((LPVOID*)&v_Script_LoadScript, &Script_LoadScript);
#ifndef DEDICATED
DetourAttach((LPVOID*)&v_CSquirrelVM_CompileClientScripts, &CSquirrelVM::CompileClientScripts);
#endif
#ifndef CLIENT_DLL
DetourAttach((LPVOID*)&v_CSquirrelVM_CompileServerScripts, &CSquirrelVM::CompileServerScripts);
#endif
}
//---------------------------------------------------------------------------------
void VSquirrelVM::Detach() const
{
DetourDetach((LPVOID*)&v_Script_RegisterConstant, &Script_RegisterConstant);
DetourDetach((LPVOID*)&v_CSquirrelVM_Init, &CSquirrelVM_Init);
DetourDetach((LPVOID*)&v_Script_DestroySignalEntryListHead, &Script_DestroySignalEntryListHead);
DetourDetach((LPVOID*)&v_Script_LoadRson, &Script_LoadRson);
DetourDetach((LPVOID*)&v_Script_LoadScript, &Script_LoadScript);
#ifndef DEDICATED
DetourDetach((LPVOID*)&v_CSquirrelVM_CompileClientScripts, &CSquirrelVM::CompileClientScripts);
#endif
#ifndef CLIENT_DLL
DetourDetach((LPVOID*)&v_CSquirrelVM_CompileServerScripts, &CSquirrelVM::CompileServerScripts);
#endif
}

View File

@ -1,221 +0,0 @@
#pragma once
#include "squirrel/sqtype.h"
#include "squirrel/sqvm.h"
#include "vpc/rson.h"
#define MOD_SCRIPT_PATH_IDENTIFIER "::MOD::"
struct ScriptFunctionBinding_t
{
const SQChar* _scriptname; // 00
const SQChar* _nativename; // 08
const SQChar* _helpstring; // 10
const SQChar* _returntype; // 18
const SQChar* _parameters; // 20
bool _checkparams; // 28
bool unk29; // 29
std::int16_t padding1; // 2A
SQInteger unk2c; // 2C
const SQChar* _codehook; // 30
SQInteger unk38; // 38
SQInteger _nparamscheck; // 3C
CUtlVector<ScriptDataType_t> _vector;// 'm_pFunction' in original code; pending refactor.
const void* _functor; // 60
void Init(
const SQChar* scriptname, const SQChar* nativename,
const SQChar* helpstring, const SQChar* returntype,
const SQChar* parameters, const SQInteger nparamscheck,
const void* functor)
{
_scriptname = scriptname;
_nativename = nativename;
_helpstring = helpstring;
_returntype = returntype;
_parameters = parameters;
_checkparams = false;
unk29 = false;
padding1 = 0;
unk2c = 0;
_codehook = nullptr;
unk38 = 0;
_nparamscheck = nparamscheck;
_functor = functor;
}
};
static_assert(sizeof(ScriptFunctionBinding_t) == 0x68);
#pragma pack(push, 4)
class CSquirrelVM
{
public:
FORCEINLINE HSQUIRRELVM GetVM() const { return m_sqVM; }
FORCEINLINE SQCONTEXT GetContext() const { return m_iContext; }
void CompileModScripts();
#ifndef DEDICATED
static bool CompileClientScripts(CSquirrelVM* vm);
#endif
#ifndef CLIENT_DLL
static bool CompileServerScripts(int numPrecompiled);
#endif
private:
SQChar pad0[0x8];
HSQUIRRELVM m_sqVM;
SQChar pad1[0x8];
SQInteger m_nFlags;
SQChar pad2[4];
SQChar pad3[16];
#if !defined (GAMEDLL_S0) && !defined (GAMEDLL_S1)
SQChar pad4[4];
#endif
SQInteger m_nTick;
SQCONTEXT m_iContext; // 0x38
#if !defined (GAMEDLL_S2) && !defined (GAMEDLL_S3)
SQChar pad6[4];
#endif
void* m_pCompareFunc;
};
#pragma pack(pop)
inline CMemory p_Script_RegisterFunction;
inline auto v_Script_RegisterFunction = p_Script_RegisterFunction.RCast<SQRESULT(*)(CSquirrelVM* s, ScriptFunctionBinding_t* binding, SQInteger a1)>();
inline CMemory p_Script_RegisterConstant;
inline auto v_Script_RegisterConstant = p_Script_RegisterConstant.RCast<SQRESULT(*)(CSquirrelVM* s, const SQChar* name, SQInteger value)>();
inline CMemory p_CSquirrelVM_Init;
inline auto v_CSquirrelVM_Init = p_CSquirrelVM_Init.RCast<bool(__fastcall*)(CSquirrelVM * s, SQCONTEXT context, float curtime)>();
inline CMemory p_Script_DestroySignalEntryListHead;
inline auto v_Script_DestroySignalEntryListHead = p_Script_DestroySignalEntryListHead.RCast<SQBool(*)(CSquirrelVM* s, HSQUIRRELVM v, SQFloat f)>();
inline CMemory p_Script_LoadRson;
inline auto v_Script_LoadRson = p_Script_LoadRson.RCast<SQInteger(*)(const SQChar* rsonfile)>();
inline CMemory p_Script_LoadScript;
inline auto v_Script_LoadScript = p_Script_LoadScript.RCast<SQBool(*)(HSQUIRRELVM v, const SQChar* path, const SQChar* name, SQInteger flags)>();
#ifndef DEDICATED
inline CMemory p_CSquirrelVM_CompileClientScripts;
inline auto v_CSquirrelVM_CompileClientScripts = p_CSquirrelVM_CompileClientScripts.RCast<bool(__fastcall*)(CSquirrelVM* vm)>();
inline CMemory p_CSquirrelVM_CompileScriptsFromArray_UICL;
inline auto v_CSquirrelVM_CompileScriptsFromArray_UICL = p_CSquirrelVM_CompileScriptsFromArray_UICL.RCast<bool(__fastcall*)(CSquirrelVM* vm, SQCONTEXT context, char** scriptArray, int scriptCount)>();
inline CMemory p_Script_SetCompilingVM_UICL;
inline auto v_Script_SetCompilingVM_UICL = p_Script_SetCompilingVM_UICL.RCast<void(__fastcall*)(SQCONTEXT ctx, RSON::Node_t * rson)>();
#endif
#ifndef CLIENT_DLL
inline CMemory p_CSquirrelVM_CompileServerScripts;
inline auto v_CSquirrelVM_CompileServerScripts = p_CSquirrelVM_CompileServerScripts.RCast<bool(__fastcall*)(int numPrecompiled)>();
inline CMemory p_CSquirrelVM_CompileScriptsFromArray_SV;
inline auto v_CSquirrelVM_CompileScriptsFromArray_SV = p_CSquirrelVM_CompileScriptsFromArray_SV.RCast<bool(__fastcall*)(CSquirrelVM* vm, SQCONTEXT context, char** scriptArray, int scriptCount)>();
inline CMemory p_Script_SetCompilingVM_SV;
inline auto v_Script_SetCompilingVM_SV = p_Script_SetCompilingVM_SV.RCast<void(__fastcall*)(SQCONTEXT ctx, RSON::Node_t * rson)>();
#endif
inline CMemory p_Script_ParseCompileListRSON;
inline auto v_Script_ParseCompileListRSON = p_Script_ParseCompileListRSON.RCast<bool(__fastcall*)(SQCONTEXT ctx, const char* compileListPath, RSON::Node_t* rson, char** scriptArray, int* pScriptCount, char** precompiledScriptArray, int precompiledScriptCount)>();
#ifndef CLIENT_DLL
inline CSquirrelVM* g_pServerScript;
#endif // !CLIENT_DLL
#ifndef DEDICATED
inline CSquirrelVM* g_pClientScript;
inline CSquirrelVM* g_pUIScript;
#endif // !DEDICATED
SQRESULT Script_RegisterConstant(CSquirrelVM* s, const SQChar* name, SQInteger value);
SQRESULT Script_RegisterFunction(CSquirrelVM* s, const SQChar* scriptname, const SQChar* nativename,
const SQChar* helpstring, const SQChar* returntype, const SQChar* arguments, void* functor);
void Script_RegisterServerFunctions(CSquirrelVM* s);
void Script_RegisterClientFunctions(CSquirrelVM* s);
void Script_RegisterUIFunctions(CSquirrelVM* s);
CSquirrelVM* Script_GetScriptHandle(const SQCONTEXT context);
SQInteger Script_LoadRson(const SQChar* rsonfile);
SQBool Script_LoadScript(HSQUIRRELVM v, const SQChar* path, const SQChar* name, SQInteger flags);
bool Script_ParseCompileListRSON(SQCONTEXT context, const char* compileListPath, RSON::Node_t* rson, char** scriptArray, int* pScriptCount, char** precompiledScriptArray, int precompiledScriptCount);
void Script_Execute(const SQChar* code, const SQCONTEXT context);
///////////////////////////////////////////////////////////////////////////////
class VSquirrelVM : public IDetour
{
virtual void GetAdr(void) const
{
LogFunAdr("Script_RegisterConstant", p_Script_RegisterConstant.GetPtr());
LogFunAdr("Script_RegisterFunction", p_Script_RegisterFunction.GetPtr());
LogFunAdr("Script_DestroySignalEntryListHead", p_Script_DestroySignalEntryListHead.GetPtr());
LogFunAdr("Script_LoadRson", p_Script_LoadRson.GetPtr());
LogFunAdr("Script_LoadScript", p_Script_LoadScript.GetPtr());
}
virtual void GetFun(void) const
{
p_Script_RegisterConstant = g_GameDll.FindPatternSIMD("48 89 5C 24 ?? 48 89 6C 24 ?? 48 89 74 24 ?? 57 48 83 EC 30 4C 8B");
p_Script_RegisterFunction = g_GameDll.FindPatternSIMD("48 83 EC 38 45 0F B6 C8");
p_CSquirrelVM_Init = g_GameDll.FindPatternSIMD("E8 ? ? ? ? 0F 28 74 24 ? 48 89 1D ? ? ? ?").FollowNearCallSelf();
p_Script_DestroySignalEntryListHead = g_GameDll.FindPatternSIMD("48 89 5C 24 ?? 48 89 6C 24 ?? 56 57 41 56 48 83 EC 50 44 8B 42");
p_Script_LoadRson = g_GameDll.FindPatternSIMD("4C 8B DC 49 89 5B 08 57 48 81 EC A0 ?? ?? ?? 33");
#if defined (GAMEDLL_S0) || defined (GAMEDLL_S1)
p_Script_LoadScript = g_GameDll.FindPatternSIMD("48 89 5C 24 10 48 89 74 24 18 48 89 7C 24 20 48 89 4C 24 08 55 41 54 41 55 41 56 41 57 48 8D 6C");
#elif defined (GAMEDLL_S2) || defined (GAMEDLL_S3)
p_Script_LoadScript = g_GameDll.FindPatternSIMD("48 8B C4 48 89 48 08 55 41 56 48 8D 68");
#endif
v_Script_RegisterConstant = p_Script_RegisterConstant.RCast<SQRESULT(*)(CSquirrelVM*, const SQChar*, SQInteger)>(); /*48 89 5C 24 ?? 48 89 6C 24 ?? 48 89 74 24 ?? 57 48 83 EC 30 4C 8B*/
v_Script_RegisterFunction = p_Script_RegisterFunction.RCast<SQRESULT(*)(CSquirrelVM*, ScriptFunctionBinding_t*, SQInteger)>(); /*48 83 EC 38 45 0F B6 C8*/
v_CSquirrelVM_Init = p_CSquirrelVM_Init.RCast<bool(__fastcall*)(CSquirrelVM* s, SQCONTEXT context, float curtime)>();
v_Script_DestroySignalEntryListHead = p_Script_DestroySignalEntryListHead.RCast<SQBool(*)(CSquirrelVM*, HSQUIRRELVM, SQFloat)>();/*48 89 5C 24 ?? 48 89 6C 24 ?? 56 57 41 56 48 83 EC 50 44 8B 42*/
v_Script_LoadRson = p_Script_LoadRson.RCast<SQInteger(*)(const SQChar*)>(); /*4C 8B DC 49 89 5B 08 57 48 81 EC A0 00 00 00 33*/
v_Script_LoadScript = p_Script_LoadScript.RCast<SQBool(*)(HSQUIRRELVM, const SQChar*, const SQChar*, SQInteger)>(); /*48 8B C4 48 89 48 08 55 41 56 48 8D 68*/
#ifndef DEDICATED
// cl/ui scripts.rson compiling
p_CSquirrelVM_CompileClientScripts = g_GameDll.FindPatternSIMD("E8 ? ? ? ? 88 05 ? ? ? ? 33 C0").FollowNearCallSelf();
v_CSquirrelVM_CompileClientScripts = p_CSquirrelVM_CompileClientScripts.RCast<bool(__fastcall*)(CSquirrelVM*)>();
p_CSquirrelVM_CompileScriptsFromArray_UICL = g_GameDll.FindPatternSIMD("E8 ? ? ? ? 44 0F B6 F0 48 85 DB").FollowNearCallSelf();
v_CSquirrelVM_CompileScriptsFromArray_UICL = p_CSquirrelVM_CompileScriptsFromArray_UICL.RCast<bool(__fastcall*)(CSquirrelVM* vm, SQCONTEXT context, char** scriptArray, int scriptCount)>();
p_Script_SetCompilingVM_UICL = g_GameDll.FindString("Expected bool value for \"IsTestMap\" in \"%s\"\n").FindPatternSelf("48 89", CMemory::Direction::UP, 100);
v_Script_SetCompilingVM_UICL = p_Script_SetCompilingVM_UICL.RCast<void(__fastcall*)(SQCONTEXT ctx, RSON::Node_t* rson)>();
#endif
#ifndef CLIENT_DLL
// sv scripts.rson compiling
p_CSquirrelVM_CompileServerScripts = g_GameDll.FindPatternSIMD("E8 ? ? ? ? 33 DB 88 05 ? ? ? ? ").FollowNearCallSelf();
v_CSquirrelVM_CompileServerScripts = p_CSquirrelVM_CompileServerScripts.RCast<bool(__fastcall*)(int)>();
p_CSquirrelVM_CompileScriptsFromArray_SV = g_GameDll.FindPatternSIMD("E8 ? ? ? ? 0F B6 F0 48 85 DB").FollowNearCallSelf();
v_CSquirrelVM_CompileScriptsFromArray_SV = p_CSquirrelVM_CompileScriptsFromArray_SV.RCast<bool(__fastcall*)(CSquirrelVM* vm, SQCONTEXT context, char** scriptArray, int scriptCount)>();
p_Script_SetCompilingVM_SV = g_GameDll.FindString("Expected bool value for \"IsTestMap\" in \"%s\"\n", 2).FindPatternSelf("48 89", CMemory::Direction::UP, 100);
v_Script_SetCompilingVM_SV = p_Script_SetCompilingVM_SV.RCast<void(__fastcall*)(SQCONTEXT ctx, RSON::Node_t * rson)>();
#endif
p_Script_ParseCompileListRSON = g_GameDll.FindPatternSIMD("4C 89 4C 24 ? 55 41 56");
v_Script_ParseCompileListRSON = p_Script_ParseCompileListRSON.RCast<bool(__fastcall*)(SQCONTEXT, const char*, RSON::Node_t*, char**, int*, char**, int)>();
}
virtual void GetVar(void) const
{
}
virtual void GetCon(void) const { }
virtual void Attach(void) const;
virtual void Detach(void) const;
};
///////////////////////////////////////////////////////////////////////////////

View File

@ -1,51 +0,0 @@
#ifndef SQTYPE_H
#define SQTYPE_H
#define SQ_OK (1)
#define SQ_ERROR (-1)
#define SQ_FAILED(res) (res<0)
#define SQ_SUCCEEDED(res) (res>=0)
#define SQ_SUSPEND_FLAG -666
#define SQ_TAILCALL_FLAG -777
#define DONT_FALL_BACK 666
//#define EXISTS_FALL_BACK -1
#define GET_FLAG_RAW 0x00000001
#define GET_FLAG_DO_NOT_RAISE_ERROR 0x00000002
typedef char SQChar;
typedef float SQFloat;
typedef long SQInteger;
typedef unsigned long SQUnsignedInteger;
typedef void* SQFunctor;
typedef SQUnsignedInteger SQBool;
typedef SQInteger SQRESULT;
typedef int ScriptDataType_t;
enum class SQCONTEXT : SQInteger
{
SERVER = 0,
CLIENT,
UI,
NONE
};
constexpr const char* s_SqContext[4] =
{
"SERVER",
"CLIENT",
"UI",
"NONE"
};
constexpr const char* s_ScriptContext[4] =
{
"Script(S):",
"Script(C):",
"Script(U):",
"Script(X):"
};
#endif // SQTYPE_H

View File

@ -24,7 +24,7 @@
#if defined( _X360 )
#include "xbox/xbox_console.h"
#endif
#include "squirrel/sqstdaux.h"
#include "vscript/languages/squirrel_re/include/sqstdaux.h"
#endif // !NETCONSOLE
std::mutex g_LogMutex;

View File

@ -100,10 +100,7 @@ class VRSON : public IDetour
RSON_LoadFromBuffer = p_RSON_LoadFromBuffer.RCast< RSON::Node_t * (__fastcall*)(const char* bufName, char* buf, RSON::eFieldType rootType, __int64 a4, void* a5)>();
}
virtual void GetVar(void) const
{
}
virtual void GetVar(void) const { }
virtual void GetCon(void) const { }
virtual void Attach(void) const { }
virtual void Detach(void) const { }

View File

@ -75,6 +75,7 @@
<ClCompile Include="..\game\shared\collisionproperty.cpp" />
<ClCompile Include="..\game\shared\entitylist_base.cpp" />
<ClCompile Include="..\game\shared\util_shared.cpp" />
<ClCompile Include="..\game\shared\vscript_shared.cpp" />
<ClCompile Include="..\inputsystem\inputsystem.cpp" />
<ClCompile Include="..\launcher\IApplication.cpp" />
<ClCompile Include="..\launcher\launcher.cpp" />
@ -131,11 +132,6 @@
<ClCompile Include="..\rtech\rtech_game.cpp" />
<ClCompile Include="..\rtech\rui\rui.cpp" />
<ClCompile Include="..\rtech\stryder\stryder.cpp" />
<ClCompile Include="..\squirrel\sqapi.cpp" />
<ClCompile Include="..\squirrel\sqinit.cpp" />
<ClCompile Include="..\squirrel\sqscript.cpp" />
<ClCompile Include="..\squirrel\sqstdaux.cpp" />
<ClCompile Include="..\squirrel\sqvm.cpp" />
<ClCompile Include="..\thirdparty\imgui\misc\imgui_utility.cpp" />
<ClCompile Include="..\tier0\commandline.cpp" />
<ClCompile Include="..\tier0\cpu.cpp" />
@ -174,6 +170,11 @@
<ClCompile Include="..\vphysics\physics_collide.cpp" />
<ClCompile Include="..\vphysics\QHull.cpp" />
<ClCompile Include="..\vpklib\packedstore.cpp" />
<ClCompile Include="..\vscript\languages\squirrel_re\sqstdlib\sqstdaux.cpp" />
<ClCompile Include="..\vscript\languages\squirrel_re\squirrel\sqapi.cpp" />
<ClCompile Include="..\vscript\languages\squirrel_re\squirrel\sqvm.cpp" />
<ClCompile Include="..\vscript\languages\squirrel_re\vsquirrel.cpp" />
<ClCompile Include="..\vscript\vscript.cpp" />
<ClCompile Include="..\vstdlib\autocompletefilelist.cpp" />
<ClCompile Include="..\vstdlib\callback.cpp" />
<ClCompile Include="..\vstdlib\completion.cpp" />
@ -270,6 +271,7 @@
<ClInclude Include="..\game\shared\takedamageinfo.h" />
<ClInclude Include="..\game\shared\usercmd.h" />
<ClInclude Include="..\game\shared\util_shared.h" />
<ClInclude Include="..\game\shared\vscript_shared.h" />
<ClInclude Include="..\inputsystem\ButtonCode.h" />
<ClInclude Include="..\inputsystem\inputsystem.h" />
<ClInclude Include="..\launcher\IApplication.h" />
@ -358,7 +360,6 @@
<ClInclude Include="..\public\isnapshotmgr.h" />
<ClInclude Include="..\public\isurfacesystem.h" />
<ClInclude Include="..\public\ivrenderview.h" />
<ClInclude Include="..\public\ivscript.h" />
<ClInclude Include="..\public\materialsystem\shader_vcs_version.h" />
<ClInclude Include="..\public\model_types.h" />
<ClInclude Include="..\public\networkvar.h" />
@ -425,13 +426,6 @@
<ClInclude Include="..\rtech\rtech_game.h" />
<ClInclude Include="..\rtech\rui\rui.h" />
<ClInclude Include="..\rtech\stryder\stryder.h" />
<ClInclude Include="..\squirrel\sqapi.h" />
<ClInclude Include="..\squirrel\sqinit.h" />
<ClInclude Include="..\squirrel\sqscript.h" />
<ClInclude Include="..\squirrel\sqstate.h" />
<ClInclude Include="..\squirrel\sqstdaux.h" />
<ClInclude Include="..\squirrel\sqtype.h" />
<ClInclude Include="..\squirrel\sqvm.h" />
<ClInclude Include="..\studiorender\studiorendercontext.h" />
<ClInclude Include="..\thirdparty\detours\include\detours.h" />
<ClInclude Include="..\thirdparty\detours\include\detver.h" />
@ -529,6 +523,12 @@
<ClInclude Include="..\vpc\rson.h" />
<ClInclude Include="..\vphysics\QHull.h" />
<ClInclude Include="..\vpklib\packedstore.h" />
<ClInclude Include="..\vscript\languages\squirrel_re\include\sqstate.h" />
<ClInclude Include="..\vscript\languages\squirrel_re\include\sqstdaux.h" />
<ClInclude Include="..\vscript\languages\squirrel_re\include\squirrel.h" />
<ClInclude Include="..\vscript\languages\squirrel_re\include\sqvm.h" />
<ClInclude Include="..\vscript\languages\squirrel_re\vsquirrel.h" />
<ClInclude Include="..\vscript\vscript.h" />
<ClInclude Include="..\vstdlib\autocompletefilelist.h" />
<ClInclude Include="..\vstdlib\callback.h" />
<ClInclude Include="..\vstdlib\completion.h" />

View File

@ -37,9 +37,6 @@
<Filter Include="sdk\networksystem">
<UniqueIdentifier>{1dd9c7b9-1abc-412a-8e85-928c0d017beb}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\squirrel">
<UniqueIdentifier>{10a04e38-fd13-476b-92ea-ebbe60803ef6}</UniqueIdentifier>
</Filter>
<Filter Include="thirdparty">
<UniqueIdentifier>{7977cef5-28c7-40ca-be44-394d9f1b75de}</UniqueIdentifier>
</Filter>
@ -235,6 +232,24 @@
<Filter Include="sdk\engine\shared">
<UniqueIdentifier>{bef90121-4004-47a7-b338-a41ca8078c12}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\vscript">
<UniqueIdentifier>{d5557b58-8087-492b-9533-5a1dfc6343fd}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\vscript\languages">
<UniqueIdentifier>{5bf8626a-6284-41ad-87e1-8b71f172a8d3}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\vscript\languages\squirrel_re">
<UniqueIdentifier>{df576a65-b36a-4ec9-85e2-323013dcc28c}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\vscript\languages\squirrel_re\include">
<UniqueIdentifier>{98d73628-844c-410a-8e4e-7110df82ec6c}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\vscript\languages\squirrel_re\sqstdlib">
<UniqueIdentifier>{88ac540f-8a32-4197-b135-b81d474114a6}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\vscript\languages\squirrel_re\squirrel">
<UniqueIdentifier>{6d8704d4-c50e-4eca-81bf-d3f01afcf84c}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\client\cdll_engine_int.cpp">
@ -273,12 +288,6 @@
<ClCompile Include="..\launcher\IApplication.cpp">
<Filter>sdk\launcher</Filter>
</ClCompile>
<ClCompile Include="..\squirrel\sqvm.cpp">
<Filter>sdk\squirrel</Filter>
</ClCompile>
<ClCompile Include="..\squirrel\sqapi.cpp">
<Filter>sdk\squirrel</Filter>
</ClCompile>
<ClCompile Include="..\vgui\vgui_fpspanel.cpp">
<Filter>sdk\vgui</Filter>
</ClCompile>
@ -321,9 +330,6 @@
<ClCompile Include="..\mathlib\IceKey.cpp">
<Filter>sdk\mathlib</Filter>
</ClCompile>
<ClCompile Include="..\squirrel\sqinit.cpp">
<Filter>sdk\squirrel</Filter>
</ClCompile>
<ClCompile Include="..\vpklib\packedstore.cpp">
<Filter>sdk\vpklib</Filter>
</ClCompile>
@ -468,9 +474,6 @@
<ClCompile Include="..\game\shared\animation.cpp">
<Filter>sdk\game\shared</Filter>
</ClCompile>
<ClCompile Include="..\squirrel\sqstdaux.cpp">
<Filter>sdk\squirrel</Filter>
</ClCompile>
<ClCompile Include="..\engine\clockdriftmgr.cpp">
<Filter>sdk\engine</Filter>
</ClCompile>
@ -492,9 +495,6 @@
<ClCompile Include="..\tier1\strtools.cpp">
<Filter>sdk\tier1</Filter>
</ClCompile>
<ClCompile Include="..\squirrel\sqscript.cpp">
<Filter>sdk\squirrel</Filter>
</ClCompile>
<ClCompile Include="..\mathlib\sha1.cpp">
<Filter>sdk\mathlib</Filter>
</ClCompile>
@ -696,6 +696,24 @@
<ClCompile Include="..\engine\shared\shared_rcon.cpp">
<Filter>sdk\engine\shared</Filter>
</ClCompile>
<ClCompile Include="..\game\shared\vscript_shared.cpp">
<Filter>sdk\game\shared</Filter>
</ClCompile>
<ClCompile Include="..\vscript\vscript.cpp">
<Filter>sdk\vscript</Filter>
</ClCompile>
<ClCompile Include="..\vscript\languages\squirrel_re\vsquirrel.cpp">
<Filter>sdk\vscript\languages\squirrel_re</Filter>
</ClCompile>
<ClCompile Include="..\vscript\languages\squirrel_re\squirrel\sqapi.cpp">
<Filter>sdk\vscript\languages\squirrel_re\squirrel</Filter>
</ClCompile>
<ClCompile Include="..\vscript\languages\squirrel_re\squirrel\sqvm.cpp">
<Filter>sdk\vscript\languages\squirrel_re\squirrel</Filter>
</ClCompile>
<ClCompile Include="..\vscript\languages\squirrel_re\sqstdlib\sqstdaux.cpp">
<Filter>sdk\vscript\languages\squirrel_re\sqstdlib</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\client\cdll_engine_int.h">
@ -746,12 +764,6 @@
<ClInclude Include="..\networksystem\sm_protocol.h">
<Filter>sdk\networksystem</Filter>
</ClInclude>
<ClInclude Include="..\squirrel\sqapi.h">
<Filter>sdk\squirrel</Filter>
</ClInclude>
<ClInclude Include="..\squirrel\sqvm.h">
<Filter>sdk\squirrel</Filter>
</ClInclude>
<ClInclude Include="..\thirdparty\detours\include\detver.h">
<Filter>thirdparty\detours\include</Filter>
</ClInclude>
@ -821,9 +833,6 @@
<ClInclude Include="..\mathlib\parallel_for.h">
<Filter>sdk\mathlib</Filter>
</ClInclude>
<ClInclude Include="..\squirrel\sqinit.h">
<Filter>sdk\squirrel</Filter>
</ClInclude>
<ClInclude Include="..\core\resource.h">
<Filter>core</Filter>
</ClInclude>
@ -1034,9 +1043,6 @@
<ClInclude Include="..\rtech\stryder\stryder.h">
<Filter>sdk\rtech\rui</Filter>
</ClInclude>
<ClInclude Include="..\squirrel\sqtype.h">
<Filter>sdk\squirrel</Filter>
</ClInclude>
<ClInclude Include="..\public\inetchannel.h">
<Filter>sdk\public</Filter>
</ClInclude>
@ -1244,9 +1250,6 @@
<ClInclude Include="..\thirdparty\nlohmann\detail\output\binary_writer.hpp">
<Filter>thirdparty\nlohmann\detail\output</Filter>
</ClInclude>
<ClInclude Include="..\squirrel\sqstdaux.h">
<Filter>sdk\squirrel</Filter>
</ClInclude>
<ClInclude Include="..\engine\framesnapshot.h">
<Filter>sdk\engine</Filter>
</ClInclude>
@ -1262,9 +1265,6 @@
<ClInclude Include="..\public\inetmsghandler.h">
<Filter>sdk\public</Filter>
</ClInclude>
<ClInclude Include="..\squirrel\sqstate.h">
<Filter>sdk\squirrel</Filter>
</ClInclude>
<ClInclude Include="..\engine\client\client.h">
<Filter>sdk\engine\client</Filter>
</ClInclude>
@ -1283,9 +1283,6 @@
<ClInclude Include="..\vpc\kvleaktrace.h">
<Filter>sdk\vpc</Filter>
</ClInclude>
<ClInclude Include="..\squirrel\sqscript.h">
<Filter>sdk\squirrel</Filter>
</ClInclude>
<ClInclude Include="..\mathlib\sha1.h">
<Filter>sdk\mathlib</Filter>
</ClInclude>
@ -1358,9 +1355,6 @@
<ClInclude Include="..\public\icliententity.h">
<Filter>sdk\public</Filter>
</ClInclude>
<ClInclude Include="..\public\ivscript.h">
<Filter>sdk\public</Filter>
</ClInclude>
<ClInclude Include="..\public\iconcommand.h">
<Filter>sdk\public</Filter>
</ClInclude>
@ -1760,6 +1754,27 @@
<ClInclude Include="..\engine\shared\base_rcon.h">
<Filter>sdk\engine\shared</Filter>
</ClInclude>
<ClInclude Include="..\game\shared\vscript_shared.h">
<Filter>sdk\game\shared</Filter>
</ClInclude>
<ClInclude Include="..\vscript\vscript.h">
<Filter>sdk\vscript</Filter>
</ClInclude>
<ClInclude Include="..\vscript\languages\squirrel_re\vsquirrel.h">
<Filter>sdk\vscript\languages\squirrel_re</Filter>
</ClInclude>
<ClInclude Include="..\vscript\languages\squirrel_re\include\squirrel.h">
<Filter>sdk\vscript\languages\squirrel_re\include</Filter>
</ClInclude>
<ClInclude Include="..\vscript\languages\squirrel_re\include\sqvm.h">
<Filter>sdk\vscript\languages\squirrel_re\include</Filter>
</ClInclude>
<ClInclude Include="..\vscript\languages\squirrel_re\include\sqstate.h">
<Filter>sdk\vscript\languages\squirrel_re\include</Filter>
</ClInclude>
<ClInclude Include="..\vscript\languages\squirrel_re\include\sqstdaux.h">
<Filter>sdk\vscript\languages\squirrel_re\include</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Image Include="..\shared\resource\lockedserver.png">

View File

@ -285,6 +285,7 @@
<ClInclude Include="..\game\shared\takedamageinfo.h" />
<ClInclude Include="..\game\shared\usercmd.h" />
<ClInclude Include="..\game\shared\util_shared.h" />
<ClInclude Include="..\game\shared\vscript_shared.h" />
<ClInclude Include="..\launcher\IApplication.h" />
<ClInclude Include="..\launcher\launcher.h" />
<ClInclude Include="..\launcher\prx.h" />
@ -358,7 +359,6 @@
<ClInclude Include="..\public\iservernetworkable.h" />
<ClInclude Include="..\public\iserverunknown.h" />
<ClInclude Include="..\public\isnapshotmgr.h" />
<ClInclude Include="..\public\ivscript.h" />
<ClInclude Include="..\public\model_types.h" />
<ClInclude Include="..\public\networkvar.h" />
<ClInclude Include="..\public\playerstate.h" />
@ -425,13 +425,6 @@
<ClInclude Include="..\rtech\stryder\stryder.h" />
<ClInclude Include="..\server\persistence.h" />
<ClInclude Include="..\server\vengineserver_impl.h" />
<ClInclude Include="..\squirrel\sqapi.h" />
<ClInclude Include="..\squirrel\sqinit.h" />
<ClInclude Include="..\squirrel\sqscript.h" />
<ClInclude Include="..\squirrel\sqstate.h" />
<ClInclude Include="..\squirrel\sqstdaux.h" />
<ClInclude Include="..\squirrel\sqtype.h" />
<ClInclude Include="..\squirrel\sqvm.h" />
<ClInclude Include="..\thirdparty\detours\include\detours.h" />
<ClInclude Include="..\thirdparty\detours\include\detver.h" />
<ClInclude Include="..\thirdparty\detours\include\idetour.h" />
@ -522,6 +515,12 @@
<ClInclude Include="..\vpc\rson.h" />
<ClInclude Include="..\vphysics\QHull.h" />
<ClInclude Include="..\vpklib\packedstore.h" />
<ClInclude Include="..\vscript\languages\squirrel_re\include\sqstate.h" />
<ClInclude Include="..\vscript\languages\squirrel_re\include\sqstdaux.h" />
<ClInclude Include="..\vscript\languages\squirrel_re\include\squirrel.h" />
<ClInclude Include="..\vscript\languages\squirrel_re\include\sqvm.h" />
<ClInclude Include="..\vscript\languages\squirrel_re\vsquirrel.h" />
<ClInclude Include="..\vscript\vscript.h" />
<ClInclude Include="..\vstdlib\autocompletefilelist.h" />
<ClInclude Include="..\vstdlib\callback.h" />
<ClInclude Include="..\vstdlib\completion.h" />
@ -586,6 +585,7 @@
<ClCompile Include="..\game\shared\collisionproperty.cpp" />
<ClCompile Include="..\game\shared\entitylist_base.cpp" />
<ClCompile Include="..\game\shared\util_shared.cpp" />
<ClCompile Include="..\game\shared\vscript_shared.cpp" />
<ClCompile Include="..\launcher\IApplication.cpp" />
<ClCompile Include="..\launcher\launcher.cpp" />
<ClCompile Include="..\launcher\prx.cpp" />
@ -640,11 +640,6 @@
<ClCompile Include="..\rtech\stryder\stryder.cpp" />
<ClCompile Include="..\server\persistence.cpp" />
<ClCompile Include="..\server\vengineserver_impl.cpp" />
<ClCompile Include="..\squirrel\sqapi.cpp" />
<ClCompile Include="..\squirrel\sqinit.cpp" />
<ClCompile Include="..\squirrel\sqscript.cpp" />
<ClCompile Include="..\squirrel\sqstdaux.cpp" />
<ClCompile Include="..\squirrel\sqvm.cpp" />
<ClCompile Include="..\tier0\commandline.cpp" />
<ClCompile Include="..\tier0\cpu.cpp" />
<ClCompile Include="..\tier0\cputopology.cpp" />
@ -676,6 +671,11 @@
<ClCompile Include="..\vphysics\physics_collide.cpp" />
<ClCompile Include="..\vphysics\QHull.cpp" />
<ClCompile Include="..\vpklib\packedstore.cpp" />
<ClCompile Include="..\vscript\languages\squirrel_re\sqstdlib\sqstdaux.cpp" />
<ClCompile Include="..\vscript\languages\squirrel_re\squirrel\sqapi.cpp" />
<ClCompile Include="..\vscript\languages\squirrel_re\squirrel\sqvm.cpp" />
<ClCompile Include="..\vscript\languages\squirrel_re\vsquirrel.cpp" />
<ClCompile Include="..\vscript\vscript.cpp" />
<ClCompile Include="..\vstdlib\autocompletefilelist.cpp" />
<ClCompile Include="..\vstdlib\callback.cpp" />
<ClCompile Include="..\vstdlib\completion.cpp" />

View File

@ -28,9 +28,6 @@
<Filter Include="sdk\server">
<UniqueIdentifier>{8786ae3f-91d3-4eb8-89b7-e2135d143faa}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\squirrel">
<UniqueIdentifier>{e88d652e-34a0-44a0-a886-8861315c5b4f}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\tier0">
<UniqueIdentifier>{9dc16eaa-182b-42ea-9524-8cc8421829b6}</UniqueIdentifier>
</Filter>
@ -184,6 +181,24 @@
<Filter Include="sdk\engine\shared">
<UniqueIdentifier>{4bccf09c-4f8b-4d7e-ab72-54fd8c1fb5cf}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\vscript">
<UniqueIdentifier>{b63095aa-67e5-4b31-bcfe-05fa3129e463}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\vscript\languages">
<UniqueIdentifier>{5d42095d-1e80-46a9-ac69-8bf90d465576}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\vscript\languages\squirrel_re">
<UniqueIdentifier>{827424d4-205c-4b16-8014-395a7bb9ff59}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\vscript\languages\squirrel_re\include">
<UniqueIdentifier>{368a28a5-fc39-4b8d-9d5c-c3c6367460c6}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\vscript\languages\squirrel_re\sqstdlib">
<UniqueIdentifier>{d124ed64-2bcf-4234-b17c-58fed3737c5c}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\vscript\languages\squirrel_re\squirrel">
<UniqueIdentifier>{4cdd5e98-d7f6-4109-9d68-f060bea42e99}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\common\opcodes.h">
@ -240,12 +255,6 @@
<ClInclude Include="..\server\vengineserver_impl.h">
<Filter>sdk\server</Filter>
</ClInclude>
<ClInclude Include="..\squirrel\sqapi.h">
<Filter>sdk\squirrel</Filter>
</ClInclude>
<ClInclude Include="..\squirrel\sqvm.h">
<Filter>sdk\squirrel</Filter>
</ClInclude>
<ClInclude Include="..\thirdparty\detours\include\detours.h">
<Filter>thirdparty\detours\include</Filter>
</ClInclude>
@ -279,9 +288,6 @@
<ClInclude Include="..\mathlib\parallel_for.h">
<Filter>sdk\mathlib</Filter>
</ClInclude>
<ClInclude Include="..\squirrel\sqinit.h">
<Filter>sdk\squirrel</Filter>
</ClInclude>
<ClInclude Include="..\tier0\interface.h">
<Filter>sdk\tier0</Filter>
</ClInclude>
@ -489,9 +495,6 @@
<ClInclude Include="..\materialsystem\cmaterialsystem.h">
<Filter>sdk\materialsystem</Filter>
</ClInclude>
<ClInclude Include="..\squirrel\sqtype.h">
<Filter>sdk\squirrel</Filter>
</ClInclude>
<ClInclude Include="..\public\inetchannel.h">
<Filter>sdk\public</Filter>
</ClInclude>
@ -672,9 +675,6 @@
<ClInclude Include="..\thirdparty\nlohmann\detail\macro_scope.hpp">
<Filter>thirdparty\nlohmann\detail</Filter>
</ClInclude>
<ClInclude Include="..\squirrel\sqstdaux.h">
<Filter>sdk\squirrel</Filter>
</ClInclude>
<ClInclude Include="..\engine\framesnapshot.h">
<Filter>sdk\engine</Filter>
</ClInclude>
@ -690,9 +690,6 @@
<ClInclude Include="..\public\inetmsghandler.h">
<Filter>sdk\public</Filter>
</ClInclude>
<ClInclude Include="..\squirrel\sqstate.h">
<Filter>sdk\squirrel</Filter>
</ClInclude>
<ClInclude Include="..\engine\client\client.h">
<Filter>sdk\engine\client</Filter>
</ClInclude>
@ -714,9 +711,6 @@
<ClInclude Include="..\vpc\kvleaktrace.h">
<Filter>sdk\vpc</Filter>
</ClInclude>
<ClInclude Include="..\squirrel\sqscript.h">
<Filter>sdk\squirrel</Filter>
</ClInclude>
<ClInclude Include="..\mathlib\sha1.h">
<Filter>sdk\mathlib</Filter>
</ClInclude>
@ -768,9 +762,6 @@
<ClInclude Include="..\tier0\memstd.h">
<Filter>sdk\tier0</Filter>
</ClInclude>
<ClInclude Include="..\public\ivscript.h">
<Filter>sdk\public</Filter>
</ClInclude>
<ClInclude Include="..\public\iconvar.h">
<Filter>sdk\public</Filter>
</ClInclude>
@ -1155,6 +1146,27 @@
<ClInclude Include="..\engine\shared\shared_rcon.h">
<Filter>sdk\engine\shared</Filter>
</ClInclude>
<ClInclude Include="..\vscript\vscript.h">
<Filter>sdk\vscript</Filter>
</ClInclude>
<ClInclude Include="..\vscript\languages\squirrel_re\vsquirrel.h">
<Filter>sdk\vscript\languages\squirrel_re</Filter>
</ClInclude>
<ClInclude Include="..\vscript\languages\squirrel_re\include\sqstdaux.h">
<Filter>sdk\vscript\languages\squirrel_re\include</Filter>
</ClInclude>
<ClInclude Include="..\vscript\languages\squirrel_re\include\squirrel.h">
<Filter>sdk\vscript\languages\squirrel_re\include</Filter>
</ClInclude>
<ClInclude Include="..\vscript\languages\squirrel_re\include\sqvm.h">
<Filter>sdk\vscript\languages\squirrel_re\include</Filter>
</ClInclude>
<ClInclude Include="..\vscript\languages\squirrel_re\include\sqstate.h">
<Filter>sdk\vscript\languages\squirrel_re\include</Filter>
</ClInclude>
<ClInclude Include="..\game\shared\vscript_shared.h">
<Filter>sdk\game\shared</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\common\opcodes.cpp">
@ -1196,12 +1208,6 @@
<ClCompile Include="..\server\vengineserver_impl.cpp">
<Filter>sdk\server</Filter>
</ClCompile>
<ClCompile Include="..\squirrel\sqapi.cpp">
<Filter>sdk\squirrel</Filter>
</ClCompile>
<ClCompile Include="..\squirrel\sqvm.cpp">
<Filter>sdk\squirrel</Filter>
</ClCompile>
<ClCompile Include="..\vpc\IAppSystem.cpp">
<Filter>sdk\vpc</Filter>
</ClCompile>
@ -1217,9 +1223,6 @@
<ClCompile Include="..\mathlib\IceKey.cpp">
<Filter>sdk\mathlib</Filter>
</ClCompile>
<ClCompile Include="..\squirrel\sqinit.cpp">
<Filter>sdk\squirrel</Filter>
</ClCompile>
<ClCompile Include="..\vpklib\packedstore.cpp">
<Filter>sdk\vpklib</Filter>
</ClCompile>
@ -1346,9 +1349,6 @@
<ClCompile Include="..\game\shared\animation.cpp">
<Filter>sdk\game\shared</Filter>
</ClCompile>
<ClCompile Include="..\squirrel\sqstdaux.cpp">
<Filter>sdk\squirrel</Filter>
</ClCompile>
<ClCompile Include="..\engine\clockdriftmgr.cpp">
<Filter>sdk\engine</Filter>
</ClCompile>
@ -1373,9 +1373,6 @@
<ClCompile Include="..\tier1\strtools.cpp">
<Filter>sdk\tier1</Filter>
</ClCompile>
<ClCompile Include="..\squirrel\sqscript.cpp">
<Filter>sdk\squirrel</Filter>
</ClCompile>
<ClCompile Include="..\mathlib\sha1.cpp">
<Filter>sdk\mathlib</Filter>
</ClCompile>
@ -1562,6 +1559,24 @@
<ClCompile Include="..\engine\shared\shared_rcon.cpp">
<Filter>sdk\engine\shared</Filter>
</ClCompile>
<ClCompile Include="..\vscript\vscript.cpp">
<Filter>sdk\vscript</Filter>
</ClCompile>
<ClCompile Include="..\vscript\languages\squirrel_re\vsquirrel.cpp">
<Filter>sdk\vscript\languages\squirrel_re</Filter>
</ClCompile>
<ClCompile Include="..\vscript\languages\squirrel_re\sqstdlib\sqstdaux.cpp">
<Filter>sdk\vscript\languages\squirrel_re\sqstdlib</Filter>
</ClCompile>
<ClCompile Include="..\vscript\languages\squirrel_re\squirrel\sqapi.cpp">
<Filter>sdk\vscript\languages\squirrel_re\squirrel</Filter>
</ClCompile>
<ClCompile Include="..\vscript\languages\squirrel_re\squirrel\sqvm.cpp">
<Filter>sdk\vscript\languages\squirrel_re\squirrel</Filter>
</ClCompile>
<ClCompile Include="..\game\shared\vscript_shared.cpp">
<Filter>sdk\game\shared</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="..\Dedicated.def" />

View File

@ -91,6 +91,7 @@
<ClCompile Include="..\game\shared\collisionproperty.cpp" />
<ClCompile Include="..\game\shared\entitylist_base.cpp" />
<ClCompile Include="..\game\shared\util_shared.cpp" />
<ClCompile Include="..\game\shared\vscript_shared.cpp" />
<ClCompile Include="..\inputsystem\inputsystem.cpp" />
<ClCompile Include="..\launcher\IApplication.cpp" />
<ClCompile Include="..\launcher\launcher.cpp" />
@ -150,11 +151,6 @@
<ClCompile Include="..\rtech\stryder\stryder.cpp" />
<ClCompile Include="..\server\persistence.cpp" />
<ClCompile Include="..\server\vengineserver_impl.cpp" />
<ClCompile Include="..\squirrel\sqapi.cpp" />
<ClCompile Include="..\squirrel\sqinit.cpp" />
<ClCompile Include="..\squirrel\sqscript.cpp" />
<ClCompile Include="..\squirrel\sqstdaux.cpp" />
<ClCompile Include="..\squirrel\sqvm.cpp" />
<ClCompile Include="..\thirdparty\imgui\misc\imgui_utility.cpp" />
<ClCompile Include="..\tier0\commandline.cpp" />
<ClCompile Include="..\tier0\cpu.cpp" />
@ -193,6 +189,11 @@
<ClCompile Include="..\vphysics\physics_collide.cpp" />
<ClCompile Include="..\vphysics\QHull.cpp" />
<ClCompile Include="..\vpklib\packedstore.cpp" />
<ClCompile Include="..\vscript\languages\squirrel_re\sqstdlib\sqstdaux.cpp" />
<ClCompile Include="..\vscript\languages\squirrel_re\squirrel\sqapi.cpp" />
<ClCompile Include="..\vscript\languages\squirrel_re\squirrel\sqvm.cpp" />
<ClCompile Include="..\vscript\languages\squirrel_re\vsquirrel.cpp" />
<ClCompile Include="..\vscript\vscript.cpp" />
<ClCompile Include="..\vstdlib\autocompletefilelist.cpp" />
<ClCompile Include="..\vstdlib\callback.cpp" />
<ClCompile Include="..\vstdlib\completion.cpp" />
@ -312,6 +313,7 @@
<ClInclude Include="..\game\shared\takedamageinfo.h" />
<ClInclude Include="..\game\shared\usercmd.h" />
<ClInclude Include="..\game\shared\util_shared.h" />
<ClInclude Include="..\game\shared\vscript_shared.h" />
<ClInclude Include="..\inputsystem\ButtonCode.h" />
<ClInclude Include="..\inputsystem\inputsystem.h" />
<ClInclude Include="..\launcher\IApplication.h" />
@ -410,7 +412,6 @@
<ClInclude Include="..\public\isnapshotmgr.h" />
<ClInclude Include="..\public\isurfacesystem.h" />
<ClInclude Include="..\public\ivrenderview.h" />
<ClInclude Include="..\public\ivscript.h" />
<ClInclude Include="..\public\materialsystem\shader_vcs_version.h" />
<ClInclude Include="..\public\model_types.h" />
<ClInclude Include="..\public\networkvar.h" />
@ -473,6 +474,7 @@
<ClInclude Include="..\public\utility\sigcache.h" />
<ClInclude Include="..\public\utility\utility.h" />
<ClInclude Include="..\public\utility\vtable.h" />
<ClInclude Include="..\public\vscript\ivscript.h" />
<ClInclude Include="..\public\worldsize.h" />
<ClInclude Include="..\rtech\rtech_utils.h" />
<ClInclude Include="..\rtech\rtech_game.h" />
@ -480,13 +482,6 @@
<ClInclude Include="..\rtech\stryder\stryder.h" />
<ClInclude Include="..\server\persistence.h" />
<ClInclude Include="..\server\vengineserver_impl.h" />
<ClInclude Include="..\squirrel\sqapi.h" />
<ClInclude Include="..\squirrel\sqinit.h" />
<ClInclude Include="..\squirrel\sqscript.h" />
<ClInclude Include="..\squirrel\sqstate.h" />
<ClInclude Include="..\squirrel\sqstdaux.h" />
<ClInclude Include="..\squirrel\sqtype.h" />
<ClInclude Include="..\squirrel\sqvm.h" />
<ClInclude Include="..\studiorender\studiorendercontext.h" />
<ClInclude Include="..\thirdparty\detours\include\detours.h" />
<ClInclude Include="..\thirdparty\detours\include\detver.h" />
@ -583,6 +578,12 @@
<ClInclude Include="..\vpc\rson.h" />
<ClInclude Include="..\vphysics\QHull.h" />
<ClInclude Include="..\vpklib\packedstore.h" />
<ClInclude Include="..\vscript\languages\squirrel_re\include\sqstate.h" />
<ClInclude Include="..\vscript\languages\squirrel_re\include\sqstdaux.h" />
<ClInclude Include="..\vscript\languages\squirrel_re\include\squirrel.h" />
<ClInclude Include="..\vscript\languages\squirrel_re\include\sqvm.h" />
<ClInclude Include="..\vscript\languages\squirrel_re\vsquirrel.h" />
<ClInclude Include="..\vscript\vscript.h" />
<ClInclude Include="..\vstdlib\autocompletefilelist.h" />
<ClInclude Include="..\vstdlib\callback.h" />
<ClInclude Include="..\vstdlib\completion.h" />

View File

@ -40,9 +40,6 @@
<Filter Include="sdk\server">
<UniqueIdentifier>{525505fd-c8bb-453c-8cce-e11123499ae9}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\squirrel">
<UniqueIdentifier>{10a04e38-fd13-476b-92ea-ebbe60803ef6}</UniqueIdentifier>
</Filter>
<Filter Include="thirdparty">
<UniqueIdentifier>{7977cef5-28c7-40ca-be44-394d9f1b75de}</UniqueIdentifier>
</Filter>
@ -244,6 +241,27 @@
<Filter Include="sdk\engine\shared">
<UniqueIdentifier>{f3335ce8-0956-4d3c-9d12-ca2bd5646d8c}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\public\vscript">
<UniqueIdentifier>{306af380-9492-405e-975f-b4d8f8edb33c}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\vscript">
<UniqueIdentifier>{06713de9-e726-48d4-876f-6be67af39e24}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\vscript\languages">
<UniqueIdentifier>{0cf85fa4-0555-46fa-85d3-810380aa3278}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\vscript\languages\squirrel_re">
<UniqueIdentifier>{5d93bf0c-25a1-486d-bdf8-4de0f2bf1b7d}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\vscript\languages\squirrel_re\squirrel">
<UniqueIdentifier>{8ae5d70b-05b8-46db-8546-0a1d0cd207f2}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\vscript\languages\squirrel_re\sqstdlib">
<UniqueIdentifier>{d4aaa740-265b-4125-8b3d-9439a3d4bdf8}</UniqueIdentifier>
</Filter>
<Filter Include="sdk\vscript\languages\squirrel_re\include">
<UniqueIdentifier>{e0afe585-b0c4-4647-af69-1fa709d7e080}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\client\vengineclient_impl.cpp">
@ -288,12 +306,6 @@
<ClCompile Include="..\server\vengineserver_impl.cpp">
<Filter>sdk\server</Filter>
</ClCompile>
<ClCompile Include="..\squirrel\sqvm.cpp">
<Filter>sdk\squirrel</Filter>
</ClCompile>
<ClCompile Include="..\squirrel\sqapi.cpp">
<Filter>sdk\squirrel</Filter>
</ClCompile>
<ClCompile Include="..\vgui\vgui_fpspanel.cpp">
<Filter>sdk\vgui</Filter>
</ClCompile>
@ -336,9 +348,6 @@
<ClCompile Include="..\mathlib\IceKey.cpp">
<Filter>sdk\mathlib</Filter>
</ClCompile>
<ClCompile Include="..\squirrel\sqinit.cpp">
<Filter>sdk\squirrel</Filter>
</ClCompile>
<ClCompile Include="..\vpklib\packedstore.cpp">
<Filter>sdk\vpklib</Filter>
</ClCompile>
@ -492,9 +501,6 @@
<ClCompile Include="..\game\shared\animation.cpp">
<Filter>sdk\game\shared</Filter>
</ClCompile>
<ClCompile Include="..\squirrel\sqstdaux.cpp">
<Filter>sdk\squirrel</Filter>
</ClCompile>
<ClCompile Include="..\engine\clockdriftmgr.cpp">
<Filter>sdk\engine</Filter>
</ClCompile>
@ -522,9 +528,6 @@
<ClCompile Include="..\tier1\strtools.cpp">
<Filter>sdk\tier1</Filter>
</ClCompile>
<ClCompile Include="..\squirrel\sqscript.cpp">
<Filter>sdk\squirrel</Filter>
</ClCompile>
<ClCompile Include="..\mathlib\sha1.cpp">
<Filter>sdk\mathlib</Filter>
</ClCompile>
@ -762,6 +765,24 @@
<ClCompile Include="..\engine\shared\shared_rcon.cpp">
<Filter>sdk\engine\shared</Filter>
</ClCompile>
<ClCompile Include="..\vscript\vscript.cpp">
<Filter>sdk\vscript</Filter>
</ClCompile>
<ClCompile Include="..\game\shared\vscript_shared.cpp">
<Filter>sdk\game\shared</Filter>
</ClCompile>
<ClCompile Include="..\vscript\languages\squirrel_re\squirrel\sqvm.cpp">
<Filter>sdk\vscript\languages\squirrel_re\squirrel</Filter>
</ClCompile>
<ClCompile Include="..\vscript\languages\squirrel_re\squirrel\sqapi.cpp">
<Filter>sdk\vscript\languages\squirrel_re\squirrel</Filter>
</ClCompile>
<ClCompile Include="..\vscript\languages\squirrel_re\sqstdlib\sqstdaux.cpp">
<Filter>sdk\vscript\languages\squirrel_re\sqstdlib</Filter>
</ClCompile>
<ClCompile Include="..\vscript\languages\squirrel_re\vsquirrel.cpp">
<Filter>sdk\vscript\languages\squirrel_re</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\client\cdll_engine_int.h">
@ -818,12 +839,6 @@
<ClInclude Include="..\server\vengineserver_impl.h">
<Filter>sdk\server</Filter>
</ClInclude>
<ClInclude Include="..\squirrel\sqapi.h">
<Filter>sdk\squirrel</Filter>
</ClInclude>
<ClInclude Include="..\squirrel\sqvm.h">
<Filter>sdk\squirrel</Filter>
</ClInclude>
<ClInclude Include="..\thirdparty\detours\include\detver.h">
<Filter>thirdparty\detours\include</Filter>
</ClInclude>
@ -893,9 +908,6 @@
<ClInclude Include="..\mathlib\parallel_for.h">
<Filter>sdk\mathlib</Filter>
</ClInclude>
<ClInclude Include="..\squirrel\sqinit.h">
<Filter>sdk\squirrel</Filter>
</ClInclude>
<ClInclude Include="..\core\resource.h">
<Filter>core</Filter>
</ClInclude>
@ -1124,9 +1136,6 @@
<ClInclude Include="..\rtech\stryder\stryder.h">
<Filter>sdk\rtech\stryder</Filter>
</ClInclude>
<ClInclude Include="..\squirrel\sqtype.h">
<Filter>sdk\squirrel</Filter>
</ClInclude>
<ClInclude Include="..\public\inetchannel.h">
<Filter>sdk\public</Filter>
</ClInclude>
@ -1334,9 +1343,6 @@
<ClInclude Include="..\thirdparty\nlohmann\detail\output\binary_writer.hpp">
<Filter>thirdparty\nlohmann\detail\output</Filter>
</ClInclude>
<ClInclude Include="..\squirrel\sqstdaux.h">
<Filter>sdk\squirrel</Filter>
</ClInclude>
<ClInclude Include="..\engine\clockdriftmgr.h">
<Filter>sdk\engine</Filter>
</ClInclude>
@ -1352,9 +1358,6 @@
<ClInclude Include="..\public\inetmsghandler.h">
<Filter>sdk\public</Filter>
</ClInclude>
<ClInclude Include="..\squirrel\sqstate.h">
<Filter>sdk\squirrel</Filter>
</ClInclude>
<ClInclude Include="..\engine\server\sv_main.h">
<Filter>sdk\engine\server</Filter>
</ClInclude>
@ -1382,9 +1385,6 @@
<ClInclude Include="..\vpc\kvleaktrace.h">
<Filter>sdk\vpc</Filter>
</ClInclude>
<ClInclude Include="..\squirrel\sqscript.h">
<Filter>sdk\squirrel</Filter>
</ClInclude>
<ClInclude Include="..\mathlib\sha1.h">
<Filter>sdk\mathlib</Filter>
</ClInclude>
@ -1466,9 +1466,6 @@
<ClInclude Include="..\public\iclientrenderable.h">
<Filter>sdk\public</Filter>
</ClInclude>
<ClInclude Include="..\public\ivscript.h">
<Filter>sdk\public</Filter>
</ClInclude>
<ClInclude Include="..\game\client\viewrender.h">
<Filter>sdk\game\client</Filter>
</ClInclude>
@ -1931,6 +1928,30 @@
<ClInclude Include="..\engine\shared\shared_rcon.h">
<Filter>sdk\engine\shared</Filter>
</ClInclude>
<ClInclude Include="..\public\vscript\ivscript.h">
<Filter>sdk\public\vscript</Filter>
</ClInclude>
<ClInclude Include="..\vscript\vscript.h">
<Filter>sdk\vscript</Filter>
</ClInclude>
<ClInclude Include="..\game\shared\vscript_shared.h">
<Filter>sdk\game\shared</Filter>
</ClInclude>
<ClInclude Include="..\vscript\languages\squirrel_re\include\sqstdaux.h">
<Filter>sdk\vscript\languages\squirrel_re\include</Filter>
</ClInclude>
<ClInclude Include="..\vscript\languages\squirrel_re\include\squirrel.h">
<Filter>sdk\vscript\languages\squirrel_re\include</Filter>
</ClInclude>
<ClInclude Include="..\vscript\languages\squirrel_re\include\sqstate.h">
<Filter>sdk\vscript\languages\squirrel_re\include</Filter>
</ClInclude>
<ClInclude Include="..\vscript\languages\squirrel_re\include\sqvm.h">
<Filter>sdk\vscript\languages\squirrel_re\include</Filter>
</ClInclude>
<ClInclude Include="..\vscript\languages\squirrel_re\vsquirrel.h">
<Filter>sdk\vscript\languages\squirrel_re</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Image Include="..\shared\resource\lockedserver.png">

View File

@ -1,6 +1,6 @@
#ifndef SQSTATE_H
#define SQSTATE_H
#include "squirrel/sqtype.h"
#include "squirrel.h"
#pragma pack(push, 1)
struct SQSharedState

View File

@ -1,5 +1,5 @@
#pragma once
#include "sqtype.h"
#include "squirrel.h"
#include "sqvm.h"
extern bool g_bSQAuxError;
@ -13,7 +13,7 @@ inline CMemory p_sqstd_aux_badlogic;
inline auto v_sqstd_aux_badlogic = p_sqstd_aux_badlogic.RCast<SQInteger(*)(HSQUIRRELVM v, __m128i* a2, __m128i* a3)>();
///////////////////////////////////////////////////////////////////////////////
class VSqStdAux : public IDetour
class VSquirrelAUX : public IDetour
{
virtual void GetAdr(void) const
{

View File

@ -1,6 +1,32 @@
#pragma once
#include "squirrel/sqtype.h"
#include "squirrel/sqvm.h"
#ifndef SQTYPE_H
#define SQTYPE_H
#define SQ_OK (1)
#define SQ_ERROR (-1)
#define SQ_FAILED(res) (res<0)
#define SQ_SUCCEEDED(res) (res>=0)
#define SQ_SUSPEND_FLAG -666
#define SQ_TAILCALL_FLAG -777
#define DONT_FALL_BACK 666
//#define EXISTS_FALL_BACK -1
#define GET_FLAG_RAW 0x00000001
#define GET_FLAG_DO_NOT_RAISE_ERROR 0x00000002
typedef char SQChar;
typedef float SQFloat;
typedef long SQInteger;
typedef unsigned long SQUnsignedInteger;
typedef void* SQFunctor;
typedef SQUnsignedInteger SQBool;
typedef SQInteger SQRESULT;
typedef int ScriptDataType_t;
typedef struct SQVM* HSQUIRRELVM;
struct SQBufState;
///////////////////////////////////////////////////////////////////////////////
SQRESULT sq_pushroottable(HSQUIRRELVM v);
@ -53,7 +79,7 @@ inline CMemory p_sq_call;
inline auto v_sq_call = p_sq_call.RCast<SQRESULT(*)(HSQUIRRELVM v, SQInteger params, SQBool retval, SQBool raiseerror)>();
///////////////////////////////////////////////////////////////////////////////
class VSqapi : public IDetour
class VSquirrelAPI : public IDetour
{
virtual void GetAdr(void) const
{
@ -110,3 +136,4 @@ class VSqapi : public IDetour
virtual void Detach(void) const;
};
///////////////////////////////////////////////////////////////////////////////
#endif // SQTYPE_H

View File

@ -1,9 +1,17 @@
#pragma once
#include "squirrel/sqtype.h"
#include "squirrel/sqstate.h"
#ifndef DEDICATED
#include "client/cdll_engine_int.h"
#endif // !DEDICATED
#include "squirrel.h"
#include "sqstate.h"
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
enum class SQCONTEXT : SQInteger
{
SERVER = 0,
CLIENT,
UI,
NONE
};
struct SQVM
{
@ -55,7 +63,6 @@ struct SQVM
#endif
SQInteger _nnativecalls;
};
typedef SQVM* HSQUIRRELVM;
/* ==== SQUIRREL ======================================================================================================================================================== */
inline CMemory p_SQVM_PrintFunc;
@ -90,7 +97,7 @@ const SQChar* SQVM_GetContextName(SQCONTEXT context);
const SQCONTEXT SQVM_GetContextIndex(HSQUIRRELVM v);
///////////////////////////////////////////////////////////////////////////////
class HSQVM : public IDetour
class VSquirrelVM : public IDetour
{
virtual void GetAdr(void) const
{

View File

@ -6,8 +6,8 @@
#include "core/stdafx.h"
#include "tier0/tslist.h"
#include "squirrel/sqvm.h"
#include "squirrel/sqstdaux.h"
#include "vscript/languages/squirrel_re/include/sqvm.h"
#include "vscript/languages/squirrel_re/include/sqstdaux.h"
bool g_bSQAuxError = false;
bool g_bSQAuxBadLogic = false;
@ -29,13 +29,13 @@ SQInteger sqstd_aux_badlogic(HSQUIRRELVM v, __m128i* a2, __m128i* a3)
return results;
}
void VSqStdAux::Attach() const
void VSquirrelAUX::Attach() const
{
DetourAttach(&v_sqstd_aux_printerror, &sqstd_aux_printerror);
DetourAttach(&v_sqstd_aux_badlogic, &sqstd_aux_badlogic);
}
void VSqStdAux::Detach() const
void VSquirrelAUX::Detach() const
{
DetourDetach(&v_sqstd_aux_printerror, &sqstd_aux_printerror);
DetourDetach(&v_sqstd_aux_badlogic, &sqstd_aux_badlogic);

View File

@ -5,8 +5,8 @@
//=============================================================================//
#include "core/stdafx.h"
#include "squirrel/sqapi.h"
#include "squirrel/sqtype.h"
#include "vscript/languages/squirrel_re/include/squirrel.h"
#include "vscript/languages/squirrel_re/include/sqvm.h"
//---------------------------------------------------------------------------------
SQChar* sq_getstring(HSQUIRRELVM v, SQInteger i)
@ -86,7 +86,7 @@ SQRESULT sq_call(HSQUIRRELVM v, SQInteger params, SQBool retval, SQBool raiseerr
return v_sq_call(v, params, retval, raiseerror);
}
void VSqapi::Attach() const
void VSquirrelAPI::Attach() const
{
DetourAttach(&v_sq_pushroottable, &sq_pushroottable);
DetourAttach(&v_sq_pushbool, &sq_pushbool);
@ -101,7 +101,7 @@ void VSqapi::Attach() const
DetourAttach(&v_sq_call, &sq_call);
}
void VSqapi::Detach() const
void VSquirrelAPI::Detach() const
{
DetourDetach(&v_sq_pushroottable, &sq_pushroottable);
DetourDetach(&v_sq_pushbool, &sq_pushbool);

View File

@ -17,11 +17,10 @@
#include "vgui/vgui_debugpanel.h"
#include "gameui/IConsole.h"
#endif // !DEDICATED
#include "squirrel/sqtype.h"
#include "squirrel/sqvm.h"
#include "squirrel/sqinit.h"
#include "squirrel/sqstdaux.h"
#include "squirrel/sqstate.h"
#include "vscript/languages/squirrel_re/include/squirrel.h"
#include "vscript/languages/squirrel_re/include/sqvm.h"
#include "vscript/languages/squirrel_re/include/sqstate.h"
#include "vscript/languages/squirrel_re/include/sqstdaux.h"
//---------------------------------------------------------------------------------
// Purpose: prints the output of each VM to the console
@ -213,7 +212,7 @@ const SQCONTEXT SQVM_GetContextIndex(HSQUIRRELVM v)
}
//---------------------------------------------------------------------------------
void HSQVM::Attach() const
void VSquirrelVM::Attach() const
{
DetourAttach((LPVOID*)&v_SQVM_PrintFunc, &SQVM_PrintFunc);
DetourAttach((LPVOID*)&v_SQVM_WarningFunc, &SQVM_WarningFunc);
@ -221,7 +220,7 @@ void HSQVM::Attach() const
DetourAttach((LPVOID*)&v_SQVM_LogicError, &SQVM_LogicError);
}
//---------------------------------------------------------------------------------
void HSQVM::Detach() const
void VSquirrelVM::Detach() const
{
DetourDetach((LPVOID*)&v_SQVM_PrintFunc, &SQVM_PrintFunc);
DetourDetach((LPVOID*)&v_SQVM_WarningFunc, &SQVM_WarningFunc);

View File

@ -0,0 +1,208 @@
//===============================================================================//
//
// Purpose: VSquirrel VM
//
//===============================================================================//
#include "core/stdafx.h"
#include "tier1/cvar.h"
#include "vscript/vscript.h"
#include "vsquirrel.h"
#include "pluginsystem/modsystem.h"
//---------------------------------------------------------------------------------
// Purpose: Initialises a Squirrel VM instance
// Output : True on success, false on failure
//---------------------------------------------------------------------------------
SQBool CSquirrelVM::Init(CSquirrelVM* s, SQCONTEXT context, SQFloat curTime)
{
// original func always returns true, added check just in case.
if (!v_CSquirrelVM_Init(s, context, curTime))
{
return false;
}
DevMsg((eDLL_T)context, "Created %s VM: '0x%p'\n", s->GetVM()->_sharedstate->_contextname, s);
switch (context)
{
#ifndef CLIENT_DLL
case SQCONTEXT::SERVER:
g_pServerScript = s;
Script_RegisterServerFunctions(s);
break;
#endif
#ifndef DEDICATED
case SQCONTEXT::CLIENT:
g_pClientScript = s;
Script_RegisterClientFunctions(s);
break;
case SQCONTEXT::UI:
g_pUIScript = s;
Script_RegisterUIFunctions(s);
break;
#endif
}
return true;
}
//---------------------------------------------------------------------------------
// Purpose: destroys the signal entry list head
// Input : *s -
// v -
// f -
// Output : true on success, false otherwise
//---------------------------------------------------------------------------------
SQBool CSquirrelVM::DestroySignalEntryListHead(CSquirrelVM* s, HSQUIRRELVM v, SQFloat f)
{
SQBool result = v_CSquirrelVM_DestroySignalEntryListHead(s, v, f);
s->RegisterConstant("DEVELOPER", developer->GetInt());
return result;
}
//---------------------------------------------------------------------------------
// Purpose: registers a global constant
// Input : *name -
// value -
//---------------------------------------------------------------------------------
SQRESULT CSquirrelVM::RegisterConstant(const SQChar* name, SQInteger value)
{
return v_CSquirrelVM_RegisterConstant(this, name, value);
}
//---------------------------------------------------------------------------------
// Purpose: registers a code function
// Input : *s -
// *scriptName -
// *nativeName -
// *helpString -
// *returnString -
// *parameters -
// *function -
//---------------------------------------------------------------------------------
SQRESULT CSquirrelVM::RegisterFunction(const SQChar* scriptName, const SQChar* nativeName,
const SQChar* helpString, const SQChar* returnString, const SQChar* parameters, void* function)
{
ScriptFunctionBinding_t binding;
binding.Init(scriptName, nativeName, helpString, returnString, parameters, 5, function);
SQRESULT results = v_CSquirrelVM_RegisterFunction(this, &binding, 1);
return results;
}
//---------------------------------------------------------------------------------
// Purpose: sets current VM as the global precompiler
// Input : *name -
// value -
//---------------------------------------------------------------------------------
void CSquirrelVM::SetAsCompiler(RSON::Node_t* rson)
{
const SQCONTEXT context = GetContext();
switch (context)
{
#ifndef CLIENT_DLL
case SQCONTEXT::SERVER:
{
v_Script_SetServerPrecompiler(context, rson);
break;
}
#endif
#ifndef DEDICATED
case SQCONTEXT::CLIENT:
case SQCONTEXT::UI:
{
v_Script_SetClientPrecompiler(context, rson);
break;
}
#endif
}
}
//---------------------------------------------------------------------------------
// Purpose: Precompiles mod scripts
//---------------------------------------------------------------------------------
void CSquirrelVM::CompileModScripts()
{
for (auto& mod : g_pModSystem->GetModList())
{
if (!mod.IsEnabled())
continue;
if (!mod.m_bHasScriptCompileList)
continue;
RSON::Node_t* rson = mod.LoadScriptCompileList(); // allocs parsed rson buffer
if (!rson)
Error(GetVM()->GetNativePrintContext(), EXIT_FAILURE, "%s: Failed to load RSON file %s\n", __FUNCTION__, mod.GetScriptCompileListPath().string().c_str());
const char* scriptPathArray[MAX_PRECOMPILED_SCRIPTS];
int scriptCount = 0;
SetAsCompiler(rson);
if (Script_ParseScriptList(
GetContext(),
mod.GetScriptCompileListPath().string().c_str(),
rson,
(char**)scriptPathArray, &scriptCount,
nullptr, 0))
{
std::vector<char*> newScriptPaths;
for (int i = 0; i < scriptCount; ++i)
{
// add "::MOD::" to the start of the script path so it can be identified from Script_LoadScript later
// this is so we can avoid script naming conflicts by removing the engine's forced directory of "scripts/vscripts/"
// and adding the mod path to the start
std::string scriptPath = MOD_SCRIPT_PATH_IDENTIFIER + (mod.GetBasePath() / "scripts/vscripts/" / scriptPathArray[i]).string();
char* pszScriptPath = _strdup(scriptPath.c_str());
// normalise slash direction
V_FixSlashes(pszScriptPath);
newScriptPaths.emplace_back(pszScriptPath);
scriptPathArray[i] = pszScriptPath;
}
switch (GetVM()->GetContext())
{
#ifndef CLIENT_DLL
case SQCONTEXT::SERVER:
{
v_CSquirrelVM_PrecompileServerScripts(this, GetContext(), (char**)scriptPathArray, scriptCount);
break;
}
#endif
#ifndef DEDICATED
case SQCONTEXT::CLIENT:
case SQCONTEXT::UI:
{
v_CSquirrelVM_PrecompileClientScripts(this, GetContext(), (char**)scriptPathArray, scriptCount);
break;
}
#endif
}
// clean up our allocated script paths
for (char* path : newScriptPaths)
{
delete path;
}
}
// TODO[rexx]: clean up allocated RSON memory. example @ 1408B18E2
}
}
//---------------------------------------------------------------------------------
void VSquirrel::Attach() const
{
DetourAttach((LPVOID*)&v_CSquirrelVM_Init, &CSquirrelVM::Init);
DetourAttach((LPVOID*)&v_CSquirrelVM_DestroySignalEntryListHead, &CSquirrelVM::DestroySignalEntryListHead);
}
//---------------------------------------------------------------------------------
void VSquirrel::Detach() const
{
DetourDetach((LPVOID*)&v_CSquirrelVM_Init, &CSquirrelVM::Init);
DetourDetach((LPVOID*)&v_CSquirrelVM_DestroySignalEntryListHead, &CSquirrelVM::DestroySignalEntryListHead);
}

View File

@ -0,0 +1,127 @@
#ifndef VSQUIRREL_H
#define VSQUIRREL_H
#include "vscript/languages/squirrel_re/include/squirrel.h"
#include "vscript/languages/squirrel_re/include/sqstate.h"
#include "vscript/languages/squirrel_re/include/sqvm.h"
#include "vscript/ivscript.h"
#include "vpc/rson.h"
#define MAX_PRECOMPILED_SCRIPTS 1024
#pragma pack(push, 4)
class CSquirrelVM
{
public:
static SQBool Init(CSquirrelVM* s, SQCONTEXT context, float curtime);
static SQBool DestroySignalEntryListHead(CSquirrelVM* s, HSQUIRRELVM v, SQFloat f);
void CompileModScripts();
void SetAsCompiler(RSON::Node_t* rson);
SQRESULT RegisterFunction(const SQChar* scriptname, const SQChar* nativename, const SQChar* helpstring, const SQChar* returntype, const SQChar* parameters, void* functor);
SQRESULT RegisterConstant(const SQChar* name, SQInteger value);
FORCEINLINE HSQUIRRELVM GetVM() const { return m_sqVM; }
FORCEINLINE SQCONTEXT GetContext() const { return m_iContext; }
private:
SQChar pad0[0x8];
HSQUIRRELVM m_sqVM;
SQChar pad1[0x8];
SQInteger m_nFlags;
SQChar pad2[4];
SQChar pad3[16];
#if !defined (GAMEDLL_S0) && !defined (GAMEDLL_S1)
SQChar pad4[4];
#endif
SQInteger m_nTick;
SQCONTEXT m_iContext; // 0x38
#if !defined (GAMEDLL_S2) && !defined (GAMEDLL_S3)
SQChar pad6[4];
#endif
void* m_pCompareFunc;
};
#pragma pack(pop)
inline CMemory p_CSquirrelVM_Init;
inline auto v_CSquirrelVM_Init = p_CSquirrelVM_Init.RCast<bool(__fastcall*)(CSquirrelVM* s, SQCONTEXT context, SQFloat curtime)>();
inline CMemory p_CSquirrelVM_DestroySignalEntryListHead;
inline auto v_CSquirrelVM_DestroySignalEntryListHead = p_CSquirrelVM_DestroySignalEntryListHead.RCast<SQBool(*)(CSquirrelVM* s, HSQUIRRELVM v, SQFloat f)>();
inline CMemory p_CSquirrelVM_RegisterFunction;
inline auto v_CSquirrelVM_RegisterFunction = p_CSquirrelVM_RegisterFunction.RCast<SQRESULT(*)(CSquirrelVM* s, ScriptFunctionBinding_t* binding, SQInteger a1)>();
inline CMemory p_CSquirrelVM_RegisterConstant;
inline auto v_CSquirrelVM_RegisterConstant = p_CSquirrelVM_RegisterConstant.RCast<SQRESULT(*)(CSquirrelVM* s, const SQChar* name, SQInteger value)>();
#ifndef DEDICATED
inline CMemory p_CSquirrelVM_PrecompileClientScripts;
inline auto v_CSquirrelVM_PrecompileClientScripts = p_CSquirrelVM_PrecompileClientScripts.RCast<bool(__fastcall*)(CSquirrelVM* vm, SQCONTEXT context, char** scriptArray, int scriptCount)>();
#endif
#ifndef CLIENT_DLL
inline CMemory p_CSquirrelVM_PrecompileServerScripts;
inline auto v_CSquirrelVM_PrecompileServerScripts = p_CSquirrelVM_PrecompileServerScripts.RCast<bool(__fastcall*)(CSquirrelVM* vm, SQCONTEXT context, char** scriptArray, int scriptCount)>();
#endif
#ifndef CLIENT_DLL
inline CSquirrelVM* g_pServerScript;
#endif // !CLIENT_DLL
#ifndef DEDICATED
inline CSquirrelVM* g_pClientScript;
inline CSquirrelVM* g_pUIScript;
#endif // !DEDICATED
///////////////////////////////////////////////////////////////////////////////
class VSquirrel : public IDetour
{
virtual void GetAdr(void) const
{
LogFunAdr("CSquirrelVM::Init", p_CSquirrelVM_Init.GetPtr());
LogFunAdr("CSquirrelVM::DestroySignalEntryListHead", p_CSquirrelVM_DestroySignalEntryListHead.GetPtr());
LogFunAdr("CSquirrelVM::RegisterConstant", p_CSquirrelVM_RegisterConstant.GetPtr());
LogFunAdr("CSquirrelVM::RegisterFunction", p_CSquirrelVM_RegisterFunction.GetPtr());
#ifndef CLIENT_DLL
LogFunAdr("CSquirrelVM::PrecompileServerScripts", p_CSquirrelVM_PrecompileServerScripts.GetPtr());
#endif // !CLIENT_DLL
#ifndef DEDICATED
LogFunAdr("CSquirrelVM::PrecompileClientScripts", p_CSquirrelVM_PrecompileClientScripts.GetPtr());
#endif // !DEDICATED
}
virtual void GetFun(void) const
{
p_CSquirrelVM_Init = g_GameDll.FindPatternSIMD("E8 ?? ?? ?? ?? 0F 28 74 24 ?? 48 89 1D ?? ?? ?? ??").FollowNearCallSelf();
v_CSquirrelVM_Init = p_CSquirrelVM_Init.RCast<bool(__fastcall*)(CSquirrelVM*, SQCONTEXT, SQFloat)>();
p_CSquirrelVM_DestroySignalEntryListHead = g_GameDll.FindPatternSIMD("48 89 5C 24 ?? 48 89 6C 24 ?? 56 57 41 56 48 83 EC 50 44 8B 42");
v_CSquirrelVM_DestroySignalEntryListHead = p_CSquirrelVM_DestroySignalEntryListHead.RCast<SQBool(*)(CSquirrelVM*, HSQUIRRELVM, SQFloat)>();
p_CSquirrelVM_RegisterConstant = g_GameDll.FindPatternSIMD("48 89 5C 24 ?? 48 89 6C 24 ?? 48 89 74 24 ?? 57 48 83 EC 30 4C 8B");
v_CSquirrelVM_RegisterConstant = p_CSquirrelVM_RegisterConstant.RCast<SQRESULT(*)(CSquirrelVM*, const SQChar*, SQInteger)>();
p_CSquirrelVM_RegisterFunction = g_GameDll.FindPatternSIMD("48 83 EC 38 45 0F B6 C8");
v_CSquirrelVM_RegisterFunction = p_CSquirrelVM_RegisterFunction.RCast<SQRESULT(*)(CSquirrelVM*, ScriptFunctionBinding_t*, SQInteger)>();
#ifndef CLIENT_DLL
// sv scripts.rson compiling
p_CSquirrelVM_PrecompileServerScripts = g_GameDll.FindPatternSIMD("E8 ?? ?? ?? ?? 0F B6 F0 48 85 DB").FollowNearCallSelf();
v_CSquirrelVM_PrecompileServerScripts = p_CSquirrelVM_PrecompileServerScripts.RCast<bool(__fastcall*)(CSquirrelVM*, SQCONTEXT, char**, int)>();
#endif
#ifndef DEDICATED
// cl/ui scripts.rson compiling
p_CSquirrelVM_PrecompileClientScripts = g_GameDll.FindPatternSIMD("E8 ?? ?? ?? ?? 44 0F B6 F0 48 85 DB").FollowNearCallSelf();
v_CSquirrelVM_PrecompileClientScripts = p_CSquirrelVM_PrecompileClientScripts.RCast<bool(__fastcall*)(CSquirrelVM*, SQCONTEXT, char**, int)>();
#endif
}
virtual void GetVar(void) const { }
virtual void GetCon(void) const { }
virtual void Attach(void) const;
virtual void Detach(void) const;
};
#endif // VSQUIRREL_H

306
r5dev/vscript/vscript.cpp Normal file
View File

@ -0,0 +1,306 @@
//=============================================================================//
//
// Purpose: VScript System
//
//=============================================================================//
#include "core/stdafx.h"
#include "tier0/frametask.h"
#include "tier0/fasttimer.h"
#include "tier1/cvar.h"
#include "languages/squirrel_re/vsquirrel.h"
#include "vscript/vscript.h"
#include "game/shared/vscript_shared.h"
#include "pluginsystem/modsystem.h"
#ifndef CLIENT_DLL
//---------------------------------------------------------------------------------
// Purpose: registers script functions in SERVER context
// Input : *s -
//---------------------------------------------------------------------------------
void Script_RegisterServerFunctions(CSquirrelVM* s)
{
s->RegisterFunction("SDKNativeTest", "Script_SDKNativeTest", "Native SERVER test function", "void", "", &VScriptCode::SHARED::SDKNativeTest);
s->RegisterFunction("GetSDKVersion", "Script_GetSDKVersion", "Gets the SDK version as a string", "string", "", &VScriptCode::SHARED::GetSDKVersion);
s->RegisterFunction("GetNumHumanPlayers", "Script_GetNumHumanPlayers", "Gets the number of human players on the server", "int", "", &VScriptCode::SERVER::GetNumHumanPlayers);
s->RegisterFunction("GetNumFakeClients", "Script_GetNumFakeClients", "Gets the number of bot players on the server", "int", "", &VScriptCode::SERVER::GetNumFakeClients);
s->RegisterFunction("GetAvailableMaps", "Script_GetAvailableMaps", "Gets an array of all available maps", "array< string >", "", &VScriptCode::SHARED::GetAvailableMaps);
s->RegisterFunction("GetAvailablePlaylists", "Script_GetAvailablePlaylists", "Gets an array of all available playlists", "array< string >", "", &VScriptCode::SHARED::GetAvailablePlaylists);
s->RegisterFunction("KickPlayerByName", "Script_KickPlayerByName", "Kicks a player from the server by name", "void", "string", &VScriptCode::SHARED::KickPlayerByName);
s->RegisterFunction("KickPlayerById", "Script_KickPlayerById", "Kicks a player from the server by handle or nucleus id", "void", "string", &VScriptCode::SHARED::KickPlayerById);
s->RegisterFunction("BanPlayerByName", "Script_BanPlayerByName", "Bans a player from the server by name", "void", "string", &VScriptCode::SHARED::BanPlayerByName);
s->RegisterFunction("BanPlayerById", "Script_BanPlayerById", "Bans a player from the server by handle or nucleus id", "void", "string", &VScriptCode::SHARED::BanPlayerById);
s->RegisterFunction("UnbanPlayer", "Script_UnbanPlayer", "Unbans a player from the server by nucleus id or ip address", "void", "string", &VScriptCode::SHARED::UnbanPlayer);
s->RegisterFunction("ShutdownHostGame", "Script_ShutdownHostGame", "Shuts the local host game down", "void", "", &VScriptCode::SHARED::ShutdownHostGame);
s->RegisterFunction("IsDedicated", "Script_IsDedicated", "Returns whether this is a dedicated server", "bool", "", &VScriptCode::SERVER::IsDedicated);
}
#endif // !CLIENT_DLL
#ifndef DEDICATED
//---------------------------------------------------------------------------------
// Purpose: registers script functions in CLIENT context
// Input : *s -
//---------------------------------------------------------------------------------
void Script_RegisterClientFunctions(CSquirrelVM* s)
{
s->RegisterFunction("SDKNativeTest", "Script_SDKNativeTest", "Native CLIENT test function", "void", "", &VScriptCode::SHARED::SDKNativeTest);
s->RegisterFunction("GetSDKVersion", "Script_GetSDKVersion", "Gets the SDK version as a string", "string", "", &VScriptCode::SHARED::GetSDKVersion);
s->RegisterFunction("GetAvailableMaps", "Script_GetAvailableMaps", "Gets an array of all available maps", "array< string >", "", &VScriptCode::SHARED::GetAvailableMaps);
s->RegisterFunction("GetAvailablePlaylists", "Script_GetAvailablePlaylists", "Gets an array of all available playlists", "array< string >", "", &VScriptCode::SHARED::GetAvailablePlaylists);
s->RegisterFunction("ShutdownHostGame", "Script_ShutdownHostGame", "Shuts the local host game down", "void", "", &VScriptCode::SHARED::ShutdownHostGame);
s->RegisterFunction("IsClientDLL", "Script_IsClientDLL", "Returns whether this build is client only", "bool", "", &VScriptCode::SHARED::IsClientDLL);
}
//---------------------------------------------------------------------------------
// Purpose: registers script functions in UI context
// Input : *s -
//---------------------------------------------------------------------------------
void Script_RegisterUIFunctions(CSquirrelVM* s)
{
s->RegisterFunction("SDKNativeTest", "Script_SDKNativeTest", "Native UI test function", "void", "", &VScriptCode::SHARED::SDKNativeTest);
s->RegisterFunction("GetSDKVersion", "Script_GetSDKVersion", "Gets the SDK version as a string", "string", "", &VScriptCode::SHARED::GetSDKVersion);
s->RegisterFunction("RefreshServerList", "Script_RefreshServerList", "Refreshes the public server list and returns the count", "int", "", &VScriptCode::UI::RefreshServerCount);
// Functions for retrieving server browser data
s->RegisterFunction("GetServerName", "Script_GetServerName", "Gets the name of the server at the specified index of the server list", "string", "int", &VScriptCode::UI::GetServerName);
s->RegisterFunction("GetServerDescription", "Script_GetServerDescription", "Gets the description of the server at the specified index of the server list", "string", "int", &VScriptCode::UI::GetServerDescription);
s->RegisterFunction("GetServerMap", "Script_GetServerMap", "Gets the map of the server at the specified index of the server list", "string", "int", &VScriptCode::UI::GetServerMap);
s->RegisterFunction("GetServerPlaylist", "Script_GetServerPlaylist", "Gets the playlist of the server at the specified index of the server list", "string", "int", &VScriptCode::UI::GetServerPlaylist);
s->RegisterFunction("GetServerCurrentPlayers", "Script_GetServerCurrentPlayers", "Gets the current player count of the server at the specified index of the server list", "int", "int", &VScriptCode::UI::GetServerCurrentPlayers);
s->RegisterFunction("GetServerMaxPlayers", "Script_GetServerMaxPlayers", "Gets the max player count of the server at the specified index of the server list", "int", "int", &VScriptCode::UI::GetServerMaxPlayers);
s->RegisterFunction("GetServerCount", "Script_GetServerCount", "Gets the number of public servers", "int", "", &VScriptCode::UI::GetServerCount);
// Misc main menu functions
s->RegisterFunction("GetPromoData", "Script_GetPromoData", "Gets promo data for specified slot type", "string", "int", &VScriptCode::UI::GetPromoData);
// Functions for creating servers
s->RegisterFunction("CreateServer", "Script_CreateServer", "Starts server with the specified settings", "void", "string, string, string, string, int", &VScriptCode::UI::CreateServer);
s->RegisterFunction("IsServerActive", "Script_IsServerActive", "Returns whether the server is active", "bool", "", &VScriptCode::SHARED::IsServerActive);
// Functions for connecting to servers
s->RegisterFunction("ConnectToServer", "Script_ConnectToServer", "Joins server by ip address and encryption key", "void", "string, string", &VScriptCode::UI::ConnectToServer);
s->RegisterFunction("ConnectToListedServer", "Script_ConnectToListedServer", "Joins listed server by index", "void", "int", &VScriptCode::UI::ConnectToListedServer);
s->RegisterFunction("ConnectToHiddenServer", "Script_ConnectToHiddenServer", "Joins hidden server by token", "void", "string", &VScriptCode::UI::ConnectToHiddenServer);
s->RegisterFunction("GetHiddenServerName", "Script_GetHiddenServerName", "Gets hidden server name by token", "string", "string", &VScriptCode::UI::GetHiddenServerName);
s->RegisterFunction("GetAvailableMaps", "Script_GetAvailableMaps", "Gets an array of all available maps", "array< string >", "", &VScriptCode::SHARED::GetAvailableMaps);
s->RegisterFunction("GetAvailablePlaylists", "Script_GetAvailablePlaylists", "Gets an array of all available playlists", "array< string >", "", &VScriptCode::SHARED::GetAvailablePlaylists);
#ifndef CLIENT_DLL
s->RegisterFunction("KickPlayerByName", "Script_KickPlayerByName", "Kicks a player from the server by name", "void", "string", &VScriptCode::SHARED::KickPlayerByName);
s->RegisterFunction("KickPlayerById", "Script_KickPlayerById", "Kicks a player from the server by handle or nucleus id", "void", "string", &VScriptCode::SHARED::KickPlayerById);
s->RegisterFunction("BanPlayerByName", "Script_BanPlayerByName", "Bans a player from the server by name", "void", "string", &VScriptCode::SHARED::BanPlayerByName);
s->RegisterFunction("BanPlayerById", "Script_BanPlayerById", "Bans a player from the server by handle or nucleus id", "void", "string", &VScriptCode::SHARED::BanPlayerById);
s->RegisterFunction("UnbanPlayer", "Script_UnbanPlayer", "Unbans a player from the server by nucleus id or ip address", "void", "string", &VScriptCode::SHARED::UnbanPlayer);
#endif // !CLIENT_DLL
s->RegisterFunction("ShutdownHostGame", "Script_ShutdownHostGame", "Shuts the local host game down", "void", "", &VScriptCode::SHARED::ShutdownHostGame);
s->RegisterFunction("IsClientDLL", "Script_IsClientDLL", "Returns whether this build is client only", "bool", "", &VScriptCode::SHARED::IsClientDLL);
}
#endif // !DEDICATED
//---------------------------------------------------------------------------------
// Purpose: Returns the script VM pointer by context
// Input : context -
//---------------------------------------------------------------------------------
CSquirrelVM* Script_GetScriptHandle(const SQCONTEXT context)
{
switch (context)
{
#ifndef CLIENT_DLL
case SQCONTEXT::SERVER:
return g_pServerScript;
#endif // !CLIENT_DLL
#ifndef DEDICATED
case SQCONTEXT::CLIENT:
return g_pClientScript;
case SQCONTEXT::UI:
return g_pUIScript;
#endif // !DEDICATED
default:
return nullptr;
}
}
//---------------------------------------------------------------------------------
// Purpose: loads the script list, listing scripts to be compiled.
// Input : *rsonfile -
//---------------------------------------------------------------------------------
RSON::Node_t* Script_LoadScriptList(const SQChar* rsonfile)
{
DevMsg(eDLL_T::ENGINE, "Loading script list: '%s'\n", rsonfile);
return v_Script_LoadScriptList(rsonfile);
}
//---------------------------------------------------------------------------------
// Purpose: loads script files listed in the script list, to be compiled.
// Input : *v -
// *path -
// *name -
// flags -
//---------------------------------------------------------------------------------
SQBool Script_LoadScriptFile(HSQUIRRELVM v, const SQChar* path, const SQChar* name, SQInteger flags)
{
// search for mod path identifier so the mod can decide where the file is
const char* modPath = strstr(path, MOD_SCRIPT_PATH_IDENTIFIER);
if (modPath)
path = &modPath[sizeof(MOD_SCRIPT_PATH_IDENTIFIER)-1]; // skip "::MOD::"
///////////////////////////////////////////////////////////////////////////////
return v_Script_LoadScriptFile(v, path, name, flags);
}
//---------------------------------------------------------------------------------
// Purpose: parses rson data to get an array of scripts to compile
// Input : context -
// *scriptListPath -
// *rson -
// *scriptArray -
// *pScriptCount -
// **precompiledScriptArray -
// precompiledScriptCount -
//---------------------------------------------------------------------------------
SQBool Script_ParseScriptList(SQCONTEXT context, const char* scriptListPath,
RSON::Node_t* rson, char** scriptArray, int* pScriptCount, char** precompiledScriptArray, int precompiledScriptCount)
{
return v_Script_ParseScriptList(context, scriptListPath, rson, scriptArray, pScriptCount, precompiledScriptArray, precompiledScriptCount);
}
//---------------------------------------------------------------------------------
// Purpose: precompiles scripts for the given VM
// Input : *vm
//---------------------------------------------------------------------------------
SQBool Script_PrecompileScripts(CSquirrelVM* vm)
{
HSQUIRRELVM v = vm->GetVM();
SQCONTEXT context = vm->GetContext();
DevMsg(eDLL_T(context), "Starting script compiler...\n");
CFastTimer timer;
timer.Start();
vm->CompileModScripts();
SQBool result = false;
switch (context)
{
#ifndef CLIENT_DLL
case SQCONTEXT::SERVER:
{
result = v_Script_PrecompileServerScripts(vm);
break;
}
#endif
#ifndef DEDICATED
case SQCONTEXT::CLIENT:
case SQCONTEXT::UI:
{
result = v_Script_PrecompileClientScripts(vm);
break;
}
#endif
}
timer.End();
DevMsg(eDLL_T(context), "Script compiler finished in %lf seconds\n", timer.GetDuration().GetSeconds());
return result;
}
#ifndef CLIENT_DLL
SQBool Script_PrecompileServerScripts(CSquirrelVM* vm)
{
return Script_PrecompileScripts(g_pServerScript);
}
#endif // !CLIENT_DLL
#ifndef DEDICATED
SQBool Script_PrecompileClientScripts(CSquirrelVM* vm)
{
return Script_PrecompileScripts(vm);
}
#endif // !DEDICATED
//---------------------------------------------------------------------------------
// Purpose: Compiles and executes input code on target VM by context
// Input : *code -
// context -
//---------------------------------------------------------------------------------
void Script_Execute(const SQChar* code, const SQCONTEXT context)
{
if (!ThreadInMainThread())
{
const string scode(code);
g_TaskScheduler->Dispatch([scode, context]()
{
Script_Execute(scode.c_str(), context);
}, 0);
return; // Only run in main thread.
}
CSquirrelVM* s = Script_GetScriptHandle(context);
if (!s)
{
Error(eDLL_T::ENGINE, NO_ERROR, "Attempted to run %s script with no handle to VM\n", SQVM_GetContextName(context));
return;
}
HSQUIRRELVM v = s->GetVM();
if (!v)
{
Error(eDLL_T::ENGINE, NO_ERROR, "Attempted to run %s script while VM isn't initialized\n", SQVM_GetContextName(context));
return;
}
SQBufState bufState = SQBufState(code);
SQRESULT compileResult = sq_compilebuffer(v, &bufState, "console", -1);
if (SQ_SUCCEEDED(compileResult))
{
sq_pushroottable(v);
SQRESULT callResult = sq_call(v, 1, false, false);
if (!SQ_SUCCEEDED(callResult))
{
Error(eDLL_T::ENGINE, NO_ERROR, "Failed to execute %s script \"%s\"\n", SQVM_GetContextName(context), code);
}
}
}
//---------------------------------------------------------------------------------
void VScript::Attach() const
{
DetourAttach((LPVOID*)&v_Script_LoadScriptList, &Script_LoadScriptList);
DetourAttach((LPVOID*)&v_Script_LoadScriptFile, &Script_LoadScriptFile);
#ifndef CLIENT_DLL
DetourAttach((LPVOID*)&v_Script_PrecompileServerScripts, &Script_PrecompileServerScripts);
#endif
#ifndef DEDICATED
DetourAttach((LPVOID*)&v_Script_PrecompileClientScripts, &Script_PrecompileClientScripts);
#endif
}
//---------------------------------------------------------------------------------
void VScript::Detach() const
{
DetourDetach((LPVOID*)&v_Script_LoadScriptList, &Script_LoadScriptList);
DetourDetach((LPVOID*)&v_Script_LoadScriptFile, &Script_LoadScriptFile);
#ifndef CLIENT_DLL
DetourDetach((LPVOID*)&v_Script_PrecompileServerScripts, &Script_PrecompileServerScripts);
#endif
#ifndef DEDICATED
DetourDetach((LPVOID*)&v_Script_PrecompileClientScripts, &Script_PrecompileClientScripts);
#endif
}

105
r5dev/vscript/vscript.h Normal file
View File

@ -0,0 +1,105 @@
#ifndef VSCRIPT_H
#define VSCRIPT_H
#include "vscript/languages/squirrel_re/include/squirrel.h"
#include "vscript/languages/squirrel_re/include/sqstate.h"
#include "vscript/languages/squirrel_re/include/sqvm.h"
#include "vscript/ivscript.h"
#include "vpc/rson.h"
#define MOD_SCRIPT_PATH_IDENTIFIER "::MOD::"
//-----------------------------------------------------------------------------
// Forward declarations
//-----------------------------------------------------------------------------
class CSquirrelVM;
inline CMemory p_Script_LoadScriptList;
inline auto v_Script_LoadScriptList = p_Script_LoadScriptList.RCast<RSON::Node_t* (*)(const SQChar* rsonfile)>();
inline CMemory p_Script_LoadScriptFile;
inline auto v_Script_LoadScriptFile = p_Script_LoadScriptFile.RCast<SQBool(*)(HSQUIRRELVM v, const SQChar* path, const SQChar* name, SQInteger flags)>();
inline CMemory p_Script_ParseScriptList;
inline auto v_Script_ParseScriptList = p_Script_ParseScriptList.RCast<SQBool(__fastcall*)(SQCONTEXT ctx, const char* scriptListPath, RSON::Node_t* rson, char** scriptArray, int* pScriptCount, char** precompiledScriptArray, int precompiledScriptCount)>();
#ifndef CLIENT_DLL
inline CMemory p_Script_PrecompileServerScripts;
inline auto v_Script_PrecompileServerScripts = p_Script_PrecompileServerScripts.RCast<SQBool(__fastcall*)(CSquirrelVM* vm /*This parameter is not used internally (the client variant does use it)!*/)>();
inline CMemory p_Script_SetServerCompiler;
inline auto v_Script_SetServerPrecompiler = p_Script_SetServerCompiler.RCast<void(__fastcall*)(SQCONTEXT ctx, RSON::Node_t* rson)>();
#endif
#ifndef DEDICATED
inline CMemory p_Script_PrecompileClientScripts;
inline auto v_Script_PrecompileClientScripts = p_Script_PrecompileClientScripts.RCast<SQBool(__fastcall*)(CSquirrelVM* vm)>();
inline CMemory p_Script_SetClientCompiler;
inline auto v_Script_SetClientPrecompiler = p_Script_SetClientCompiler.RCast<void(__fastcall*)(SQCONTEXT ctx, RSON::Node_t* rson)>();
#endif
void Script_RegisterServerFunctions(CSquirrelVM* s);
void Script_RegisterClientFunctions(CSquirrelVM* s);
void Script_RegisterUIFunctions(CSquirrelVM* s);
CSquirrelVM* Script_GetScriptHandle(const SQCONTEXT context);
RSON::Node_t* Script_LoadScriptList(const SQChar* rsonfile);
SQBool Script_LoadScriptFile(HSQUIRRELVM v, const SQChar* path, const SQChar* name, SQInteger flags);
SQBool Script_ParseScriptList(SQCONTEXT context, const char* scriptListPath, RSON::Node_t* rson, char** scriptArray, int* pScriptCount, char** precompiledScriptArray, int precompiledScriptCount);
void Script_Execute(const SQChar* code, const SQCONTEXT context);
///////////////////////////////////////////////////////////////////////////////
class VScript : public IDetour
{
virtual void GetAdr(void) const
{
LogFunAdr("Script_LoadScriptList", p_Script_LoadScriptList.GetPtr());
LogFunAdr("Script_LoadScriptFile", p_Script_LoadScriptFile.GetPtr());
LogFunAdr("Script_ParseScriptList", p_Script_ParseScriptList.GetPtr());
#ifndef CLIENT_DLL
LogFunAdr("Script_PrecompileServerInit", p_Script_PrecompileServerScripts.GetPtr());
LogFunAdr("Script_SetServerCompiler", p_Script_SetServerCompiler.GetPtr());
#endif // !CLIENT_DLL
#ifndef DEDICATED
LogFunAdr("Script_PrecompileClientInit", p_Script_PrecompileClientScripts.GetPtr());
LogFunAdr("Script_SetClientCompiler", p_Script_SetClientCompiler.GetPtr());
#endif // !DEDICATED
}
virtual void GetFun(void) const
{
p_Script_LoadScriptList = g_GameDll.FindPatternSIMD("4C 8B DC 49 89 5B 08 57 48 81 EC A0 ?? ?? ?? 33");
v_Script_LoadScriptList = p_Script_LoadScriptList.RCast<RSON::Node_t* (*)(const SQChar*)>();
#if defined (GAMEDLL_S0) || defined (GAMEDLL_S1)
p_Script_LoadScript = g_GameDll.FindPatternSIMD("48 89 5C 24 10 48 89 74 24 18 48 89 7C 24 20 48 89 4C 24 08 55 41 54 41 55 41 56 41 57 48 8D 6C");
#elif defined (GAMEDLL_S2) || defined (GAMEDLL_S3)
p_Script_LoadScriptFile = g_GameDll.FindPatternSIMD("48 8B C4 48 89 48 08 55 41 56 48 8D 68");
#endif
v_Script_LoadScriptFile = p_Script_LoadScriptFile.RCast<SQBool(*)(HSQUIRRELVM, const SQChar*, const SQChar*, SQInteger)>();
#ifndef CLIENT_DLL
p_Script_PrecompileServerScripts = g_GameDll.FindPatternSIMD("E8 ?? ?? ?? ?? 33 DB 88 05 ?? ?? ?? ??").FollowNearCallSelf();
v_Script_PrecompileServerScripts = p_Script_PrecompileServerScripts.RCast<SQBool(__fastcall*)(CSquirrelVM*)>();
p_Script_SetServerCompiler = g_GameDll.FindPatternSIMD("E8 ?? ?? ?? ?? 48 8D 84 24 ?? ?? ?? ?? 44 89 64 24 ?? 4C 89 64 24 ?? 4C 8D 8C 24 ?? ?? ?? ?? 4C 8B C5").FollowNearCallSelf();
v_Script_SetServerPrecompiler = p_Script_SetServerCompiler.RCast<void(__fastcall*)(SQCONTEXT ctx, RSON::Node_t* rson)>();
#endif // !CLIENT_DLL
#ifndef DEDICATED
p_Script_PrecompileClientScripts = g_GameDll.FindPatternSIMD("E8 ?? ?? ?? ?? 88 05 ?? ?? ?? ?? 33 C0").FollowNearCallSelf();
v_Script_PrecompileClientScripts = p_Script_PrecompileClientScripts.RCast<SQBool(__fastcall*)(CSquirrelVM*)>();
p_Script_SetClientCompiler = g_GameDll.FindPatternSIMD("E8 ?? ?? ?? ?? 48 8D 84 24 ?? ?? ?? ?? 44 89 64 24 ?? 4C 89 64 24 ?? 4C 8D 8C 24 ?? ?? ?? ?? 4C 8B C6").FollowNearCallSelf();
v_Script_SetClientPrecompiler = p_Script_SetClientCompiler.RCast<void(__fastcall*)(SQCONTEXT ctx, RSON::Node_t* rson)>();
#endif // !DEDICATED
p_Script_ParseScriptList = g_GameDll.FindPatternSIMD("4C 89 4C 24 ?? 55 41 56");
v_Script_ParseScriptList = p_Script_ParseScriptList.RCast<SQBool(__fastcall*)(SQCONTEXT, const SQChar*, RSON::Node_t*, char**, int*, char**, int)>();
}
virtual void GetVar(void) const { }
virtual void GetCon(void) const { }
virtual void Attach(void) const;
virtual void Detach(void) const;
};
///////////////////////////////////////////////////////////////////////////////
#endif // VSCRIPT_H

View File

@ -31,7 +31,7 @@
#include "filesystem/basefilesystem.h"
#include "filesystem/filesystem.h"
#include "vpklib/packedstore.h"
#include "squirrel/sqscript.h"
#include "vscript/vscript.h"
#include "ebisusdk/EbisuSDK.h"
#ifndef DEDICATED
#include "gameui/IBrowser.h"