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; } };