From 9506a5141aeff639ec77226352b7cd63f80a2d5b Mon Sep 17 00:00:00 2001 From: Amos <48657826+Mauler125@users.noreply.github.com> Date: Wed, 23 Feb 2022 15:56:03 +0100 Subject: [PATCH] CConsole improvements * Pad the autocomplete list with 18 to keep all items in view * Show help text for ConCommand as well + Small code cleanup --- r5dev/gameui/IConsole.cpp | 66 ++++++++++++++++++++++++--------------- r5dev/tier0/IConVar.cpp | 32 +++++++++---------- r5dev/tier0/IConVar.h | 3 +- r5dev/tier0/cmd.cpp | 11 ++++++- r5dev/tier0/cmd.h | 1 + 5 files changed, 69 insertions(+), 44 deletions(-) diff --git a/r5dev/gameui/IConsole.cpp b/r5dev/gameui/IConsole.cpp index 231f67ef..6913d10d 100644 --- a/r5dev/gameui/IConsole.cpp +++ b/r5dev/gameui/IConsole.cpp @@ -139,7 +139,7 @@ void CConsole::Think(void) } } - while ((int)m_vsvHistory.size() > 512) + while (static_cast(m_vsvHistory.size()) > 512) { m_vsvHistory.erase(m_vsvHistory.begin()); } @@ -212,7 +212,7 @@ void CConsole::BasePanel(bool* bDraw) ImGui::PushItemWidth(footer_width_to_reserve - 80); if (ImGui::IsWindowAppearing()) { ImGui::SetKeyboardFocusHere(); } - if (ImGui::InputText("##input", m_szInputBuf, IM_ARRAYSIZE(m_szInputBuf), input_text_flags, &TextEditCallbackStub, (void*)this)) + if (ImGui::InputText("##input", m_szInputBuf, IM_ARRAYSIZE(m_szInputBuf), input_text_flags, &TextEditCallbackStub, reinterpret_cast(this))) { if (m_nSuggestPos != -1) { @@ -248,9 +248,15 @@ void CConsole::BasePanel(bool* bDraw) m_bReclaimFocus = false; } + int nPad = 0; + if (static_cast(m_vsvSuggest.size()) > 1) + { + // Pad with 18 to keep all items in view. + nPad = 18; + } m_vecSuggestWindowPos = ImGui::GetItemRectMin(); m_vecSuggestWindowPos.y += ImGui::GetItemRectSize().y; - m_vecSuggestWindowSize = ImVec2(500, std::clamp((int)m_vsvSuggest.size() * (int)ImGui::GetTextLineHeight(), 37, 122)); + m_vecSuggestWindowSize = ImVec2(500, nPad + std::clamp(static_cast(m_vsvSuggest.size()) * 18, 37, 122)); ImGui::SameLine(); if (ImGui::Button("Submit")) @@ -372,7 +378,7 @@ bool CConsole::CanAutoComplete(void) memmove(szCurInputBuf, m_szInputBuf, strlen(m_szInputBuf) + 1); FindFromPartial(); } - if ((int)m_vsvSuggest.size() <= 0) + if (static_cast(m_vsvSuggest.size()) <= 0) { m_nSuggestPos = -1; return false; @@ -413,25 +419,35 @@ void CConsole::FindFromPartial(void) if (std::find(m_vsvSuggest.begin(), m_vsvSuggest.end(), g_vsvAllConVars[i]) == m_vsvSuggest.end()) { std::string svValue; - ConVar* pConVar = g_pCVar->FindVar(g_vsvAllConVars[i].c_str()); - if (pConVar != nullptr) - { - svValue = "= \""; // Assign default value to string if its a ConVar. - svValue.append(pConVar->GetString()); - svValue.append("\""); + ConCommandBase* pCommandBase = g_pCVar->FindCommandBase(g_vsvAllConVars[i].c_str()); + if (pCommandBase != nullptr) + { + if (!pCommandBase->IsCommand()) + { + ConVar* pConVar = reinterpret_cast(pCommandBase); + + svValue = "= ["; // Assign default value to string if its a ConVar. + svValue.append(pConVar->GetString()); + svValue.append("]"); + } if (con_suggestion_helptext->GetBool()) { - std::string svHelpText = pConVar->GetHelpText(); - if (!svHelpText.empty()) + if (pCommandBase->GetHelpText()) { - svValue.append(" | [" + svHelpText + "]"); + std::string svHelpText = pCommandBase->GetHelpText(); + if (!svHelpText.empty()) + { + svValue.append(" | \"" + svHelpText + "\""); + } } - - std::string svUsageText = pConVar->GetUsageText(); - if (!svUsageText.empty()) + if (pCommandBase->GetUsageText()) { - svValue.append(" | [" + svUsageText + "]"); + std::string svUsageText = pCommandBase->GetUsageText(); + if (!svUsageText.empty()) + { + svValue.append(" | \"" + svUsageText + "\""); + } } } } @@ -459,7 +475,7 @@ void CConsole::ProcessCommand(const char* pszCommand) std::this_thread::sleep_for(std::chrono::milliseconds(1)); m_nHistoryPos = -1; - for (int i = (int)m_vsvHistory.size() - 1; i >= 0; i--) + for (int i = static_cast(m_vsvHistory.size()) - 1; i >= 0; i--) { if (Stricmp(m_vsvHistory[i].c_str(), pszCommand) == 0) { @@ -476,7 +492,7 @@ void CConsole::ProcessCommand(const char* pszCommand) else if (Stricmp(pszCommand, "HELP") == 0) { AddLog("Commands:"); - for (int i = 0; i < (int)m_vsvCommands.size(); i++) + for (int i = 0; i < static_cast(m_vsvCommands.size()); i++) { AddLog("- %s", m_vsvCommands[i].c_str()); } @@ -497,8 +513,8 @@ void CConsole::ProcessCommand(const char* pszCommand) } else if (Stricmp(pszCommand, "HISTORY") == 0) { - int nFirst = (int)m_vsvHistory.size() - 10; - for (int i = nFirst > 0 ? nFirst : 0; i < (int)m_vsvHistory.size(); i++) + int nFirst = static_cast(m_vsvHistory.size()) - 10; + for (int i = nFirst > 0 ? nFirst : 0; i < static_cast(m_vsvHistory.size()); i++) { AddLog("%3d: %s\n", i, m_vsvHistory[i].c_str()); } @@ -543,7 +559,7 @@ int CConsole::TextEditCallback(ImGuiInputTextCallbackData* iData) } else if (iData->EventKey == ImGuiKey_DownArrow) { - if (m_nSuggestPos < (int)m_vsvSuggest.size() - 1) + if (m_nSuggestPos < static_cast(m_vsvSuggest.size()) - 1) { m_nSuggestPos++; m_bSuggestMoved = true; @@ -557,7 +573,7 @@ int CConsole::TextEditCallback(ImGuiInputTextCallbackData* iData) { if (m_nHistoryPos == -1) { - m_nHistoryPos = (int)m_vsvHistory.size() - 1; + m_nHistoryPos = static_cast(m_vsvHistory.size()) - 1; } else if (m_nHistoryPos > 0) { @@ -568,7 +584,7 @@ int CConsole::TextEditCallback(ImGuiInputTextCallbackData* iData) { if (m_nHistoryPos != -1) { - if (++m_nHistoryPos >= (int)m_vsvHistory.size()) + if (++m_nHistoryPos >= static_cast(m_vsvHistory.size())) { m_nHistoryPos = -1; } @@ -636,7 +652,7 @@ int CConsole::TextEditCallback(ImGuiInputTextCallbackData* iData) //----------------------------------------------------------------------------- int CConsole::TextEditCallbackStub(ImGuiInputTextCallbackData* iData) { - CConsole* pConsole = (CConsole*)iData->UserData; + CConsole* pConsole = reinterpret_cast(iData->UserData); return pConsole->TextEditCallback(iData); } diff --git a/r5dev/tier0/IConVar.cpp b/r5dev/tier0/IConVar.cpp index 0aa84676..5447fe88 100644 --- a/r5dev/tier0/IConVar.cpp +++ b/r5dev/tier0/IConVar.cpp @@ -19,7 +19,7 @@ ConVar::ConVar(const char* pszName, const char* pszDefaultValue, int nFlags, con ConVar* pNewConVar = reinterpret_cast(MemAlloc_Wrapper(sizeof(ConVar))); // Allocate new memory with StdMemAlloc else we crash. memset(pNewConVar, '\0', sizeof(ConVar)); // Set all to null. - pNewConVar->m_ConCommandBase.m_pConCommandBaseVTable = g_pConVarVtable.RCast(); + pNewConVar->m_pConCommandBaseVTable = g_pConVarVtable.RCast(); pNewConVar->m_pIConVarVTable = g_pIConVarVtable.RCast(); ConVar_Register(pNewConVar, pszName, pszDefaultValue, nFlags, pszHelpString, bMin, fMin, bMax, fMax, pCallback, pszUsageString); @@ -132,7 +132,7 @@ void ConVar::Init(void) const //----------------------------------------------------------------------------- void ConVar::AddFlags(int nFlags) { - m_pParent->m_ConCommandBase.m_nFlags |= nFlags; + m_pParent->m_nFlags |= nFlags; } //----------------------------------------------------------------------------- @@ -141,7 +141,7 @@ void ConVar::AddFlags(int nFlags) //----------------------------------------------------------------------------- void ConVar::RemoveFlags(int nFlags) { - m_ConCommandBase.m_nFlags &= ~nFlags; + m_nFlags &= ~nFlags; } //----------------------------------------------------------------------------- @@ -150,7 +150,7 @@ void ConVar::RemoveFlags(int nFlags) //----------------------------------------------------------------------------- const char* ConVar::GetBaseName(void) const { - return m_pParent->m_ConCommandBase.m_pszName; + return m_pParent->m_pszName; } //----------------------------------------------------------------------------- @@ -159,7 +159,7 @@ const char* ConVar::GetBaseName(void) const //----------------------------------------------------------------------------- const char* ConVar::GetHelpText(void) const { - return m_pParent->m_ConCommandBase.m_pszHelpString; + return m_pParent->m_pszHelpString; } //----------------------------------------------------------------------------- @@ -168,7 +168,7 @@ const char* ConVar::GetHelpText(void) const //----------------------------------------------------------------------------- const char* ConVar::GetUsageText(void) const { - return m_pParent->m_ConCommandBase.m_pszUsageString; + return m_pParent->m_pszUsageString; } //----------------------------------------------------------------------------- @@ -214,7 +214,7 @@ Color ConVar::GetColor(void) const //----------------------------------------------------------------------------- const char* ConVar::GetString(void) const { - if (m_ConCommandBase.m_nFlags & FCVAR_NEVER_AS_STRING) + if (m_nFlags & FCVAR_NEVER_AS_STRING) { return "FCVAR_NEVER_AS_STRING"; } @@ -308,7 +308,7 @@ void ConVar::SetValue(int nValue) m_Value.m_fValue = flValue; m_Value.m_fValue = nValue; - if (!(m_ConCommandBase.m_nFlags & FCVAR_NEVER_AS_STRING)) + if (!(m_nFlags & FCVAR_NEVER_AS_STRING)) { char szTempValue[32]; snprintf(szTempValue, sizeof(szTempValue), "%d", m_Value.m_nValue); @@ -338,7 +338,7 @@ void ConVar::SetValue(float flValue) m_Value.m_fValue = flValue; m_Value.m_nValue = (int)m_Value.m_fValue; - if (!(m_ConCommandBase.m_nFlags & FCVAR_NEVER_AS_STRING)) + if (!(m_nFlags & FCVAR_NEVER_AS_STRING)) { char szTempValue[32]; snprintf(szTempValue, sizeof(szTempValue), "%f", m_Value.m_fValue); @@ -392,7 +392,7 @@ void ConVar::SetValue(const char* pszValue) m_Value.m_nValue = (int)(m_Value.m_fValue); } - if (!(m_ConCommandBase.m_nFlags & FCVAR_NEVER_AS_STRING)) + if (!(m_nFlags & FCVAR_NEVER_AS_STRING)) { ChangeStringValue(pszNewValue, flOldValue); } @@ -560,7 +560,7 @@ bool ConVar::ClampValue(float& flValue) //----------------------------------------------------------------------------- bool ConVar::IsRegistered(void) const { - return m_pParent->m_ConCommandBase.m_bRegistered; + return m_pParent->m_bRegistered; } //----------------------------------------------------------------------------- @@ -582,20 +582,20 @@ bool ConVar::IsFlagSet(ConVar* pConVar, int nFlags) if (cm_debug_cmdquery->GetBool()) { printf("--------------------------------------------------\n"); - printf(" Flaged: %08X\n", pConVar->m_ConCommandBase.m_nFlags); + printf(" Flaged: %08X\n", pConVar->m_nFlags); } if (cm_return_false_cmdquery_cheats->GetBool()) { // Mask off FCVAR_CHEATS and FCVAR_DEVELOPMENTONLY. - pConVar->m_ConCommandBase.RemoveFlags(FCVAR_DEVELOPMENTONLY | FCVAR_CHEAT); + pConVar->RemoveFlags(FCVAR_DEVELOPMENTONLY | FCVAR_CHEAT); } else // Mask off FCVAR_DEVELOPMENTONLY. { - pConVar->m_ConCommandBase.RemoveFlags(FCVAR_DEVELOPMENTONLY); + pConVar->RemoveFlags(FCVAR_DEVELOPMENTONLY); } if (cm_debug_cmdquery->GetBool()) { - printf(" Masked: %08X\n", pConVar->m_ConCommandBase.m_nFlags); + printf(" Masked: %08X\n", pConVar->m_nFlags); printf(" Verify: %08X\n", nFlags); printf("--------------------------------------------------\n"); } @@ -610,7 +610,7 @@ bool ConVar::IsFlagSet(ConVar* pConVar, int nFlags) return false; } // Return false on every FCVAR_DEVELOPMENTONLY query. - return pConVar->m_ConCommandBase.HasFlags(nFlags) != 0; + return pConVar->HasFlags(nFlags) != 0; } //----------------------------------------------------------------------------- diff --git a/r5dev/tier0/IConVar.h b/r5dev/tier0/IConVar.h index f0ce93de..14b9c0f7 100644 --- a/r5dev/tier0/IConVar.h +++ b/r5dev/tier0/IConVar.h @@ -82,7 +82,7 @@ dq offset RegisterConVar; #STR: "Convar '%s' is flagged as both FCVAR_ARCHIVE an //----------------------------------------------------------------------------- // Purpose: A console variable //----------------------------------------------------------------------------- -class ConVar +class ConVar : public ConCommandBase { public: ConVar(void){}; @@ -140,7 +140,6 @@ public: int m_nValue; }; - ConCommandBase m_ConCommandBase {}; //0x0000 void* m_pIConVarVTable {}; //0x0040 ConVar* m_pParent {}; //0x0048 const char* m_pszDefaultValue{}; //0x0050 diff --git a/r5dev/tier0/cmd.cpp b/r5dev/tier0/cmd.cpp index f9d008e8..57ebfe67 100644 --- a/r5dev/tier0/cmd.cpp +++ b/r5dev/tier0/cmd.cpp @@ -147,7 +147,7 @@ bool ConCommand::IsCommand(void) const //----------------------------------------------------------------------------- bool ConCommandBase::IsCommand(void) const { - return true; + return m_pConCommandBaseVTable != g_pConVarVtable.RCast(); } //----------------------------------------------------------------------------- @@ -255,6 +255,15 @@ const char* ConCommandBase::GetHelpText(void) const return m_pszHelpString; } +//----------------------------------------------------------------------------- +// Purpose: Returns the ConCommandBase usage text. +// Output : const char* +//----------------------------------------------------------------------------- +const char* ConCommandBase::GetUsageText(void) const +{ + return m_pszUsageString; +} + //----------------------------------------------------------------------------- // Purpose: Copies string using local new/delete operators // Input : *szFrom - diff --git a/r5dev/tier0/cmd.h b/r5dev/tier0/cmd.h index 421d89dc..30439a8a 100644 --- a/r5dev/tier0/cmd.h +++ b/r5dev/tier0/cmd.h @@ -91,6 +91,7 @@ public: int GetFlags(void) const; ConCommandBase* GetNext(void) const; const char* GetHelpText(void) const; + const char* GetUsageText(void) const; char* CopyString(const char* szFrom) const;