Skip to content

Commit

Permalink
progress report
Browse files Browse the repository at this point in the history
  • Loading branch information
Kenzzer committed Feb 7, 2024
1 parent f594c91 commit efc4891
Show file tree
Hide file tree
Showing 7 changed files with 287 additions and 152 deletions.
68 changes: 35 additions & 33 deletions core/metamod.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,33 @@ static bool is_game_init = false;
static bool vsp_load_requested = false;
static bool vsp_loaded = false;
static game_dll_t gamedll_info;
static MetamodSourceConVar *metamod_version = NULL;
static MetamodSourceConVar *mm_pluginsfile = NULL;
static MetamodSourceConVar *mm_basedir = NULL;

static MetamodSourceConVar<const char*> metamod_version("metamod_version",
ConVarFlag_Notify|ConVarFlag_SpOnly,
"Metamod:Source Version",
METAMOD_VERSION
);

static MetamodSourceConVar<const char*> mm_pluginsfile("mm_pluginsfile",
ConVarFlag_SpOnly,
"Metamod:Source Plugins File",
#if defined WIN32 || defined _WIN32
"addons\\metamod\\metaplugins.ini"
#else
"addons/metamod/metaplugins.ini"
#endif
);

static MetamodSourceConVar<const char*> mm_basedir("mm_basedir",
ConVarFlag_SpOnly,
"Metamod:Source Base Folder",
#if defined __linux__ || defined __APPLE__
"addons/metamod"
#else
"addons\\metamod"
#endif
);

