From f6a4b011f01c54dc494f52241555216a9c7ddcee Mon Sep 17 00:00:00 2001 From: IcePixelx <41352111+PixieCore@users.noreply.github.com> Date: Tue, 28 Dec 2021 01:14:56 +0100 Subject: [PATCH] ConVar/ConCommands improvements. --- r5dev/client/cdll_engine_int.cpp | 4 ++-- r5dev/engine/host_state.cpp | 4 ++-- r5dev/tier0/ConCommand.cpp | 8 ++++---- r5dev/tier0/ConCommand.h | 16 ++++++++++++++++ r5dev/tier0/IConVar.cpp | 8 ++++---- 5 files changed, 28 insertions(+), 12 deletions(-) diff --git a/r5dev/client/cdll_engine_int.cpp b/r5dev/client/cdll_engine_int.cpp index bfd36335..04a3a3c9 100644 --- a/r5dev/client/cdll_engine_int.cpp +++ b/r5dev/client/cdll_engine_int.cpp @@ -32,8 +32,8 @@ void __fastcall HFrameStageNotify(CHLClient* rcx, ClientFrameStage_t frameStage) IVEngineClient_CommandExecute(NULL, "exec autoexec_client.cfg"); *(bool*)m_bRestrictServerCommands = true; // Restrict commands. - void* disconnect = g_pCvar->FindCommand("disconnect"); - *(std::int32_t*)((std::uintptr_t)disconnect + 0x38) |= FCVAR_SERVER_CAN_EXECUTE; // Make sure server is not restricted to this. + ConCommandBase* disconnect = (ConCommandBase*)g_pCvar->FindCommand("disconnect"); + disconnect->AddFlags(FCVAR_SERVER_CAN_EXECUTE); // Make sure server is not restricted to this. if (net_userandomkey->m_pParent->m_iValue == 1) { diff --git a/r5dev/engine/host_state.cpp b/r5dev/engine/host_state.cpp index b8cdcde9..7470390d 100644 --- a/r5dev/engine/host_state.cpp +++ b/r5dev/engine/host_state.cpp @@ -45,8 +45,8 @@ void HCHostState_FrameUpdate(void* rcx, void* rdx, float time) #endif // !DEDICATED *(bool*)m_bRestrictServerCommands = true; // Restrict commands. - void* disconnect = g_pCvar->FindCommand("disconnect"); - *(std::int32_t*)((std::uintptr_t)disconnect + 0x38) |= FCVAR_SERVER_CAN_EXECUTE; // Make sure server is not restricted to this. + ConCommandBase* disconnect = (ConCommandBase*)g_pCvar->FindCommand("disconnect"); + disconnect->AddFlags(FCVAR_SERVER_CAN_EXECUTE); // Make sure server is not restricted to this. if (net_userandomkey->m_pParent->m_iValue == 1) { diff --git a/r5dev/tier0/ConCommand.cpp b/r5dev/tier0/ConCommand.cpp index 2b0739f0..c7ea41c9 100644 --- a/r5dev/tier0/ConCommand.cpp +++ b/r5dev/tier0/ConCommand.cpp @@ -20,7 +20,7 @@ bool HConCommand_IsFlagSet(ConCommandBase* pCommandBase, int nFlag) printf(" Flaged: %08X\n", pCommandBase->m_nFlags); } // Mask off FCVAR_CHEATS and FCVAR_DEVELOPMENTONLY. - pCommandBase->m_nFlags &= ~(FCVAR_DEVELOPMENTONLY | FCVAR_CHEAT); + pCommandBase->RemoveFlags(FCVAR_DEVELOPMENTONLY | FCVAR_CHEAT); if (cm_debug_cmdquery->m_pParent->m_iValue > 0) { printf(" Masked: %08X\n", pCommandBase->m_nFlags); @@ -38,7 +38,7 @@ bool HConCommand_IsFlagSet(ConCommandBase* pCommandBase, int nFlag) return false; } // Return false on every FCVAR_DEVELOPMENTONLY || FCVAR_CHEAT query. - return (pCommandBase->m_nFlags & nFlag) != 0; + return pCommandBase->HasFlags(nFlag) != 0; } else { @@ -48,7 +48,7 @@ bool HConCommand_IsFlagSet(ConCommandBase* pCommandBase, int nFlag) printf(" Flaged: %08X\n", pCommandBase->m_nFlags); } // Mask off FCVAR_DEVELOPMENTONLY. - pCommandBase->m_nFlags &= ~(FCVAR_DEVELOPMENTONLY); + pCommandBase->RemoveFlags(FCVAR_DEVELOPMENTONLY); if (cm_debug_cmdquery->m_pParent->m_iValue > 0) { printf(" Masked: %08X\n", pCommandBase->m_nFlags); @@ -66,7 +66,7 @@ bool HConCommand_IsFlagSet(ConCommandBase* pCommandBase, int nFlag) return false; } // Return false on every FCVAR_DEVELOPMENTONLY query. - return (pCommandBase->m_nFlags & nFlag) != 0; + return pCommandBase->HasFlags(nFlag) != 0; } // Default behaviour. return ConCommand_IsFlagSet(pCommandBase, nFlag); diff --git a/r5dev/tier0/ConCommand.h b/r5dev/tier0/ConCommand.h index 05b0e2dd..a4da6d2f 100644 --- a/r5dev/tier0/ConCommand.h +++ b/r5dev/tier0/ConCommand.h @@ -70,6 +70,22 @@ class ConCommand class ConCommandBase { public: + + void AddFlags(int flags) + { + m_nFlags |= flags; + } + + void RemoveFlags(int flags) + { + m_nFlags &= ~flags; + } + + bool HasFlags(int flags) + { + return m_nFlags & flags; + } + void* m_pConCommandBaseVTable; //0x0000 ConCommandBase* m_pNext; //0x0008 bool m_bRegistered; //0x0010 diff --git a/r5dev/tier0/IConVar.cpp b/r5dev/tier0/IConVar.cpp index d81edbf4..5d6d452e 100644 --- a/r5dev/tier0/IConVar.cpp +++ b/r5dev/tier0/IConVar.cpp @@ -19,7 +19,7 @@ bool HIConVar_IsFlagSet(ConVar* pConVar, int nFlags) printf(" Flaged: %08X\n", pConVar->m_ConCommandBase.m_nFlags); } // Mask off FCVAR_CHEATS and FCVAR_DEVELOPMENTONLY. - pConVar->m_ConCommandBase.m_nFlags &= ~(FCVAR_DEVELOPMENTONLY | FCVAR_CHEAT); + pConVar->m_ConCommandBase.RemoveFlags(FCVAR_DEVELOPMENTONLY | FCVAR_CHEAT); if (cm_debug_cmdquery->m_pParent->m_iValue > 0) { printf(" Masked: %08X\n", pConVar->m_ConCommandBase.m_nFlags); @@ -37,7 +37,7 @@ bool HIConVar_IsFlagSet(ConVar* pConVar, int nFlags) return false; } // Return false on every FCVAR_DEVELOPMENTONLY | FCVAR_CHEAT query. - return (pConVar->m_ConCommandBase.m_nFlags & nFlags) != 0; + return pConVar->m_ConCommandBase.HasFlags(nFlags) != 0; } else { @@ -47,7 +47,7 @@ bool HIConVar_IsFlagSet(ConVar* pConVar, int nFlags) printf(" Flaged: %08X\n", pConVar->m_ConCommandBase.m_nFlags); } // Mask off FCVAR_DEVELOPMENTONLY. - pConVar->m_ConCommandBase.m_nFlags &= ~(FCVAR_DEVELOPMENTONLY); + pConVar->m_ConCommandBase.RemoveFlags(FCVAR_DEVELOPMENTONLY); if (cm_debug_cmdquery->m_pParent->m_iValue > 0) { printf(" Masked: %08X\n", pConVar->m_ConCommandBase.m_nFlags); @@ -65,7 +65,7 @@ bool HIConVar_IsFlagSet(ConVar* pConVar, int nFlags) return false; } // Return false on every FCVAR_DEVELOPMENTONLY query. - return (pConVar->m_ConCommandBase.m_nFlags & nFlags) != 0; + return pConVar->m_ConCommandBase.HasFlags(nFlags) != 0; } // Default retail behaviour. return IConVar_IsFlagSet(pConVar, nFlags);