iw4x-client/src/Components/Modules/Dvar.cpp

201 lines
5.0 KiB
C++
Raw Normal View History

#include "STDInclude.hpp"
2015-12-23 08:45:53 -05:00
namespace Components
{
2016-01-02 20:37:06 -05:00
std::vector<Dvar::Callback> Dvar::RegistrationCallbacks;
2015-12-23 08:45:53 -05:00
Dvar::Var::Var(std::string dvarName) : Var()
{
this->dvar = Game::Dvar_FindVar(dvarName.data());
if (!this->dvar)
{
2015-12-25 15:42:35 -05:00
// Quick-register the dvar
Game::SetConsole(dvarName.data(), "");
this->dvar = Game::Dvar_FindVar(dvarName.data());
2015-12-23 08:45:53 -05:00
}
}
2015-12-23 11:12:15 -05:00
template <> Game::dvar_t* Dvar::Var::Get()
{
return this->dvar;
}
2015-12-23 08:45:53 -05:00
template <> char* Dvar::Var::Get()
{
if (this->dvar && this->dvar->type == Game::dvar_type::DVAR_TYPE_STRING && this->dvar->current.string)
{
return this->dvar->current.string;
}
return "";
}
template <> const char* Dvar::Var::Get()
{
return this->Get<char*>();
}
template <> int Dvar::Var::Get()
{
if (this->dvar && this->dvar->type == Game::dvar_type::DVAR_TYPE_INT)
{
return this->dvar->current.integer;
}
return 0;
}
template <> float Dvar::Var::Get()
{
if (this->dvar && this->dvar->type == Game::dvar_type::DVAR_TYPE_FLOAT)
{
return this->dvar->current.value;
}
return 0;
}
template <> float* Dvar::Var::Get()
{
static float val[4] = { 0 };
if (this->dvar && (this->dvar->type == Game::dvar_type::DVAR_TYPE_FLOAT_2 || this->dvar->type == Game::dvar_type::DVAR_TYPE_FLOAT_3 || this->dvar->type == Game::dvar_type::DVAR_TYPE_FLOAT_4))
{
return this->dvar->current.vec4;
}
return val;
}
template <> bool Dvar::Var::Get()
{
if (this->dvar && this->dvar->type == Game::dvar_type::DVAR_TYPE_BOOL)
{
return this->dvar->current.boolean;
}
return false;
}
2015-12-29 14:12:26 -05:00
template <> std::string Dvar::Var::Get()
{
return this->Get<const char*>();
}
2015-12-23 08:45:53 -05:00
void Dvar::Var::Set(char* string)
{
this->Set(reinterpret_cast<const char*>(string));
}
void Dvar::Var::Set(const char* string)
{
if (this->dvar && this->dvar->name)
{
Game::Dvar_SetCommand(this->dvar->name, string);
}
}
void Dvar::Var::Set(std::string string)
{
this->Set(string.data());
}
void Dvar::Var::Set(int integer)
{
if (this->dvar && this->dvar->name)
{
Game::Dvar_SetCommand(this->dvar->name, Utils::VA("%i", integer));
}
}
void Dvar::Var::Set(float value)
{
if (this->dvar && this->dvar->name)
{
Game::Dvar_SetCommand(this->dvar->name, Utils::VA("%f", value));
}
}
2015-12-26 21:56:00 -05:00
void Dvar::Var::SetRaw(int integer)
2015-12-23 08:45:53 -05:00
{
2015-12-26 21:56:00 -05:00
if (this->dvar)
{
this->dvar->current.integer = integer;
}
}
template<> static Dvar::Var Dvar::Register(const char* name, bool value, Dvar::Flag flag, const char* description)
{
return Game::Dvar_RegisterBool(name, value, flag.val, description);
}
template<> static Dvar::Var Dvar::Register(const char* name, const char* value, Dvar::Flag flag, const char* description)
{
return Game::Dvar_RegisterString(name, value, flag.val, description);
2015-12-23 08:45:53 -05:00
}
2015-12-26 21:56:00 -05:00
template<> static Dvar::Var Dvar::Register(const char* name, int value, int min, int max, Dvar::Flag flag, const char* description)
2015-12-23 08:45:53 -05:00
{
2015-12-26 21:56:00 -05:00
return Game::Dvar_RegisterInt(name, value, min, max, flag.val, description);
2015-12-23 08:45:53 -05:00
}
2016-01-02 20:37:06 -05:00
void Dvar::OnInit(Dvar::Callback callback)
{
Dvar::RegistrationCallbacks.push_back(callback);
}
2015-12-23 11:12:15 -05:00
Game::dvar_t* Dvar::RegisterName(const char* name, const char* default, Game::dvar_flag flag, const char* description)
{
2016-01-02 20:37:06 -05:00
// Run callbacks
for (auto callback : Dvar::RegistrationCallbacks)
{
callback();
}
2015-12-23 11:12:15 -05:00
2016-01-01 14:01:19 -05:00
// Name watcher
Renderer::OnFrame([] ()
{
static std::string lastValidName = "Unknown Soldier";
std::string name = Dvar::Var("name").Get<char*>();
// Don't perform any checks if name didn't change
if (name == lastValidName) return;
2016-01-02 09:19:34 -05:00
std::string saneName = Colors::Strip(Utils::Trim(name));
if (saneName.size() < 3 || (saneName[0] == '[' && saneName[1] == '{'))
2016-01-01 14:01:19 -05:00
{
Logger::Print("Username '%s' is invalid. It must at least be 3 characters long and not appear empty!\n", name.data());
Dvar::Var("name").Set(lastValidName);
}
else
{
lastValidName = name;
}
});
2015-12-26 21:56:00 -05:00
return Dvar::Register<const char*>(name, "Unknown Soldier", Dvar::Flag(flag | Game::dvar_flag::DVAR_FLAG_SAVED).val, description).Get<Game::dvar_t*>();
2015-12-23 11:12:15 -05:00
}
2015-12-23 08:45:53 -05:00
Dvar::Dvar()
{
// set flags of cg_drawFPS to archive
2015-12-23 09:00:01 -05:00
Utils::Hook::Or<BYTE>(0x4F8F69, Game::dvar_flag::DVAR_FLAG_SAVED);
2015-12-23 08:45:53 -05:00
// un-cheat cg_fov and add archive flags
2015-12-23 09:00:01 -05:00
Utils::Hook::Xor<BYTE>(0x4F8E35, Game::dvar_flag::DVAR_FLAG_CHEAT | Game::dvar_flag::DVAR_FLAG_SAVED);
2015-12-23 08:45:53 -05:00
2016-01-15 17:59:15 -05:00
// un-cheat cg_debugInfoCornerOffset and add archive flags
Utils::Hook::Xor<BYTE>(0x4F8FC2, Game::dvar_flag::DVAR_FLAG_CHEAT | Game::dvar_flag::DVAR_FLAG_SAVED);
// remove archive flags for cg_hudchatposition
Utils::Hook::Xor<BYTE>(0x4F9992, Game::dvar_flag::DVAR_FLAG_SAVED);
// remove write protection from fs_game
Utils::Hook::Xor<DWORD>(0x6431EA, Game::dvar_flag::DVAR_FLAG_WRITEPROTECTED);
2015-12-23 21:26:46 -05:00
2015-12-23 08:45:53 -05:00
// set cg_fov max to 90.0
static float cgFov90 = 90.0f;
2015-12-23 09:00:01 -05:00
Utils::Hook::Set<float*>(0x4F8E28, &cgFov90);
2015-12-23 08:45:53 -05:00
2016-01-11 06:09:31 -05:00
// set max volume to 1
static float volume = 1.0f;
Utils::Hook::Set<float*>(0x408078, &volume);
2015-12-23 11:12:15 -05:00
// Hook dvar 'name' registration
Utils::Hook(0x40531C, Dvar::RegisterName, HOOK_CALL).Install()->Quick();
2015-12-23 08:45:53 -05:00
}
2016-01-02 20:37:06 -05:00
Dvar::~Dvar()
{
Dvar::RegistrationCallbacks.clear();
}
2015-12-23 08:45:53 -05:00
}