diff --git a/r5dev/r5dev.vcxproj b/r5dev/r5dev.vcxproj
index 2a8d82b6..7b28127d 100644
--- a/r5dev/r5dev.vcxproj
+++ b/r5dev/r5dev.vcxproj
@@ -59,7 +59,6 @@
-
NotUsing
@@ -266,7 +265,6 @@
-
diff --git a/r5dev/r5dev.vcxproj.filters b/r5dev/r5dev.vcxproj.filters
index 4f646e83..c26cd15c 100644
--- a/r5dev/r5dev.vcxproj.filters
+++ b/r5dev/r5dev.vcxproj.filters
@@ -405,9 +405,6 @@
core
-
- sdk\squirrel
-
@@ -1049,9 +1046,6 @@
core
-
- sdk\squirrel
-
diff --git a/r5dev/squirrel/sqinit.cpp b/r5dev/squirrel/sqinit.cpp
index 7248ee24..05d7a982 100644
--- a/r5dev/squirrel/sqinit.cpp
+++ b/r5dev/squirrel/sqinit.cpp
@@ -1,8 +1,295 @@
//=============================================================================//
//
-// Create new functions here
+// Purpose: Expose native code to VScript API
+//
+//-----------------------------------------------------------------------------
+//
+// Create functions here under the target VM namespace. If the function has to
+// be registered for 2 or more VM's, put them under the 'SHARED' namespace.
+// Ifdef them out for 'DEDICATED' if the target VM's do not include 'SERVER'.
//
//=============================================================================//
#include "core/stdafx.h"
-#include "sqinit.h"
+#include "engine/sys_utils.h"
+#include "squirrel/sqapi.h"
+#include "squirrel/sqinit.h"
+
+#ifndef DEDICATED
+#include "gameui/IBrowser.h" // TODO: create dedicated class for exposing server utils to ImGui and UI VM.
+#endif // !DEDICATED
+
+namespace VSquirrel
+{
+ namespace SHARED
+ {
+ SQRESULT Script_NativeTest(void* sqvm)
+ {
+ // Function code goes here.
+ return SQ_OK;
+ }
+ }
+ namespace SERVER
+ {
+ }
+#ifndef DEDICATED
+ namespace CLIENT
+ {
+ }
+ namespace UI
+ {
+ //----------------------------------------------------------------------------
+ // Purpose: get server's current server name from serverlist index
+ //-----------------------------------------------------------------------------
+ SQRESULT GetServerName(void* sqvm)
+ {
+ int iServerIndex = hsq_getinteger(sqvm, 1);
+ std::string svServerName = g_pIBrowser->m_vServerList[iServerIndex].svServerName;
+
+ hsq_pushstring(sqvm, svServerName.c_str(), -1);
+
+ return SQ_OK;
+ }
+
+ //----------------------------------------------------------------------------
+ // Purpose: get server's current playlist via serverlist index
+ //-----------------------------------------------------------------------------
+ SQRESULT GetServerPlaylist(void* sqvm)
+ {
+ int iServerIndex = hsq_getinteger(sqvm, 1);
+ std::string svServerPlaylist = g_pIBrowser->m_vServerList[iServerIndex].svPlaylist;
+
+ hsq_pushstring(sqvm, svServerPlaylist.c_str(), -1);
+
+ return SQ_OK;
+ }
+
+ //----------------------------------------------------------------------------
+ // Purpose: get server's current map via serverlist index
+ //-----------------------------------------------------------------------------
+ SQRESULT GetServerMap(void* sqvm)
+ {
+ int iServerIndex = hsq_getinteger(sqvm, 1);
+ std::string svServerMapName = g_pIBrowser->m_vServerList[iServerIndex].svMapName;
+
+ hsq_pushstring(sqvm, svServerMapName.c_str(), -1);
+
+ return SQ_OK;
+ }
+
+ //----------------------------------------------------------------------------
+ // Purpose: get current server count from pylon
+ //-----------------------------------------------------------------------------
+ SQRESULT GetServerCount(void* sqvm)
+ {
+ g_pIBrowser->GetServerList(); // Refresh svListing list.
+
+ hsq_pushinteger(sqvm, g_pIBrowser->m_vServerList.size());
+
+ return SQ_OK;
+ }
+
+ //----------------------------------------------------------------------------
+ // Purpose: expose SDK version to the UI SQVM
+ //-----------------------------------------------------------------------------
+ SQRESULT GetSDKVersion(void* sqvm)
+ {
+ hsq_pushstring(sqvm, g_pR5net->GetSDKVersion().c_str(), -1);
+
+ return SQ_OK;
+ }
+
+ //----------------------------------------------------------------------------
+ // Purpose: get promo data for serverbrowser panels
+ //-----------------------------------------------------------------------------
+ SQRESULT GetPromoData(void* sqvm)
+ {
+ enum class R5RPromoData : int
+ {
+ PromoLargeTitle,
+ PromoLargeDesc,
+ PromoLeftTitle,
+ PromoLeftDesc,
+ PromoRightTitle,
+ PromoRightDesc
+ };
+
+ R5RPromoData ePromoIndex = (R5RPromoData)hsq_getinteger(sqvm, 1);
+
+ std::string svPromo = std::string();
+
+ switch (ePromoIndex)
+ {
+ case R5RPromoData::PromoLargeTitle:
+ {
+ svPromo = "Welcome To R5Reloaded!";
+ break;
+ }
+ case R5RPromoData::PromoLargeDesc:
+ {
+ svPromo = "Make sure to join the discord! discord.gg/r5reloaded";
+ break;
+ }
+ case R5RPromoData::PromoLeftTitle:
+ {
+ svPromo = "Yes";
+ break;
+ }
+ case R5RPromoData::PromoLeftDesc:
+ {
+ svPromo = "Your ad could be here";
+ break;
+ }
+ case R5RPromoData::PromoRightTitle:
+ {
+ svPromo = "Yes2";
+ break;
+ }
+ case R5RPromoData::PromoRightDesc:
+ {
+ svPromo = "Yes3";
+ break;
+ }
+ default:
+ {
+ svPromo = "You should not see this.";
+ break;
+ }
+ }
+
+ hsq_pushstring(sqvm, svPromo.c_str(), -1);
+
+ return SQ_OK;
+ }
+
+ //-----------------------------------------------------------------------------
+ // Purpose: set netchannel encryption key and connect to server
+ //-----------------------------------------------------------------------------
+ SQRESULT SetEncKeyAndConnect(void* sqvm)
+ {
+ int iServerIndex = hsq_getinteger(sqvm, 1);
+
+ g_pIBrowser->ConnectToServer(g_pIBrowser->m_vServerList[iServerIndex].svIpAddress, g_pIBrowser->m_vServerList[iServerIndex].svPort, g_pIBrowser->m_vServerList[iServerIndex].svEncryptionKey);
+
+ return SQ_OK;
+ }
+
+ //-----------------------------------------------------------------------------
+ // Purpose: create server via native serverbrowser entries
+ //-----------------------------------------------------------------------------
+ SQRESULT CreateServerFromMenu(void* sqvm)
+ {
+ std::string svServerName = hsq_getstring(sqvm, 1);
+ std::string svServerMapName = hsq_getstring(sqvm, 2);
+ std::string svServerPlaylist = hsq_getstring(sqvm, 3);
+ EServerVisibility eServerVisibility = (EServerVisibility)hsq_getinteger(sqvm, 4);
+
+ if (svServerName.empty() || svServerMapName.empty() || svServerPlaylist.empty())
+ return SQ_OK;
+
+ // Adjust browser settings.
+ g_pIBrowser->m_Server.svPlaylist = svServerPlaylist;
+ g_pIBrowser->m_Server.svMapName = svServerMapName;
+ g_pIBrowser->m_Server.svServerName = svServerName;
+ g_pIBrowser->eServerVisibility = eServerVisibility;
+
+ // Launch server.
+ g_pIBrowser->LaunchServer();
+
+ return SQ_OK;
+ }
+
+ //-----------------------------------------------------------------------------
+ // Purpose: request token from pylon and join server with result.
+ //-----------------------------------------------------------------------------
+ SQRESULT JoinPrivateServerFromMenu(void* sqvm)
+ {
+ std::string svHiddenServerRequestMessage = std::string();
+
+ std::string svToken = hsq_getstring(sqvm, 1);
+
+ ServerListing svListing;
+ bool result = g_pR5net->GetServerByToken(svListing, svHiddenServerRequestMessage, svToken); // Send szToken connect request.
+ if (result)
+ {
+ g_pIBrowser->ConnectToServer(svListing.svIpAddress, svListing.svPort, svListing.svEncryptionKey);
+ }
+
+ return SQ_OK;
+ }
+
+ //-----------------------------------------------------------------------------
+ // Purpose: get response from private server request
+ //-----------------------------------------------------------------------------
+ SQRESULT GetPrivateServerMessage(void* sqvm)
+ {
+ std::string svHiddenServerRequestMessage = std::string();
+
+ std::string svToken = hsq_getstring(sqvm, 1);
+
+ ServerListing serverListing;
+ bool result = g_pR5net->GetServerByToken(serverListing, svHiddenServerRequestMessage, svToken); // Send szToken connect request.
+ if (!serverListing.svServerName.empty())
+ {
+ svHiddenServerRequestMessage = "Found Server: " + serverListing.svServerName;
+
+ hsq_pushstring(sqvm, svHiddenServerRequestMessage.c_str(), -1);
+ }
+ else
+ {
+ svHiddenServerRequestMessage = "Error: Server Not Found";
+
+ hsq_pushstring(sqvm, svHiddenServerRequestMessage.c_str(), -1);
+ }
+
+ DevMsg(eDLL_T::UI, "GetPrivateServeMessage response: %s\n", svHiddenServerRequestMessage.c_str());
+
+ return SQ_OK;
+ }
+
+ //-----------------------------------------------------------------------------
+ // Purpose: connect to server from native server browser entries
+ //-----------------------------------------------------------------------------
+ SQRESULT ConnectToIPFromMenu(void* sqvm)
+ {
+ std::string svIpAddr = hsq_getstring(sqvm, 1);
+ std::string svEncKey = hsq_getstring(sqvm, 2);
+
+ if (svIpAddr.empty() || svEncKey.empty())
+ return SQ_OK;
+
+ DevMsg(eDLL_T::UI, "Connecting to server with connection string '%s' and encryption key '%s'\n", svIpAddr, svEncKey);
+
+ g_pIBrowser->ConnectToServer(svIpAddr, svEncKey);
+
+ return SQ_OK;
+ }
+
+ //-----------------------------------------------------------------------------
+ // Purpose: return all available map
+ //-----------------------------------------------------------------------------
+ SQRESULT GetAvailableMaps(void* sqvm)
+ {
+ std::vector vsvMapList = g_pIBrowser->m_vszMapFileNameList;
+
+ if (vsvMapList.empty())
+ {
+ DevMsg(eDLL_T::UI, "Available maps is empty!!!\n");
+ return SQ_OK;
+ }
+
+ DevMsg(eDLL_T::UI, "Requesting an array of '%i' available maps from script\n", vsvMapList.size());
+
+ hsq_newarray(sqvm, 0);
+
+ for (auto& it : vsvMapList)
+ {
+ hsq_pushstring(sqvm, it.c_str(), -1);
+ hsq_arrayappend(sqvm, -2);
+ }
+
+ return SQ_OK;
+ }
+ }
+#endif // !DEDICATED
+}
\ No newline at end of file
diff --git a/r5dev/squirrel/sqinit.h b/r5dev/squirrel/sqinit.h
index 98e790f6..1d1fae20 100644
--- a/r5dev/squirrel/sqinit.h
+++ b/r5dev/squirrel/sqinit.h
@@ -1,4 +1,5 @@
#pragma once
+#include "squirrel/sqapi.h"
namespace
{
@@ -8,6 +9,37 @@ namespace
std::uint32_t* g_nRemoteFunctionCallsChecksum = reinterpret_cast(p_Script_Remote_BeginRegisteringFunctions.FindPatternSelf("89 05", ADDRESS::Direction::DOWN, 150).ResolveRelativeAddressSelf(0x2, 0x6).GetPtr());
}
+namespace VSquirrel
+{
+ namespace SHARED
+ {
+ SQRESULT Script_NativeTest(void* sqvm);
+ }
+ namespace SERVER
+ {
+ }
+#ifndef DEDICATED
+ namespace CLIENT
+ {
+ }
+ namespace UI
+ {
+ SQRESULT GetServerName(void* sqvm);
+ SQRESULT GetServerPlaylist(void* sqvm);
+ SQRESULT GetServerMap(void* sqvm);
+ SQRESULT GetServerCount(void* sqvm);
+ SQRESULT GetSDKVersion(void* sqvm);
+ SQRESULT GetPromoData(void* sqvm);
+ SQRESULT SetEncKeyAndConnect(void* sqvm);
+ SQRESULT CreateServerFromMenu(void* sqvm);
+ SQRESULT JoinPrivateServerFromMenu(void* sqvm);
+ SQRESULT GetPrivateServerMessage(void* sqvm);
+ SQRESULT ConnectToIPFromMenu(void* sqvm);
+ SQRESULT GetAvailableMaps(void* sqvm);
+ }
+#endif // !DEDICATED
+}
+
///////////////////////////////////////////////////////////////////////////////
class HSqInit : public IDetour
{
diff --git a/r5dev/squirrel/sqnativefunctions.cpp b/r5dev/squirrel/sqnativefunctions.cpp
deleted file mode 100644
index 7c24f9cc..00000000
--- a/r5dev/squirrel/sqnativefunctions.cpp
+++ /dev/null
@@ -1,265 +0,0 @@
-#include "core/stdafx.h"
-#include "squirrel/sqnativefunctions.h"
-
-#include "engine/sys_utils.h"
-#include "gameui/IBrowser.h"
-
-namespace SQNativeFunctions
-{
- namespace IBrowser
- {
-
- //----------------------------------------------------------------------------
- // Purpose: get servers current server name from serverlist index
- //-----------------------------------------------------------------------------
- SQRESULT GetServerName(void* sqvm)
- {
- int svIndex = hsq_getinteger(sqvm, 1);
- std::string szSvName = g_pIBrowser->m_vServerList[svIndex].svServerName;
-
- hsq_pushstring(sqvm, szSvName.c_str(), -1);
-
- return SQ_OK;
- }
-
- //----------------------------------------------------------------------------
- // Purpose: get servers current playlist via serverlist index
- //-----------------------------------------------------------------------------
- SQRESULT GetServerPlaylist(void* sqvm)
- {
- int svIndex = hsq_getinteger(sqvm, 1);
- std::string szSvPlaylist = g_pIBrowser->m_vServerList[svIndex].svPlaylist;
-
- hsq_pushstring(sqvm, szSvPlaylist.c_str(), -1);
-
- return SQ_OK;
- }
-
- //----------------------------------------------------------------------------
- // Purpose: get servers current map via serverlist index
- //-----------------------------------------------------------------------------
- SQRESULT GetServerMap(void* sqvm)
- {
- int svIndex = hsq_getinteger(sqvm, 1);
- std::string szSvMapName = g_pIBrowser->m_vServerList[svIndex].svMapName;
-
- hsq_pushstring(sqvm, szSvMapName.c_str(), -1);
-
- return SQ_OK;
- }
-
- //----------------------------------------------------------------------------
- // Purpose: get current server count from pylon
- //-----------------------------------------------------------------------------
- SQRESULT GetServerCount(void* sqvm)
- {
- g_pIBrowser->GetServerList(); // Refresh svListing list.
-
- hsq_pushinteger(sqvm, g_pIBrowser->m_vServerList.size());
-
- return SQ_OK;
- }
-
- //----------------------------------------------------------------------------
- // Purpose: expose SDK version to SQ
- //-----------------------------------------------------------------------------
- SQRESULT GetSDKVersion(void* sqvm)
- {
- hsq_pushstring(sqvm, g_pR5net->GetSDKVersion().c_str(), -1);
-
- return SQ_OK;
- }
-
- //----------------------------------------------------------------------------
- // Purpose: get promo data for serverbrowser panels
- //-----------------------------------------------------------------------------
- SQRESULT GetPromoData(void* sqvm)
- {
- enum class R5RPromoData : int
- {
- PromoLargeTitle,
- PromoLargeDesc,
- PromoLeftTitle,
- PromoLeftDesc,
- PromoRightTitle,
- PromoRightDesc
- };
-
- R5RPromoData ePromoIndex = (R5RPromoData)hsq_getinteger(sqvm, 1);
-
- std::string szPromo = std::string();
-
- switch (ePromoIndex)
- {
- case R5RPromoData::PromoLargeTitle:
- {
- szPromo = "Welcome To R5Reloaded!";
- break;
- }
- case R5RPromoData::PromoLargeDesc:
- {
- szPromo = "Make sure to join the discord! discord.gg/r5reloaded";
- break;
- }
- case R5RPromoData::PromoLeftTitle:
- {
- szPromo = "Yes";
- break;
- }
- case R5RPromoData::PromoLeftDesc:
- {
- szPromo = "Your ad could be here";
- break;
- }
- case R5RPromoData::PromoRightTitle:
- {
- szPromo = "Yes2";
- break;
- }
- case R5RPromoData::PromoRightDesc:
- {
- szPromo = "Yes3";
- break;
- }
- default:
- {
- szPromo = "You should not see this.";
- break;
- }
- }
-
- hsq_pushstring(sqvm, szPromo.c_str(), -1);
-
- return SQ_OK;
- }
-
- //-----------------------------------------------------------------------------
- // Purpose: set netchannel encryption key and connect to server
- //-----------------------------------------------------------------------------
- SQRESULT SetEncKeyAndConnect(void* sqvm)
- {
- int svIndex = hsq_getinteger(sqvm, 1);
-
- g_pIBrowser->ConnectToServer(g_pIBrowser->m_vServerList[svIndex].svIpAddress, g_pIBrowser->m_vServerList[svIndex].svPort, g_pIBrowser->m_vServerList[svIndex].svEncryptionKey);
-
- return SQ_OK;
- }
-
- //-----------------------------------------------------------------------------
- // Purpose: create server via native serverbrowser entries
- //-----------------------------------------------------------------------------
- SQRESULT CreateServerFromMenu(void* sqvm)
- {
- std::string szSvName = hsq_getstring(sqvm, 1);
- std::string szSvMapName = hsq_getstring(sqvm, 2);
- std::string szSvPlaylist = hsq_getstring(sqvm, 3);
- EServerVisibility eSvVisibility = (EServerVisibility)hsq_getinteger(sqvm, 4);
-
- if (szSvName.empty() || szSvMapName.empty() || szSvPlaylist.empty())
- return SQ_OK;
-
- // Adjust browser settings.
- g_pIBrowser->m_Server.svPlaylist = szSvPlaylist;
- g_pIBrowser->m_Server.svMapName = szSvMapName;
- g_pIBrowser->m_Server.svServerName = szSvName;
- g_pIBrowser->eServerVisibility = eSvVisibility;
-
- // Launch server.
- g_pIBrowser->LaunchServer();
-
- return SQ_OK;
- }
-
- //-----------------------------------------------------------------------------
- // // Purpose: request token from pylon and join server with result.
- //-----------------------------------------------------------------------------
- SQRESULT JoinPrivateServerFromMenu(void* sqvm)
- {
- std::string szHiddenServerRequestMessage = std::string();
-
- std::string szToken = hsq_getstring(sqvm, 1);
-
- ServerListing svListing;
- bool result = g_pR5net->GetServerByToken(svListing, szHiddenServerRequestMessage, szToken); // Send szToken connect request.
- if (result)
- {
- g_pIBrowser->ConnectToServer(svListing.svIpAddress, svListing.svPort, svListing.svEncryptionKey);
- }
-
- return SQ_OK;
- }
-
- //-----------------------------------------------------------------------------
- // Purpose: get response from private server request
- //-----------------------------------------------------------------------------
- SQRESULT GetPrivateServerMessage(void* sqvm)
- {
- std::string szHiddenServerRequestMessage = std::string();
-
- std::string szToken = hsq_getstring(sqvm, 1);
-
- ServerListing slServer;
- bool result = g_pR5net->GetServerByToken(slServer, szHiddenServerRequestMessage, szToken); // Send szToken connect request.
- if (!slServer.svServerName.empty())
- {
- szHiddenServerRequestMessage = "Found Server: " + slServer.svServerName;
-
- hsq_pushstring(sqvm, szHiddenServerRequestMessage.c_str(), -1);
- }
- else
- {
- szHiddenServerRequestMessage = "Error: Server Not Found";
-
- hsq_pushstring(sqvm, szHiddenServerRequestMessage.c_str(), -1);
- }
-
- DevMsg(eDLL_T::UI, "GetPrivateServeMessage response: %s\n", szHiddenServerRequestMessage.c_str());
-
- return SQ_OK;
- }
-
- //-----------------------------------------------------------------------------
- // Purpose: connect to server from native server browser entries
- //-----------------------------------------------------------------------------
- SQRESULT ConnectToIPFromMenu(void* sqvm)
- {
- std::string szIP = hsq_getstring(sqvm, 1);
- std::string szEncKey = hsq_getstring(sqvm, 2);
-
- if (szIP.empty() || szEncKey.empty())
- return SQ_OK;
-
- DevMsg(eDLL_T::UI, "Connecting to server with connection string %s and encryptionkey %s\n", szIP, szEncKey);
-
- g_pIBrowser->ConnectToServer(szIP, szEncKey);
-
- return SQ_OK;
- }
-
- //-----------------------------------------------------------------------------
- // Purpose: return all available map
- //-----------------------------------------------------------------------------
- SQRESULT GetAvailableMaps(void* sqvm)
- {
- std::vector mapList = g_pIBrowser->m_vszMapFileNameList;
-
- if (mapList.empty())
- {
- DevMsg(eDLL_T::UI, "Available maps is empty!!!\n");
- return SQ_OK;
- }
-
- DevMsg(eDLL_T::UI, "Requesting an array of %i available maps from script\n", mapList.size());
-
- hsq_newarray(sqvm, 0);
-
- for (auto& it : mapList)
- {
- hsq_pushstring(sqvm, it.c_str(), -1);
- hsq_arrayappend(sqvm, -2);
- }
-
- return SQ_OK;
- }
- }
-}
\ No newline at end of file
diff --git a/r5dev/squirrel/sqnativefunctions.h b/r5dev/squirrel/sqnativefunctions.h
deleted file mode 100644
index 273f2e44..00000000
--- a/r5dev/squirrel/sqnativefunctions.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#pragma once
-#include "squirrel/sqapi.h"
-
-namespace SQNativeFunctions
-{
- namespace IBrowser
- {
- SQRESULT GetServerName(void* sqvm);
- SQRESULT GetServerPlaylist(void* sqvm);
- SQRESULT GetServerMap(void* sqvm);
- SQRESULT GetServerCount(void* sqvm);
- SQRESULT GetSDKVersion(void* sqvm);
- SQRESULT GetPromoData(void* sqvm);
- SQRESULT SetEncKeyAndConnect(void* sqvm);
- SQRESULT CreateServerFromMenu(void* sqvm);
- SQRESULT JoinPrivateServerFromMenu(void* sqvm);
- SQRESULT GetPrivateServerMessage(void* sqvm);
- SQRESULT ConnectToIPFromMenu(void* sqvm);
- SQRESULT GetAvailableMaps(void* sqvm);
- }
-}
\ No newline at end of file
diff --git a/r5dev/squirrel/sqvm.cpp b/r5dev/squirrel/sqvm.cpp
index cb009f6d..2d95f921 100644
--- a/r5dev/squirrel/sqvm.cpp
+++ b/r5dev/squirrel/sqvm.cpp
@@ -14,7 +14,7 @@
#include "vgui/CEngineVGui.h"
#include "gameui/IConsole.h"
#include "squirrel/sqvm.h"
-#include "squirrel/sqnativefunctions.h"
+#include "squirrel/sqinit.h"
//---------------------------------------------------------------------------------
// Purpose: prints the output of each VM to the console
@@ -226,6 +226,9 @@ bool HSQVM_LoadScript(void* sqvm, const char* szScriptPath, const char* szScript
return SQVM_LoadScript(sqvm, szScriptPath, szScriptName, nFlag);
}
+//---------------------------------------------------------------------------------
+// Purpose: registers and exposes code functions to target VM's
+//---------------------------------------------------------------------------------
void HSQVM_RegisterFunction(void* sqvm, const char* szName, const char* szHelpString, const char* szRetValType, const char* szArgTypes, void* pFunction)
{
SQFuncRegistration* sqFunc = new SQFuncRegistration();
@@ -240,48 +243,53 @@ void HSQVM_RegisterFunction(void* sqvm, const char* szName, const char* szHelpSt
SQVM_RegisterFunc(sqvm, sqFunc, 1);
}
-int HSQVM_NativeTest(void* sqvm)
-{
- // Function code goes here.
- return 1;
-}
-
-void RegisterUIScriptFunctions(void* sqvm)
-{
-#ifndef DEDICATED
- HSQVM_RegisterFunction(sqvm, "UINativeTest", "native ui test function", "void", "", &HSQVM_NativeTest);
-
- // functions for retrieving server browser data
- HSQVM_RegisterFunction(sqvm, "GetServerName", "get name of the server at the specified index of the server list", "string", "int", &SQNativeFunctions::IBrowser::GetServerName);
- HSQVM_RegisterFunction(sqvm, "GetServerPlaylist", "get playlist of the server at the specified index of the server list", "string", "int", &SQNativeFunctions::IBrowser::GetServerPlaylist);
- HSQVM_RegisterFunction(sqvm, "GetServerMap", "get map of the server at the specified index of the server list", "string", "int", &SQNativeFunctions::IBrowser::GetServerMap);
- HSQVM_RegisterFunction(sqvm, "GetServerCount", "get number of public servers", "int", "", &SQNativeFunctions::IBrowser::GetServerCount);
-
- // misc main menu functions
- HSQVM_RegisterFunction(sqvm, "GetSDKVersion", "get sdk version as a string", "string", "", &SQNativeFunctions::IBrowser::GetSDKVersion);
- HSQVM_RegisterFunction(sqvm, "GetPromoData", "get promo data for specified slot type", "string", "int", &SQNativeFunctions::IBrowser::GetPromoData);
-
- // functions for connecting to servers
- HSQVM_RegisterFunction(sqvm, "CreateServer", "start server with the specified settings", "void", "string,string,string,int", &SQNativeFunctions::IBrowser::CreateServerFromMenu);
- HSQVM_RegisterFunction(sqvm, "SetEncKeyAndConnect", "set the encryption key to that of the specified server and connects to it", "void", "int", &SQNativeFunctions::IBrowser::SetEncKeyAndConnect);
- HSQVM_RegisterFunction(sqvm, "JoinPrivateServerFromMenu", "join private server by token", "void", "string", &SQNativeFunctions::IBrowser::JoinPrivateServerFromMenu);
- HSQVM_RegisterFunction(sqvm, "GetPrivateServerMessage", "get private server join status message", "string", "string", &SQNativeFunctions::IBrowser::GetPrivateServerMessage);
- HSQVM_RegisterFunction(sqvm, "ConnectToIPFromMenu", "join server by ip and encryption key", "void", "string,string", &SQNativeFunctions::IBrowser::ConnectToIPFromMenu);
-
- HSQVM_RegisterFunction(sqvm, "GetAvailableMaps", "gets an array of all the available maps that can be used to host a server", "array", "", &SQNativeFunctions::IBrowser::GetAvailableMaps);
-#endif
-}
-
-void RegisterClientScriptFunctions(void* sqvm)
-{
- HSQVM_RegisterFunction(sqvm, "ClientNativeTest", "native client function", "void", "", &HSQVM_NativeTest);
-}
-
+//---------------------------------------------------------------------------------
+// Purpose: registers SERVER script functions
+//---------------------------------------------------------------------------------
void RegisterServerScriptFunctions(void* sqvm)
{
- HSQVM_RegisterFunction(sqvm, "ServerNativeTest", "native server function", "void", "", &HSQVM_NativeTest);
+ HSQVM_RegisterFunction(sqvm, "ServerNativeTest", "Native SERVER test function", "void", "", &VSquirrel::SHARED::Script_NativeTest);
}
+#ifndef DEDICATED
+//---------------------------------------------------------------------------------
+// Purpose: registers CLIENT script functions
+//---------------------------------------------------------------------------------
+void RegisterClientScriptFunctions(void* sqvm)
+{
+ HSQVM_RegisterFunction(sqvm, "ClientNativeTest", "Native CLIENT test function", "void", "", &VSquirrel::SHARED::Script_NativeTest);
+}
+
+//---------------------------------------------------------------------------------
+// Purpose: registers UI script functions
+//---------------------------------------------------------------------------------
+void RegisterUIScriptFunctions(void* sqvm)
+{
+ HSQVM_RegisterFunction(sqvm, "UINativeTest", "Native UI test function", "void", "", &VSquirrel::SHARED::Script_NativeTest);
+
+ // functions for retrieving server browser data
+ HSQVM_RegisterFunction(sqvm, "GetServerName", "Gets the name of the server at the specified index of the server list", "string", "int", &VSquirrel::UI::GetServerName);
+ HSQVM_RegisterFunction(sqvm, "GetServerPlaylist", "Gets the playlist of the server at the specified index of the server list", "string", "int", &VSquirrel::UI::GetServerPlaylist);
+ HSQVM_RegisterFunction(sqvm, "GetServerMap", "Gets the map of the server at the specified index of the server list", "string", "int", &VSquirrel::UI::GetServerMap);
+ HSQVM_RegisterFunction(sqvm, "GetServerCount", "Gets the number of public servers", "int", "", &VSquirrel::UI::GetServerCount);
+
+ // misc main menu functions
+ HSQVM_RegisterFunction(sqvm, "GetSDKVersion", "Gets the SDK version as a string", "string", "", &VSquirrel::UI::GetSDKVersion);
+ HSQVM_RegisterFunction(sqvm, "GetPromoData", "Gets promo data for specified slot type", "string", "int", &VSquirrel::UI::GetPromoData);
+
+ // functions for connecting to servers
+ HSQVM_RegisterFunction(sqvm, "CreateServer", "Start server with the specified settings", "void", "string,string,string,int", &VSquirrel::UI::CreateServerFromMenu);
+ HSQVM_RegisterFunction(sqvm, "SetEncKeyAndConnect", "Set the encryption key to that of the specified server and connects to it", "void", "int", &VSquirrel::UI::SetEncKeyAndConnect);
+ HSQVM_RegisterFunction(sqvm, "JoinPrivateServerFromMenu", "Joins private server by token", "void", "string", &VSquirrel::UI::JoinPrivateServerFromMenu);
+ HSQVM_RegisterFunction(sqvm, "GetPrivateServerMessage", "Gets private server join status message", "string", "string", &VSquirrel::UI::GetPrivateServerMessage);
+ HSQVM_RegisterFunction(sqvm, "ConnectToIPFromMenu", "Joins server by ip and encryption key", "void", "string,string", &VSquirrel::UI::ConnectToIPFromMenu);
+
+ HSQVM_RegisterFunction(sqvm, "GetAvailableMaps", "Gets an array of all the available maps that can be used to host a server", "array", "", &VSquirrel::UI::GetAvailableMaps);
+}
+
+//---------------------------------------------------------------------------------
+// Purpose: Origin functions are the last to be registered in the UI VM, we register anything ours below
+//---------------------------------------------------------------------------------
void HSQVM_RegisterOriginFuncs(void* sqvm)
{
if (sqvm == *p_SQVM_UIVM.RCast())
@@ -291,6 +299,7 @@ void HSQVM_RegisterOriginFuncs(void* sqvm)
return SQVM_RegisterOriginFuncs(sqvm);
}
+#endif // !DEDICATED
void SQVM_Attach()
{
@@ -298,7 +307,9 @@ void SQVM_Attach()
DetourAttach((LPVOID*)&SQVM_WarningFunc, &HSQVM_WarningFunc);
DetourAttach((LPVOID*)&SQVM_LoadRson, &HSQVM_LoadRson);
DetourAttach((LPVOID*)&SQVM_LoadScript, &HSQVM_LoadScript);
+#ifndef DEDICATED
DetourAttach((LPVOID*)&SQVM_RegisterOriginFuncs, &HSQVM_RegisterOriginFuncs);
+#endif // !DEDICATED
}
void SQVM_Detach()
@@ -307,7 +318,9 @@ void SQVM_Detach()
DetourDetach((LPVOID*)&SQVM_WarningFunc, &HSQVM_WarningFunc);
DetourDetach((LPVOID*)&SQVM_LoadRson, &HSQVM_LoadRson);
DetourDetach((LPVOID*)&SQVM_LoadScript, &HSQVM_LoadScript);
+#ifndef DEDICATED
DetourDetach((LPVOID*)&SQVM_RegisterOriginFuncs, &HSQVM_RegisterOriginFuncs);
+#endif // !DEDICATED
}
///////////////////////////////////////////////////////////////////////////////
diff --git a/r5dev/squirrel/sqvm.h b/r5dev/squirrel/sqvm.h
index a74c39a9..1fa08c06 100644
--- a/r5dev/squirrel/sqvm.h
+++ b/r5dev/squirrel/sqvm.h
@@ -1,5 +1,11 @@
#pragma once
+typedef int SQRESULT;
+#define SQ_OK (1)
+#define SQ_ERROR (-1)
+#define SQ_FAILED(res) (res<0)
+#define SQ_SUCCEEDED(res) (res>=0)
+
struct SQFuncRegistration
{
const char* m_szScriptName; // 00
@@ -43,12 +49,6 @@ const static std::string SQVM_ANSI_LOG_T[4] =
"\u001b[90mScript(X):"
};
-typedef int SQRESULT;
-#define SQ_OK (1)
-#define SQ_ERROR (-1)
-#define SQ_FAILED(res) (res<0)
-#define SQ_SUCCEEDED(res) (res>=0)
-
namespace
{
/* ==== SQUIRREL ======================================================================================================================================================== */
@@ -86,7 +86,6 @@ void* HSQVM_LoadRson(const char* szRsonName);
bool HSQVM_LoadScript(void* sqvm, const char* szScriptPath, const char* szScriptName, int nFlags);
void HSQVM_RegisterFunction(void* sqvm, const char* szName, const char* szHelpString, const char* szRetValType, const char* szArgTypes, void* pFunction);
-int HSQVM_NativeTest(void* sqvm);
void HSQVM_RegisterOriginFuncs(void* sqvm);
void SQVM_Attach();
@@ -97,12 +96,14 @@ class HSQVM : public IDetour
{
virtual void debugp()
{
- std::cout << "| FUN: SQVM_PrintFunc : 0x" << std::hex << std::uppercase << p_SQVM_PrintFunc.GetPtr() << std::setw(npad) << " |" << std::endl;
- std::cout << "| FUN: SQVM_WarningFunc : 0x" << std::hex << std::uppercase << p_SQVM_WarningFunc.GetPtr() << std::setw(npad) << " |" << std::endl;
- std::cout << "| FUN: SQVM_WarningCmd : 0x" << std::hex << std::uppercase << p_SQVM_WarningCmd.GetPtr() << std::setw(npad) << " |" << std::endl;
- std::cout << "| FUN: SQVM_LoadScript : 0x" << std::hex << std::uppercase << p_SQVM_LoadScript.GetPtr() << std::setw(npad) << " |" << std::endl;
- std::cout << "| FUN: SQVM_LoadRson : 0x" << std::hex << std::uppercase << p_SQVM_LoadRson.GetPtr() << std::setw(npad) << " |" << std::endl;
- std::cout << "| FUN: SQVM_RegisterFunc : 0x" << std::hex << std::uppercase << p_SQVM_RegisterFunc.GetPtr() << std::setw(npad) << " |" << std::endl;
+ std::cout << "| FUN: SQVM_PrintFunc : 0x" << std::hex << std::uppercase << p_SQVM_PrintFunc.GetPtr() << std::setw(npad) << " |" << std::endl;
+ std::cout << "| FUN: SQVM_WarningFunc : 0x" << std::hex << std::uppercase << p_SQVM_WarningFunc.GetPtr() << std::setw(npad) << " |" << std::endl;
+ std::cout << "| FUN: SQVM_WarningCmd : 0x" << std::hex << std::uppercase << p_SQVM_WarningCmd.GetPtr() << std::setw(npad) << " |" << std::endl;
+ std::cout << "| FUN: SQVM_LoadScript : 0x" << std::hex << std::uppercase << p_SQVM_LoadScript.GetPtr() << std::setw(npad) << " |" << std::endl;
+ std::cout << "| FUN: SQVM_LoadRson : 0x" << std::hex << std::uppercase << p_SQVM_LoadRson.GetPtr() << std::setw(npad) << " |" << std::endl;
+ std::cout << "| FUN: SQVM_RegisterFunc : 0x" << std::hex << std::uppercase << p_SQVM_RegisterFunc.GetPtr() << std::setw(npad) << " |" << std::endl;
+ std::cout << "| FUN: SQVM_CreateUIVM : 0x" << std::hex << std::uppercase << p_SQVM_CreateUIVM.GetPtr() << std::setw(npad) << " |" << std::endl;
+ std::cout << "| FUN: SQVM_RegisterOriginFuncs : 0x" << std::hex << std::uppercase << p_SQVM_RegisterOriginFuncs.GetPtr() << std::setw(npad) << " |" << std::endl;
std::cout << "+----------------------------------------------------------------+" << std::endl;
}
};