From 25e2581f2b69749dfb64e50a95cffed9d75436e6 Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Mon, 25 Jul 2022 20:06:06 +0200 Subject: [PATCH] Implement fully mapped out ConCommandBase VFTable interface class --- r5dev/public/include/iconcommand.h | 35 +++++++++++++++++++++++++++ r5dev/public/include/icvar.h | 9 +++++++ r5dev/tier1/IConVar.cpp | 4 ++- r5dev/tier1/cmd.cpp | 4 +-- r5dev/tier1/cmd.h | 3 ++- r5dev/vproj/clientsdk.vcxproj | 1 + r5dev/vproj/clientsdk.vcxproj.filters | 5 +++- r5dev/vproj/dedicated.vcxproj | 2 ++ r5dev/vproj/dedicated.vcxproj.filters | 6 +++++ r5dev/vproj/gamesdk.vcxproj | 2 ++ r5dev/vproj/gamesdk.vcxproj.filters | 6 +++++ 11 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 r5dev/public/include/iconcommand.h create mode 100644 r5dev/public/include/icvar.h diff --git a/r5dev/public/include/iconcommand.h b/r5dev/public/include/iconcommand.h new file mode 100644 index 00000000..6181c373 --- /dev/null +++ b/r5dev/public/include/iconcommand.h @@ -0,0 +1,35 @@ +#ifndef ICONCOMMAND_H +#define ICONCOMMAND_H +#include "icvar.h" + +//----------------------------------------------------------------------------- +// Abstract interface for ConVars +//----------------------------------------------------------------------------- +abstract_class IConCommandBase +{ +public: + virtual ~IConCommandBase(void) = 0; + + virtual bool IsCommand(void) const = 0; + + virtual bool IsFlagSet(int flag) const = 0; // Check flag + virtual void AddFlags(int flags) = 0; // Set flag + virtual void RemoveFlags(int flags) = 0; // Clear flag + virtual int GetFlags() const = 0; // Get flag + + virtual const char* GetName(void) const = 0; // Return name of cvar + virtual const char* GetHelpText(void) const = 0; // Return help text for cvar + virtual const char* GetUsageText(void) const = 0; // Return usage text for cvar + virtual void SetAccessor(char* bAccessors) const = 0; + + virtual bool IsRegistered(void) const = 0; + virtual CVarDLLIdentifier_t GetDLLIdentifier() const = 0; // Returns the DLL identifier + +protected: + virtual void Create(const char* pName, const char* pHelpString = 0, + int flags = 0) = 0; + virtual void Init() = 0; // Used internally by OneTimeInit to initialize/shutdown +}; + + +#endif // ICONCOMMAND_H \ No newline at end of file diff --git a/r5dev/public/include/icvar.h b/r5dev/public/include/icvar.h new file mode 100644 index 00000000..f58cfab3 --- /dev/null +++ b/r5dev/public/include/icvar.h @@ -0,0 +1,9 @@ +#ifndef ICVAR_H +#define ICVAR_H + +//----------------------------------------------------------------------------- +// ConVars/ComCommands are marked as having a particular DLL identifier +//----------------------------------------------------------------------------- +typedef int CVarDLLIdentifier_t; + +#endif // ICVAR_H diff --git a/r5dev/tier1/IConVar.cpp b/r5dev/tier1/IConVar.cpp index 2574ec30..5d2a866b 100644 --- a/r5dev/tier1/IConVar.cpp +++ b/r5dev/tier1/IConVar.cpp @@ -11,6 +11,8 @@ #include "tier1/cvar.h" #include "mathlib/bits.h" #include "vstdlib/callback.h" +#include "public/include/iconvar.h" +#include "public/include/iconcommand.h" //----------------------------------------------------------------------------- // Purpose: construct/allocate @@ -20,7 +22,7 @@ ConVar::ConVar(const char* pszName, const char* pszDefaultValue, int nFlags, con ConVar* pNewConVar = MemAllocSingleton()->Alloc(sizeof(ConVar)); // Allocate new memory with StdMemAlloc else we crash. memset(pNewConVar, '\0', sizeof(ConVar)); // Set all to null. - pNewConVar->m_pConCommandBaseVFTable = g_pConVarVFTable.RCast(); + pNewConVar->m_pConCommandBaseVFTable = g_pConVarVFTable.RCast(); pNewConVar->m_pIConVarVFTable = g_pIConVarVFTable.RCast(); ConVar_Register(pNewConVar, pszName, pszDefaultValue, nFlags, pszHelpString, bMin, fMin, bMax, fMax, pCallback, pszUsageString); diff --git a/r5dev/tier1/cmd.cpp b/r5dev/tier1/cmd.cpp index b9cab8ef..5a332ac0 100644 --- a/r5dev/tier1/cmd.cpp +++ b/r5dev/tier1/cmd.cpp @@ -101,7 +101,7 @@ ConCommand::ConCommand(const char* pszName, const char* pszHelpString, int nFlag ConCommand* pCommand = MemAllocSingleton()->Alloc(sizeof(ConCommand)); memset(pCommand, '\0', sizeof(ConCommand)); - pCommand->m_pConCommandBaseVTable = g_pConCommandVtable.RCast(); + pCommand->m_pConCommandBaseVFTable = g_pConCommandVtable.RCast(); pCommand->m_pszName = pszName; pCommand->m_pszHelpString = pszHelpString; pCommand->m_nFlags = nFlags; @@ -266,7 +266,7 @@ bool ConCommand::IsCommand(void) const //----------------------------------------------------------------------------- bool ConCommandBase::IsCommand(void) const { - return m_pConCommandBaseVTable != g_pConVarVtable.RCast(); + return m_pConCommandBaseVFTable != g_pConVarVFTable.RCast(); } //----------------------------------------------------------------------------- diff --git a/r5dev/tier1/cmd.h b/r5dev/tier1/cmd.h index d2d97993..16e15131 100644 --- a/r5dev/tier1/cmd.h +++ b/r5dev/tier1/cmd.h @@ -1,4 +1,5 @@ #pragma once +#include "public/include/iconcommand.h" //----------------------------------------------------------------------------- // Forward declarations @@ -99,7 +100,7 @@ public: char* CopyString(const char* szFrom) const; - void* m_pConCommandBaseVTable; //0x0000 + IConCommandBase* m_pConCommandBaseVFTable; //0x0000 ConCommandBase* m_pNext; //0x0008 bool m_bRegistered; //0x0010 char pad_0011[7]; //0x0011 diff --git a/r5dev/vproj/clientsdk.vcxproj b/r5dev/vproj/clientsdk.vcxproj index 773fe198..f8dab16a 100644 --- a/r5dev/vproj/clientsdk.vcxproj +++ b/r5dev/vproj/clientsdk.vcxproj @@ -243,6 +243,7 @@ + diff --git a/r5dev/vproj/clientsdk.vcxproj.filters b/r5dev/vproj/clientsdk.vcxproj.filters index 1338a212..57a8dd5f 100644 --- a/r5dev/vproj/clientsdk.vcxproj.filters +++ b/r5dev/vproj/clientsdk.vcxproj.filters @@ -1646,8 +1646,11 @@ sdk\game\client + + sdk\public\include + - sdk\tier1 + sdk\public\include diff --git a/r5dev/vproj/dedicated.vcxproj b/r5dev/vproj/dedicated.vcxproj index afc8e445..6afe7a8b 100644 --- a/r5dev/vproj/dedicated.vcxproj +++ b/r5dev/vproj/dedicated.vcxproj @@ -216,7 +216,9 @@ + + diff --git a/r5dev/vproj/dedicated.vcxproj.filters b/r5dev/vproj/dedicated.vcxproj.filters index e0b78f86..4c0f3069 100644 --- a/r5dev/vproj/dedicated.vcxproj.filters +++ b/r5dev/vproj/dedicated.vcxproj.filters @@ -1179,6 +1179,12 @@ sdk\public\include + + sdk\public\include + + + sdk\public\include + diff --git a/r5dev/vproj/gamesdk.vcxproj b/r5dev/vproj/gamesdk.vcxproj index 53a73118..092778df 100644 --- a/r5dev/vproj/gamesdk.vcxproj +++ b/r5dev/vproj/gamesdk.vcxproj @@ -267,7 +267,9 @@ + + diff --git a/r5dev/vproj/gamesdk.vcxproj.filters b/r5dev/vproj/gamesdk.vcxproj.filters index 101f8259..eab4b2a9 100644 --- a/r5dev/vproj/gamesdk.vcxproj.filters +++ b/r5dev/vproj/gamesdk.vcxproj.filters @@ -1739,6 +1739,12 @@ sdk\public\include + + sdk\public\include + + + sdk\public\include +