Add overridedvarint & removedvarintoverride

This commit is contained in:
Federico Cecchetto 2022-07-17 21:33:07 +02:00
parent 2245d9812a
commit 899f8d27a6
4 changed files with 33 additions and 0 deletions

View File

@ -22,6 +22,8 @@ namespace scripting
std::unordered_map<std::string, std::unordered_map<std::string, const char*>> script_function_table; std::unordered_map<std::string, std::unordered_map<std::string, const char*>> script_function_table;
utils::concurrency::container<shared_table_t> shared_table; utils::concurrency::container<shared_table_t> shared_table;
std::unordered_map<std::string, int> get_dvar_int_overrides;
namespace namespace
{ {
utils::hook::detour vm_notify_hook; utils::hook::detour vm_notify_hook;
@ -79,6 +81,7 @@ namespace scripting
void clear_scheduled_notifies() void clear_scheduled_notifies()
{ {
get_dvar_int_overrides.clear();
scheduled_notifies.access([](notify_list& list) scheduled_notifies.access([](notify_list& list)
{ {
list.clear(); list.clear();
@ -218,6 +221,20 @@ namespace scripting
scr_run_current_threads_hook.invoke<void>(); scr_run_current_threads_hook.invoke<void>();
} }
utils::hook::detour scr_get_dvar_int_hook;
void scr_get_dvar_int_stub()
{
const auto dvar = game::Scr_GetString(0);
if (get_dvar_int_overrides.find(dvar) != get_dvar_int_overrides.end())
{
game::Scr_AddInt(get_dvar_int_overrides[dvar]);
return;
}
scr_get_dvar_int_hook.invoke<void>();
}
} }
class component final : public component_interface class component final : public component_interface
@ -241,6 +258,8 @@ namespace scripting
scr_run_current_threads_hook.create(0x1405C8370, scr_run_current_threads_stub); scr_run_current_threads_hook.create(0x1405C8370, scr_run_current_threads_stub);
scr_get_dvar_int_hook.create(0x1404F0730, scr_get_dvar_int_stub);
scheduler::loop([]() scheduler::loop([]()
{ {
lua::engine::run_frame(); lua::engine::run_frame();

View File

@ -8,4 +8,6 @@ namespace scripting
extern std::unordered_map<int, std::unordered_map<std::string, int>> fields_table; extern std::unordered_map<int, std::unordered_map<std::string, int>> fields_table;
extern std::unordered_map<std::string, std::unordered_map<std::string, const char*>> script_function_table; extern std::unordered_map<std::string, std::unordered_map<std::string, const char*>> script_function_table;
extern utils::concurrency::container<shared_table_t> shared_table; extern utils::concurrency::container<shared_table_t> shared_table;
extern std::unordered_map<std::string, int> get_dvar_int_overrides;
} }

View File

@ -766,6 +766,16 @@ namespace scripting::lua
{ {
localized_strings::override(string, value, true); localized_strings::override(string, value, true);
}; };
game_type["overridedvarint"] = [](const game&, const std::string& dvar, const int value)
{
scripting::get_dvar_int_overrides[dvar] = value;
};
game_type["removedvarintoverride"] = [](const game&, const std::string& dvar)
{
scripting::get_dvar_int_overrides.erase(dvar);
};
} }
} }

View File

@ -111,6 +111,8 @@ namespace game
WEAK symbol<void(unsigned int id, scr_string_t stringValue, unsigned int paramcount)> Scr_NotifyId{0x1405C8240}; WEAK symbol<void(unsigned int id, scr_string_t stringValue, unsigned int paramcount)> Scr_NotifyId{0x1405C8240};
WEAK symbol<unsigned int(unsigned int threadId)> Scr_GetSelf{0x1405C57C0}; WEAK symbol<unsigned int(unsigned int threadId)> Scr_GetSelf{0x1405C57C0};
WEAK symbol<void()> Scr_ErrorInternal{0x1405C6EC0}; WEAK symbol<void()> Scr_ErrorInternal{0x1405C6EC0};
WEAK symbol<const char*(unsigned int index)> Scr_GetString{0x1405C7C20};
WEAK symbol<void(int value)> Scr_AddInt{0x1405C69A0};
WEAK symbol<unsigned int(unsigned int localId, const char* pos, unsigned int paramcount)> VM_Execute{0x1405C8DB0}; WEAK symbol<unsigned int(unsigned int localId, const char* pos, unsigned int paramcount)> VM_Execute{0x1405C8DB0};