Added timescale support for lua ui elements during demo playback.

This commit is contained in:
Caball009
2026-07-20 01:02:14 +02:00
parent 0885049ed0
commit 157092c56d
2 changed files with 27 additions and 2 deletions
+26 -2
View File
@@ -13,9 +13,12 @@ namespace demo_timescale
namespace
{
utils::hook::detour Com_TimeScaleMsec_hook;
utils::hook::detour LUI_Layout_hook;
game::dvar_t* demo_timescale;
std::int32_t latest_delta_time;
void generate_pattern(std::array<std::uint8_t, 1000>& pattern, std::size_t ones_count, std::size_t zeros_count)
{
assert(ones_count + zeros_count == pattern.size());
@@ -53,7 +56,7 @@ namespace demo_timescale
generate_pattern(pattern, ones_count, zeros_count);
}
std::int32_t Com_TimeScaleMsec_stub(std::int32_t msec)
std::int32_t get_delta_time_internal(std::int32_t msec)
{
if (!demo_playback::playing() || !demo_timescale || demo_timescale->current.value == 1.0f)
{
@@ -116,6 +119,23 @@ namespace demo_timescale
// advance (1ms) or pause (0ms) based on the pattern
return pattern[pattern_index++ % pattern.size()];
}
std::int32_t get_delta_time(std::int32_t msec)
{
latest_delta_time = get_delta_time_internal(msec);
return latest_delta_time;
}
void set_delta_time_ui_elements(const std::int32_t client_num, const char* root_name, std::int32_t delta_time, void* lua_vm)
{
if (demo_playback::playing())
{
delta_time = latest_delta_time;
}
LUI_Layout_hook.invoke<void>(client_num, root_name, delta_time, lua_vm);
}
}
class component final : public component_interface
@@ -129,7 +149,11 @@ namespace demo_timescale
}
// add timescale support for demo playback
Com_TimeScaleMsec_hook.create(game::Com_TimeScaleMsec, Com_TimeScaleMsec_stub);
Com_TimeScaleMsec_hook.create(game::Com_TimeScaleMsec, get_delta_time);
// add timescale support for lua ui elements during demo playback
LUI_Layout_hook.create(game::LUI_Layout, set_delta_time_ui_elements);
demo_timescale = game::Dvar_RegisterFloat(
"demotimescale", 1.0f, 0.0f, 1000.0f, game::DVAR_FLAG_NONE, "Set playback speed for demos");
}
+1
View File
@@ -158,6 +158,7 @@ namespace game
WEAK symbol<bool(int localClientNum, void* luaVM)> LUI_IntermissionBegan{0, 0x1401CEB40};
WEAK symbol<void(int localClientNum, const char* menuName, int isPopup, int isModal, unsigned int isExclusive)> LUI_OpenMenu{0x1403FD460, 0x1404B3610};
WEAK symbol<void(int localClientNum, const char* rootName, int deltaTime, void* luaVM)> LUI_Layout{ 0, 0x1401CF060 };
// Made up name, replaced by ScopedCriticalSection on Black Ops 3
WEAK symbol<void()> LUI_EnterCriticalSection{0x1401AE940, 0x1401CD040};
WEAK symbol<void()> LUI_LeaveCriticalSection{0x1401B0AA0, 0x1401CF1A0};