Skip to content

Commit

Permalink
use hl2sdk new cvar and concmd
Browse files Browse the repository at this point in the history
  • Loading branch information
Nyano1337 committed Feb 28, 2025
1 parent 22a9b21 commit a5ddbf4
Show file tree
Hide file tree
Showing 11 changed files with 65 additions and 1,017 deletions.
41 changes: 20 additions & 21 deletions src/core/concmdmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,15 @@ CONCMD::CConCmdManager* CONCMD::GetManager() {
return &g_manager;
}

void CONCMD::RegServerCmd(std::string cmd, SrvCmd_Callback cb, std::string description, int64_t cmdFlag) {
static void RegCmd(const std::string& cmd, const std::string& description, uint64 cmdFlag) {
ConCommandCreation_t command;
command.m_pszName = cmd.c_str();
command.m_pszHelpString = description.c_str();
command.m_nFlags = cmdFlag;
g_pCVar->RegisterConCommand(command, 4);
}

void CONCMD::RegServerCmd(std::string cmd, SrvCmd_Callback cb, std::string description, uint64 cmdFlag) {
std::transform(cmd.begin(), cmd.end(), cmd.begin(), ::tolower);

if (!cmd.starts_with("sm_")) {
Expand All @@ -20,13 +28,10 @@ void CONCMD::RegServerCmd(std::string cmd, SrvCmd_Callback cb, std::string descr
info.cmdFlags = cmdFlag;
g_manager.m_umSrvCmds[UTIL::ToWideString(cmd.c_str())].emplace_back(info);

static FnCommandCallback_t nullcb;
ConCommandRefAbstract ref;
ConCommand command = ConCommand(&ref, cmd.c_str(), nullcb, description.c_str(), cmdFlag);
g_pCVar->RegisterConCommand(&command, 4);
RegCmd(cmd, description, cmdFlag);
}

void CONCMD::RegConsoleCmd(std::string cmd, ConCmd_Callback cb, std::string description, int64_t cmdFlag) {
void CONCMD::RegConsoleCmd(std::string cmd, ConCmd_Callback cb, std::string description, uint64 cmdFlag) {
std::transform(cmd.begin(), cmd.end(), cmd.begin(), ::tolower);

if (!cmd.starts_with("sm_")) {
Expand All @@ -40,13 +45,10 @@ void CONCMD::RegConsoleCmd(std::string cmd, ConCmd_Callback cb, std::string desc
info.cmdFlags = cmdFlag;
g_manager.m_umConCmds[UTIL::ToWideString(cmd.c_str())].emplace_back(info);

static FnCommandCallback_t nullcb;
ConCommandRefAbstract ref;
ConCommand command = ConCommand(&ref, cmd.c_str(), nullcb, description.c_str(), cmdFlag | FCVAR_CLIENT_CAN_EXECUTE);
g_pCVar->RegisterConCommand(&command, 4);
RegCmd(cmd, description, cmdFlag | FCVAR_CLIENT_CAN_EXECUTE);
}

void CONCMD::RegAdminCmd(std::string cmd, ConCmd_Callback cb, AdminFlag adminFlags, std::string description, int64_t cmdFlag) {
void CONCMD::RegAdminCmd(std::string cmd, ConCmd_Callback cb, AdminFlag adminFlags, std::string description, uint64 cmdFlag) {
std::transform(cmd.begin(), cmd.end(), cmd.begin(), ::tolower);

if (!cmd.starts_with("sm_")) {
Expand All @@ -60,10 +62,7 @@ void CONCMD::RegAdminCmd(std::string cmd, ConCmd_Callback cb, AdminFlag adminFla
info.cmdFlags = cmdFlag;
g_manager.m_umConCmds[UTIL::ToWideString(cmd.c_str())].emplace_back(info);

static FnCommandCallback_t nullcb;
ConCommandRefAbstract ref;
ConCommand command = ConCommand(&ref, cmd.c_str(), nullcb, description.c_str(), cmdFlag | FCVAR_CLIENT_CAN_EXECUTE);
g_pCVar->RegisterConCommand(&command, 4);
RegCmd(cmd, description, cmdFlag | FCVAR_CLIENT_CAN_EXECUTE);
}

void CONCMD::AddCommandListener(std::string cmd, ConCmdListener_Callback cb) {
Expand All @@ -72,13 +71,13 @@ void CONCMD::AddCommandListener(std::string cmd, ConCmdListener_Callback cb) {
g_manager.m_umConCmdListeners[UTIL::ToWideString(cmd.c_str())].emplace_back(cb);
}

ConCommand* CONCMD::Find(const char* name) {
auto hConcmd = reinterpret_cast<ICvarS2*>(g_pCVar)->FindCommand(name);
if (!hConcmd.IsValid()) {
return nullptr;
std::optional<ConCommandRef> CONCMD::Find(const char* name) {
ConCommandRef cmdRef = g_pCVar->FindConCommand(name, true);
if (!cmdRef.IsValidRef()) {
return std::nullopt;
}

return reinterpret_cast<ICvarS2*>(g_pCVar)->GetCommand(hConcmd);
return cmdRef;
}

static void ParseCommandArgs(const std::string& sRaw, std::vector<std::string>& vArgs) {
Expand Down Expand Up @@ -216,7 +215,7 @@ bool CONCMD::CConCmdManager::OnClientCommand(ISource2GameClients* pClient, CPlay
return true;
}

bool CONCMD::CConCmdManager::OnDispatchConCommand(ICvar* pCvar, ConCommandHandle cmd, const CCommandContext& ctx, const CCommand& args) {
bool CONCMD::CConCmdManager::OnDispatchConCommand(ICvar* pCvar, ConCommandRef cmd, const CCommandContext& ctx, const CCommand& args) {
auto pszCommand = args.Arg(0);
if (!pszCommand || !pszCommand[0]) {
return true;
Expand Down
17 changes: 9 additions & 8 deletions src/core/concmdmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#include <pch.h>
#include <core/adminmanager.h>

#include <sdk/entity/ccsplayercontroller.h>
#include <optional>

#define SCMD_CALLBACK(fn) static void fn(const std::vector<std::string>& vArgs)
#define SCMD_CALLBACK_L(...) [__VA_ARGS__](const std::vector<std::string>& vArgs) -> void
Expand All @@ -19,32 +19,33 @@ using ConCmdListener_Callback = std::function<bool(CCSPlayerController* pControl
namespace CONCMD {
class CConCmdManager : CCoreForward {
virtual bool OnClientCommand(ISource2GameClients* pClient, CPlayerSlot slot, const CCommand& args) override;
virtual bool OnDispatchConCommand(ICvar* pCvar, ConCommandHandle cmd, const CCommandContext& ctx, const CCommand& args) override;
virtual bool OnDispatchConCommand(ICvar* pCvar, ConCommandRef cmd, const CCommandContext& ctx, const CCommand& args) override;

public:
struct CConCmdInfo {
ConCmd_Callback callback;
AdminFlag adminFlags = AdminFlag::None;
std::string description;
int64_t cmdFlags = FCVAR_NONE;
uint64 cmdFlags = FCVAR_NONE;
};

struct CSrvCmdInfo {
SrvCmd_Callback callback;
std::string description;
int64_t cmdFlags = FCVAR_NONE;
uint64 cmdFlags = FCVAR_NONE;
};

std::unordered_map<std::wstring, std::vector<CConCmdInfo>> m_umConCmds;
std::unordered_map<std::wstring, std::vector<CSrvCmdInfo>> m_umSrvCmds;
std::unordered_map<std::wstring, std::vector<ConCmdListener_Callback>> m_umConCmdListeners;
};

void RegServerCmd(std::string cmd, SrvCmd_Callback cb, std::string description = std::string(), int64_t cmdFlag = FCVAR_NONE);
void RegConsoleCmd(std::string cmd, ConCmd_Callback cb, std::string description = std::string(), int64_t cmdFlag = FCVAR_NONE);
void RegAdminCmd(std::string cmd, ConCmd_Callback cb, AdminFlag adminFlags, std::string description = std::string(), int64_t cmdFlag = FCVAR_NONE);
void RegServerCmd(std::string cmd, SrvCmd_Callback cb, std::string description = std::string(), uint64 cmdFlag = FCVAR_NONE);
void RegConsoleCmd(std::string cmd, ConCmd_Callback cb, std::string description = std::string(), uint64 cmdFlag = FCVAR_NONE);
void RegAdminCmd(std::string cmd, ConCmd_Callback cb, AdminFlag adminFlags, std::string description = std::string(), uint64 cmdFlag = FCVAR_NONE);
void AddCommandListener(std::string cmd, ConCmdListener_Callback cb);
ConCommand* Find(const char* name);

std::optional<ConCommandRef> Find(const char* name);

extern CConCmdManager* GetManager();
} // namespace CONCMD
10 changes: 5 additions & 5 deletions src/core/cvarmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@
#include <pch.h>
#include <utils/utils.h>

CConVarBaseData* CVAR::Find(const char* name) {
ConVarHandleS2 cvarHandle = reinterpret_cast<ICvarS2*>(g_pCVar)->FindConVar(name, true);
if (!cvarHandle.IsValid()) {
return nullptr;
std::optional<ConVarRefAbstract> CVAR::Find(const char* name) {
ConVarRefAbstract cvarRef = g_pCVar->FindConVar(name, true);
if (!cvarRef.IsValidRef()) {
return std::nullopt;
}

return reinterpret_cast<ICvarS2*>(g_pCVar)->GetConVar(cvarHandle);
return cvarRef;
}

void ReplicateConVarValue(const char* name, const char* value, CPlayerSlot slot) {
Expand Down
39 changes: 15 additions & 24 deletions src/core/cvarmanager.h
Original file line number Diff line number Diff line change
@@ -1,53 +1,44 @@
#pragma once

#include <sdk/convars2.h>
#include <tier1/convar.h>
#include <optional>

extern void ReplicateConVarValue(const char* name, const char* value, CPlayerSlot slot);

namespace CVAR {
template<typename T>
BaseConVar* Register(const char* name, T defaultValue, const char* helpString = "", typename ConVarS2<T>::FnChangeCallback_t callback = 0) {
ConVarS2<T>* pCvarCreated = new ConVarS2<T>(name, 0, helpString, defaultValue, callback);
ConVarRefAbstract* Register(const char* name, T defaultValue, const char* helpString = "", typename CConVar<T>::FnChangeCallback_t callback = 0) {
CConVar<T>* pCvarCreated = new CConVar<T>(name, 0, helpString, defaultValue, callback);
return pCvarCreated;
}

CConVarBaseData* Find(const char* name);
std::optional<ConVarRefAbstract> Find(const char* name);

template<typename T>
bool Set(const char* name, T value) {
CConVarBaseData* pTargetCvar = Find(name);
if (!pTargetCvar) {
auto targetCvar = Find(name);
if (!targetCvar) {
return false;
}

CConVarData<T>* pCastCvar = pTargetCvar->Cast<T>();
if (!pCastCvar) {
Plat_FatalErrorFunc("Failed to match Cvar type! Target type: %d, T type: %d\n", pTargetCvar->GetType(), TranslateConVarType<T>());
DebuggerBreak();
return false;
}
auto& targetCvarRef = targetCvar.value();
targetCvarRef.SetAs(value);

pCastCvar->SetValue(value);
return true;
}

template<typename T>
bool Replicate(const char* name, T value, CPlayerSlot slot) {
CConVarBaseData* pTargetCvar = Find(name);
if (!pTargetCvar) {
auto targetCvar = Find(name);
if (!targetCvar) {
return false;
}

CConVarData<T>* pCastCvar = pTargetCvar->Cast<T>();
if (!pCastCvar) {
Plat_FatalErrorFunc("Failed to match Cvar type! Target type: %d, T type: %d\n", pTargetCvar->GetType(), TranslateConVarType<T>());
DebuggerBreak();
return false;
}
auto& targetCvarRef = targetCvar.value();

char szNewValue[256];
CConVarData<T>::ValueToString(value, szNewValue, sizeof(szNewValue));
ReplicateConVarValue(name, szNewValue, slot);
CBufferString buffer;
targetCvarRef.TypeTraits()->ValueToString(value, buffer);
ReplicateConVarValue(name, buffer.Get(), slot);

return true;
}
Expand Down
2 changes: 1 addition & 1 deletion src/core/forwards.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class CCoreForward : public CBaseForward<CCoreForward> {
return true;
}

virtual bool OnDispatchConCommand(ICvar* pCvar, ConCommandHandle cmd, const CCommandContext& ctx, const CCommand& args) {
virtual bool OnDispatchConCommand(ICvar* pCvar, ConCommandRef cmd, const CCommandContext& ctx, const CCommand& args) {
return true;
}

Expand Down
2 changes: 1 addition & 1 deletion src/core/memory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ static void Hook_StartupServer(INetworkServerService* pThis, const GameSessionCo
MEM::SDKCall(MEM::TRAMPOLINE::g_fnStartupServer, pThis, &config, a3, a4);
}

static void Hook_DispatchConCommand(ICvar* pThis, ConCommandHandle cmd, const CCommandContext& ctx, const CCommand& args) {
static void Hook_DispatchConCommand(ICvar* pThis, ConCommandRef cmd, const CCommandContext& ctx, const CCommand& args) {
bool block = false;
for (auto p = CCoreForward::m_pFirst; p; p = p->m_pNext) {
if (!p->OnDispatchConCommand(pThis, cmd, ctx, args)) {
Expand Down
Loading

0 comments on commit a5ddbf4

Please sign in to comment.