Dvar fixes

This commit is contained in:
Federico Cecchetto 2022-05-18 19:00:16 +02:00
parent 0053fbc9f3
commit f51c1f8bc9
6 changed files with 60 additions and 17 deletions

View File

@ -22,6 +22,7 @@ namespace command
namespace
{
utils::hook::detour client_command_hook;
utils::hook::detour parse_commandline_hook;
std::unordered_map<std::string, std::function<void(params&)>> handlers;
std::unordered_map<std::string, std::function<void(int, params_sv&)>> handlers_sv;
@ -96,7 +97,7 @@ namespace command
void parse_commandline_stub()
{
parse_command_line();
utils::hook::invoke<void>(0x15A4F0_b);
parse_commandline_hook.invoke<void>();
}
game::dvar_t* dvar_command_stub()
@ -114,8 +115,8 @@ namespace command
{
if (args.size() == 1)
{
const auto current = game::Dvar_ValueToString(dvar, dvar->current);
const auto reset = game::Dvar_ValueToString(dvar, dvar->reset);
const auto current = game::Dvar_ValueToString(dvar, true, dvar->current);
const auto reset = game::Dvar_ValueToString(dvar, true, dvar->reset);
console::info("\"%s\" is: \"%s\" default: \"%s\" hash: 0x%08lX\n",
args[0], current, reset, dvar->hash);
@ -127,9 +128,9 @@ namespace command
}
else
{
//char command[0x1000] = { 0 }; <-- CRASHES??!?!?!?!
//game::Dvar_GetCombinedString(command, 1);
//game::Dvar_SetCommand(dvar->hash, "", command);
char command[0x1000] = {0};
game::Dvar_GetCombinedString(command, 1);
game::Dvar_SetCommand(dvar->hash, "", command);
}
return dvar;
@ -454,8 +455,6 @@ namespace command
void add(const char* name, const std::function<void(const params&)>& callback)
{
static game::cmd_function_s cmd_test;
const auto command = utils::string::to_lower(name);
if (handlers.find(command) == handlers.end())
@ -508,8 +507,8 @@ namespace command
}
else
{
utils::hook::call(0x157D8F_b, parse_commandline_stub);
//utils::hook::jump(0x4E9F40_b, dvar_command_stub);
// parse_commandline_hook.create(0x157D50_b, parse_commandline_stub);
utils::hook::jump(0x4E9F40_b, dvar_command_stub, true);
add_commands_mp();
}

View File

@ -249,6 +249,38 @@ namespace dvars
utils::hook::detour dvar_set_string_hook;
utils::hook::detour dvar_set_from_string_hook;
utils::hook::detour dvar_re_register_hook;
utils::hook::detour dvar_register_new_hook;
game::dvar_type get_normal_type(const game::dvar_type type)
{
switch (type)
{
case game::dvar_type::boolean_hashed:
return game::dvar_type::boolean;
case game::dvar_type::integer_hashed:
return game::dvar_type::integer;
case game::dvar_type::value_hashed:
return game::dvar_type::value;
default:
return type;
}
}
void dvar_re_register_stub(game::dvar_t* dvar, const int hash, const char* name, game::dvar_type type,
const unsigned int flags, game::dvar_value* value, game::dvar_limits* domain)
{
type = get_normal_type(type);
dvar_re_register_hook.invoke<void>(dvar, hash, name, type, flags, value, domain);
}
game::dvar_t* dvar_register_new_stub(const int hash, const char* name, game::dvar_type type,
const unsigned int flags, game::dvar_value* value, game::dvar_limits* domain)
{
type = get_normal_type(type);
return dvar_register_new_hook.invoke<game::dvar_t*>(hash, name, type, flags, value, domain);
}
game::dvar_t* dvar_register_bool(const int hash, const char* name, bool value, unsigned int flags)
{
auto* var = find_dvar(override::register_bool_overrides, hash);
@ -424,7 +456,13 @@ namespace dvars
public:
void post_unpack() override
{
dvar_register_bool_hook.create(SELECT_VALUE(0x1403C47E0, 0x1404FA540), &dvar_register_bool);
if (game::environment::is_mp())
{
dvar_register_new_hook.create(0x184DF0_b, dvar_register_new_stub);
dvar_re_register_hook.create(0x185150_b, dvar_re_register_stub);
}
/*dvar_register_bool_hook.create(SELECT_VALUE(0x1403C47E0, 0x1404FA540), &dvar_register_bool);
dvar_register_float_hook.create(SELECT_VALUE(0x1403C4BB0, 0x1404FA910), &dvar_register_float);
dvar_register_int_hook.create(SELECT_VALUE(0x1403C4CC0, 0x1404FAA20), &dvar_register_int);
dvar_register_string_hook.create(SELECT_VALUE(0x1403C4DA0, 0x1404FAB00), &dvar_register_string);
@ -435,9 +473,9 @@ namespace dvars
dvar_set_float_hook.create(SELECT_VALUE(0x1403C7420, 0x1404FD360), &dvar_set_float);
dvar_set_int_hook.create(SELECT_VALUE(0x1403C76C0, 0x1404FD5E0), &dvar_set_int);
dvar_set_string_hook.create(SELECT_VALUE(0x1403C7900, 0x1404FD8D0), &dvar_set_string);
dvar_set_from_string_hook.create(SELECT_VALUE(0x1403C7620, 0x1404FD520), &dvar_set_from_string);
dvar_set_from_string_hook.create(SELECT_VALUE(0x1403C7620, 0x1404FD520), &dvar_set_from_string);*/
}
};
}
//REGISTER_COMPONENT(dvars::component)
REGISTER_COMPONENT(dvars::component)

View File

@ -286,10 +286,10 @@ namespace game_console
{
const auto offset = (con.screen_max[0] - con.globals.x) / 4.f;
draw_hint_text(0, game::Dvar_ValueToString(dvar, dvar->current),
draw_hint_text(0, game::Dvar_ValueToString(dvar, true, dvar->current),
dvars::con_inputDvarValueColor->current.vector, offset);
draw_hint_text(1, " default", dvars::con_inputDvarInactiveValueColor->current.vector);
draw_hint_text(1, game::Dvar_ValueToString(dvar, dvar->reset),
draw_hint_text(1, game::Dvar_ValueToString(dvar, true, dvar->reset),
dvars::con_inputDvarInactiveValueColor->current.vector, offset);
draw_hint_text(2, matches[0].description.data(),
color_white, 0);
@ -324,7 +324,7 @@ namespace game_console
if (dvar)
{
draw_hint_text(static_cast<int>(i), game::Dvar_ValueToString(dvar, dvar->current),
draw_hint_text(static_cast<int>(i), game::Dvar_ValueToString(dvar, true, dvar->current),
dvars::con_inputDvarValueColor->current.vector, offset);
draw_hint_text(static_cast<int>(i), matches[i].description.data(),

View File

@ -72,9 +72,11 @@ namespace dvars
switch (type)
{
case game::dvar_type::boolean:
case game::dvar_type::boolean_hashed:
return "Domain is 0 or 1"s;
case game::dvar_type::value:
case game::dvar_type::value_hashed:
if (domain.value.min == -FLT_MAX)
{
if (domain.value.max == FLT_MAX)
@ -106,6 +108,7 @@ namespace dvars
return dvar_get_vector_domain(4, domain);
case game::dvar_type::integer:
case game::dvar_type::integer_hashed:
if (domain.enumeration.stringCount == INT_MIN)
{
if (domain.integer.max == INT_MAX)

View File

@ -881,11 +881,14 @@ namespace game
enum dvar_type : std::int8_t
{
boolean = 0,
boolean_hashed = 10,
value = 1,
value_hashed = 11,
vec2 = 2,
vec3 = 3,
vec4 = 4,
integer = 5,
integer_hashed = 12,
enumeration = 6,
string = 7,
color = 8,

View File

@ -55,7 +55,7 @@ namespace game
WEAK symbol<dvar_t*(const char* name)> Dvar_FindVar{0x0, 0x183EB0};
WEAK symbol<void(const dvar_t* dvar)> Dvar_ClearModified{0x0, 0x0};
WEAK symbol<void(char* buffer, int index)> Dvar_GetCombinedString{0x0, 0x4EA020};
WEAK symbol<const char*(dvar_t* dvar, dvar_value value)> Dvar_ValueToString{0x0, 0x187000};
WEAK symbol<const char*(dvar_t* dvar, bool is_hashed, dvar_value value)> Dvar_ValueToString{0x0, 0x187000};
WEAK symbol<void(dvar_t* dvar, DvarSetSource source)> Dvar_Reset{0x0, 0x185390};
WEAK symbol<void(const char*, const char*,
DvarSetSource)> Dvar_SetFromStringByNameFromSource{0x0, 0x185BD0};