From e34f3ad3c5758981e8a1fd7870dce6f1ac2da32b Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Sat, 24 Feb 2024 11:43:16 +0100 Subject: [PATCH] Tier1: fix ConCommand::Dispatch() Fix incorrect function prototype and add additional logic implemented in the engine. The code was crashing as the first parameter is the command target, but appears unused, the second parameter was actually the parameter that contained a pointer to the CCommand object which we needed. --- src/public/iconvar.h | 3 +++ src/public/tier1/convar.h | 7 ++++--- src/tier1/convar.cpp | 22 ++++++++++++---------- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/public/iconvar.h b/src/public/iconvar.h index a7a26c04..b492396d 100644 --- a/src/public/iconvar.h +++ b/src/public/iconvar.h @@ -67,6 +67,9 @@ class CUtlString; typedef void (*FnCommandCallbackV1_t)(void); typedef void (*FnCommandCallback_t)(const CCommand& command); +typedef void (*FnCommandSupplementalFinishCallback_t)(); +typedef void (*FnCommandSupplementalCallback_t)(const CCommand& command, FnCommandSupplementalFinishCallback_t); + #define COMMAND_COMPLETION_MAXITEMS 128 #define COMMAND_COMPLETION_ITEM_LENGTH 128 diff --git a/src/public/tier1/convar.h b/src/public/tier1/convar.h index d3cabc28..a234ec4f 100644 --- a/src/public/tier1/convar.h +++ b/src/public/tier1/convar.h @@ -15,6 +15,7 @@ #include "mathlib/color.h" #include "public/iconvar.h" #include "public/iconcommand.h" +#include "tier1/cmd.h" #include "tier1/utlvector.h" #include "tier1/utlstring.h" @@ -107,11 +108,11 @@ public: virtual bool CanAutoComplete(void) const; // Invoke the function - virtual void Dispatch(const CCommand& command); + virtual void Dispatch(const ECommandTarget_t target, const CCommand& command, const bool bCallSupplemental); //private: - void* m_nNullCallBack; //0x0040 - void* m_pSubCallback; //0x0048 + FnCommandSupplementalFinishCallback_t m_fnSupplementalFinishCallBack; //0x0040 + FnCommandSupplementalCallback_t m_fnSupplementalCallback; //0x0048 // NOTE: To maintain backward compatibility, we have to be very careful: // All public virtual methods must appear in the same order always diff --git a/src/tier1/convar.cpp b/src/tier1/convar.cpp index 53eccd91..b72f1617 100644 --- a/src/tier1/convar.cpp +++ b/src/tier1/convar.cpp @@ -310,8 +310,8 @@ int DefaultCompletionFunc(const char* partial, char commands[COMMAND_COMPLETION_ ConCommand::ConCommand(const char* pName, FnCommandCallbackV1_t callback, const char* pHelpString /*= 0*/, int flags /*= 0*/, FnCommandCompletionCallback completionFunc /*= 0*/, const char* pszUsageString /*= 0*/) { - m_nNullCallBack = DefaultNullSub; - m_pSubCallback = nullptr; + m_fnSupplementalFinishCallBack = DefaultNullSub; + m_fnSupplementalCallback = nullptr; // Set the callback m_fnCommandCallbackV1 = callback; @@ -327,8 +327,8 @@ ConCommand::ConCommand(const char* pName, FnCommandCallbackV1_t callback, const ConCommand::ConCommand(const char* pName, FnCommandCallback_t callback, const char* pHelpString /*= 0*/, int flags /*= 0*/, FnCommandCompletionCallback completionFunc /*= 0*/, const char* pszUsageString /*= 0*/) { - m_nNullCallBack = DefaultNullSub; - m_pSubCallback = nullptr; + m_fnSupplementalFinishCallBack = DefaultNullSub; + m_fnSupplementalCallback = nullptr; // Set the callback m_fnCommandCallback = callback; @@ -344,8 +344,8 @@ ConCommand::ConCommand(const char* pName, FnCommandCallback_t callback, const ch ConCommand::ConCommand(const char* pName, ICommandCallback* pCallback, const char* pHelpString /*= 0*/, int flags /*= 0*/, ICommandCompletionCallback* pCompletionCallback /*= 0*/, const char* pszUsageString /*= 0*/) { - m_nNullCallBack = DefaultNullSub; - m_pSubCallback = nullptr; + m_fnSupplementalFinishCallBack = DefaultNullSub; + m_fnSupplementalCallback = nullptr; // Set the callback m_pCommandCallback = pCallback; @@ -414,14 +414,13 @@ bool ConCommand::CanAutoComplete(void) const //----------------------------------------------------------------------------- // Purpose: invoke the function if there is one //----------------------------------------------------------------------------- -void ConCommand::Dispatch(const CCommand& command) +void ConCommand::Dispatch(const ECommandTarget_t target, const CCommand& command, const bool bCallSupplemental) { if (m_bUsingNewCommandCallback) { if (m_fnCommandCallback) { (*m_fnCommandCallback)(command); - return; } } else if (m_bUsingCommandCallbackInterface) @@ -429,7 +428,6 @@ void ConCommand::Dispatch(const CCommand& command) if (m_pCommandCallback) { m_pCommandCallback->CommandCallback(command); - return; } } else @@ -437,10 +435,14 @@ void ConCommand::Dispatch(const CCommand& command) if (m_fnCommandCallbackV1) { (*m_fnCommandCallbackV1)(); - return; } } + if (bCallSupplemental) + { + m_fnSupplementalCallback(command, m_fnSupplementalFinishCallBack); + } + // Command without callback!!! AssertMsg(0, "Encountered ConCommand '%s' without a callback!\n", GetName()); }