static CreateInterfaceFn engine_factory = NULL;
static CreateInterfaceFn physics_factory = NULL;
static CreateInterfaceFn filesystem_factory = NULL;
Expand Down Expand Up @@ -180,12 +204,12 @@ static class ProviderCallbacks : public IMetamodSourceProviderCallbacks
sizeof(filepath),
"%s/%s",
mod_path.c_str(),
provider->GetConVarString(mm_pluginsfile));
mm_pluginsfile.GetValue());
g_Metamod.PathFormat(vdfpath,
sizeof(vdfpath),
"%s/%s",
mod_path.c_str(),
provider->GetConVarString(mm_basedir));
mm_basedir.GetValue());
mm_LoadPlugins(filepath, vdfpath);
}
else
Expand Down Expand Up @@ -438,15 +462,15 @@ DoInitialPluginLoads()
const char *mmBaseDir = provider->GetCommandLineValue("mm_basedir", NULL);
if (!pluginFile)
{
pluginFile = provider->GetConVarString(mm_pluginsfile);
pluginFile = mm_pluginsfile.GetValue();
if (pluginFile == NULL)
{
pluginFile = "addons/metamod/metaplugins.ini";
}
}
if (!mmBaseDir)
{
mmBaseDir = provider->GetConVarString(mm_basedir);
mmBaseDir = mm_basedir.GetValue();
if (mmBaseDir == NULL)
{
mmBaseDir = "addons/metamod";
Expand All @@ -471,30 +495,8 @@ mm_StartupMetamod(bool is_vsp_load)
METAMOD_VERSION,
is_vsp_load ? "V" : "");

metamod_version = provider->CreateConVar("metamod_version",
METAMOD_VERSION,
"Metamod:Source Version",
ConVarFlag_Notify|ConVarFlag_SpOnly);

provider->SetConVarString(metamod_version, buffer);

mm_pluginsfile = provider->CreateConVar("mm_pluginsfile",
#if defined WIN32 || defined _WIN32
"addons\\metamod\\metaplugins.ini",
#else
"addons/metamod/metaplugins.ini",
#endif
"Metamod:Source Plugins File",
ConVarFlag_SpOnly);

mm_basedir = provider->CreateConVar("mm_basedir",
#if defined __linux__ || defined __APPLE__
"addons/metamod",
#else
"addons\\metamod",
#endif
"Metamod:Source Base Folder",
ConVarFlag_SpOnly);
// TO-DO
// ConVar register here....

g_bIsVspBridged = is_vsp_load;

Expand Down Expand Up @@ -881,12 +883,12 @@ const char *MetamodSource::GetGameBinaryPath()

const char *MetamodSource::GetPluginsFile()
{
return provider->GetConVarString(mm_pluginsfile);
return mm_pluginsfile.GetValue();
}

const char *MetamodSource::GetVDFDir()
{
return provider->GetConVarString(mm_basedir);
return mm_basedir.GetValue();
}

bool MetamodSource::RegisterConCommandBase(ISmmPlugin *plugin, ConCommandBase *pCommand)
Expand Down
129 changes: 129 additions & 0 deletions core/metamod_convar.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
#pragma once

#include <string>
#include <cstdint>

#include <tier1/convar.h>

template<typename T = const char*>
class MetamodSourceConVar;

enum EMetaConVarType : int16_t
{
EMetaConVarType_Invalid = -1,
EMetaConVarType_Bool,
EMetaConVarType_Int16,
EMetaConVarType_UInt16,
EMetaConVarType_Int32,
EMetaConVarType_UInt32,
EMetaConVarType_Int64,
EMetaConVarType_UInt64,
EMetaConVarType_Float32,
EMetaConVarType_Float64,
EMetaConVarType_String,
EMetaConVarType_Color,
EMetaConVarType_Vector2,
EMetaConVarType_Vector3,
EMetaConVarType_Vector4,
EMetaConVarType_Qangle,
EMetaConVarType_MAX
};

template<typename T>
constexpr EMetaConVarType TranslateMetaConVarType();

struct MetamodConVarCreation_t
{
std::string m_name;
std::string m_help;
int32_t m_flags;

EMetaConVarType m_type;

template<typename T>
T& DefaultValue() { return *reinterpret_cast<T*>(m_defaultValue); }
template<typename T>
T& MinValue() { return *reinterpret_cast<T*>(m_minValue); }
template<typename T>
T& MaxValue() { return *reinterpret_cast<T*>(m_maxValue); }

uint8_t m_defaultValue[sizeof(CVValue_t)];
uint8_t m_minValue[sizeof(CVValue_t)];
uint8_t m_maxValue[sizeof(CVValue_t)];

bool m_hasDefault;
bool m_hasMin;
bool m_hasMax;

void* m_changeCallback;
void** m_conVar;

template<typename T>
MetamodConVarCreation_t(const char* name, int32_t flags, const char* help, const T& value, void* cb = nullptr) :
m_name(name),
m_help(help),
m_flags(flags),
m_type(TranslateMetaConVarType<T>()),
m_hasDefault(true),
m_changeCallback(cb)
{
DefaultValue<T>() = value;
}

template<typename T>
MetamodConVarCreation_t(const char* name, int32_t flags, const char* help, const T& value, bool min, const T& minValue, bool max, const T& maxValue, void* cb = nullptr) :
m_name(name),
m_help(help),
m_flags(flags),
m_type(TranslateMetaConVarType<T>()),
m_hasDefault(true),
m_hasMin(min),
m_hasMax(max),
m_changeCallback(cb)
{
DefaultValue<T>() = value;
MinValue<T>() = minValue;
MaxValue<T>() = maxValue;
}
};

// For backwards compatibility
template<typename T>
class MetamodSourceConVar
{
private:
#if defined META_IS_SOURCE2
using FnConVarChangeCallback_t = void(*)(ConVar<T>* ref, const CSplitScreenSlot nSlot, const T* pNewValue, const T* pOldValue);
ConVar<T>* m_ConVar;
#else
using FnConVarChangeCallback_t = void(*)(IConVar* var, const char* pOldValue, float flOldValue);
ConVar* m_ConVar;
#endif

public:

MetamodSourceConVar(const char* name, int32_t flags, const char* help, const T& value, FnConVarChangeCallback_t cb = nullptr);
MetamodSourceConVar(const char* name, int32_t flags, const char* help, const T& value, bool min, const T& minValue, bool max, const T& maxValue, FnConVarChangeCallback_t cb = nullptr);

inline const T GetValue( ) const;
inline const T GetDefaultValue( ) const;
inline const T GetMinValue( ) const;
inline const T GetMaxValue( ) const;

inline void SetDefaultValue( const T& value );
inline void SetMinValue( const T& value );
inline void SetMaxValue( const T& value );

inline void RemoveDefaultValue( );
inline void RemoveMinValue( );
inline void RemoveMaxValue( );

inline void GetStringValue( char* dst, size_t len, int index = 0 ) const;
inline void GetStringDefaultValue( char* dst, size_t len ) const;
inline void GetStringMinValue( char* dst, size_t len ) const;
inline void GetStringMaxValue( char* dst, size_t len ) const;

int yes[offset_of<MetamodSourceConVar<T>, &MetamodSourceConVar<T>::yes>()];
};

#include "metamod_convar.hxx"
121 changes: 121 additions & 0 deletions core/metamod_convar.hxx
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
#pragma once

template<> constexpr EMetaConVarType TranslateMetaConVarType<bool>( void ) { return EMetaConVarType_Bool; }
template<> constexpr EMetaConVarType TranslateMetaConVarType<int16_t>( void ) { return EMetaConVarType_Int16; }
template<> constexpr EMetaConVarType TranslateMetaConVarType<uint16_t>( void ) { return EMetaConVarType_UInt16; }
template<> constexpr EMetaConVarType TranslateMetaConVarType<int32_t>( void ) { return EMetaConVarType_Int32; }
template<> constexpr EMetaConVarType TranslateMetaConVarType<uint32_t>( void ) { return EMetaConVarType_UInt32; }
template<> constexpr EMetaConVarType TranslateMetaConVarType<int64_t>( void ) { return EMetaConVarType_Int64; }
template<> constexpr EMetaConVarType TranslateMetaConVarType<uint64_t>( void ) { return EMetaConVarType_UInt64; }
template<> constexpr EMetaConVarType TranslateMetaConVarType<float>( void ) { return EMetaConVarType_Float32; }
template<> constexpr EMetaConVarType TranslateMetaConVarType<double>( void ) { return EMetaConVarType_Float64; }
template<> constexpr EMetaConVarType TranslateMetaConVarType<const char*>( void ){ return EMetaConVarType_String; }
template<> constexpr EMetaConVarType TranslateMetaConVarType<Color>( void ) { return EMetaConVarType_Color; }
template<> constexpr EMetaConVarType TranslateMetaConVarType<Vector2D>( void ) { return EMetaConVarType_Vector2; }
template<> constexpr EMetaConVarType TranslateMetaConVarType<Vector>( void ) { return EMetaConVarType_Vector3; }
template<> constexpr EMetaConVarType TranslateMetaConVarType<Vector4D>( void ) { return EMetaConVarType_Vector4; }
template<> constexpr EMetaConVarType TranslateMetaConVarType<QAngle>( void ) { return EMetaConVarType_Qangle; }

template<typename T>
MetamodSourceConVar<T>::MetamodSourceConVar(const char* name, int32_t flags, const char* help, const T& value, FnConVarChangeCallback_t cb) :
m_ConVar(nullptr)
{
MetamodConVarCreation_t create(name, flags, help, value, reinterpret_cast<void*>(cb));
}

template<typename T>
MetamodSourceConVar<T>::MetamodSourceConVar(const char* name, int32_t flags, const char* help, const T& value, bool min, const T& minValue, bool max, const T& maxValue, FnConVarChangeCallback_t cb) :
m_ConVar(nullptr)
{
MetamodConVarCreation_t create(name, flags, help, value, cb, min, minValue, max, maxValue, reinterpret_cast<void*>(cb));
}

#if defined META_IS_SOURCE2
template<typename T>
inline const T MetamodSourceConVar<T>::GetValue() const
{
return m_ConVar->GetValue();
}

template<typename T>
inline const T MetamodSourceConVar<T>::GetDefaultValue( ) const
{
return m_ConVar->GetDefaultValue( );
}

template<typename T>
inline const T MetamodSourceConVar<T>::GetMinValue( ) const
{
return m_ConVar->GetMinValue( );
}

template<typename T>
inline const T MetamodSourceConVar<T>::GetMaxValue( ) const
{
return m_ConVar->GetMaxValue( );
}

template<typename T>
inline void MetamodSourceConVar<T>::SetDefaultValue( const T& value )
{
m_ConVar->SetDefaultValue( value );
}

template<typename T>
inline void MetamodSourceConVar<T>::SetMinValue( const T& value )
{
m_ConVar->SetMinValue( value );
}

template<typename T>
inline void MetamodSourceConVar<T>::SetMaxValue( const T& value )
{
m_ConVar->SetMaxValue( value );
}

template<typename T>
inline void MetamodSourceConVar<T>::RemoveDefaultValue( )
{
m_ConVar->RemoveDefaultValue( );
}

template<typename T>
inline void MetamodSourceConVar<T>::RemoveMinValue( )
{
m_ConVar->RemoveMinValue( );
}

template<typename T>
inline void MetamodSourceConVar<T>::RemoveMaxValue( )
{
m_ConVar->RemoveMaxValue( );
}

template<typename T>
inline void MetamodSourceConVar<T>::GetStringValue( char* dst, size_t len, int index ) const
{
m_ConVar->GetStringValue( dst, len, index );
}

template<typename T>
inline void MetamodSourceConVar<T>::GetStringDefaultValue( char* dst, size_t len ) const
{
m_ConVar->GetStringDefaultValue( dst, len );
}

template<typename T>
inline void MetamodSourceConVar<T>::GetStringMinValue( char* dst, size_t len ) const
{
m_ConVar->GetStringMinValue( dst, len );
}

template<typename T>
inline void MetamodSourceConVar<T>::GetStringMaxValue( char* dst, size_t len ) const
{
m_ConVar->GetStringMaxValue( dst, len );
}
#else



#endif
Loading

0 comments on commit efc4891

Please sign in to comment.