#include #include "loader/component_loader.hpp" #include "game/game.hpp" #include "command.hpp" #include "console.hpp" #include #include namespace slowmotion { namespace { void scr_cmd_set_slow_motion() { if (game::Scr_GetNumParam() < 1) { return; } int duration = 1000; float end = 1.0f; const float start = game::Scr_GetFloat(0); if (game::Scr_GetNumParam() >= 2) { end = game::Scr_GetFloat(1u); } if (game::Scr_GetNumParam() >= 3) { duration = static_cast(game::Scr_GetFloat(2u) * 1000.0f); } game::SV_SetConfigstring(10, utils::string::va("%i %i %g %g", *game::mp::gameTime, duration, start, end)); game::Com_SetSlowMotion(start, end, duration); } void set_code_time_scale(float timescale) { assert(timescale > 0.0f); *game::com_codeTimeScale = timescale; } void com_timescale_f(const command::params& params) { if (params.size() != 2) { console::info("timescale \n"); return; } const auto timescale = static_cast(std::atof(params.get(1))); console::info("timescale set to %f\n", timescale); set_code_time_scale(timescale); } } class component final : public component_interface { public: void post_unpack() override { if (game::environment::is_sp()) { return; } command::add("timescale", com_timescale_f); if (!game::environment::is_dedi()) { return; } utils::hook::jump(0x14030EF90, scr_cmd_set_slow_motion); } }; } REGISTER_COMPONENT(slowmotion::component)