83 lines
1.6 KiB
C++
83 lines
1.6 KiB
C++
#include <std_include.hpp>
|
|
#include "loader/component_loader.hpp"
|
|
#include "game/game.hpp"
|
|
|
|
#include "command.hpp"
|
|
#include "console.hpp"
|
|
|
|
#include <utils/hook.hpp>
|
|
#include <utils/string.hpp>
|
|
|
|
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<int>(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 <rate>\n");
|
|
return;
|
|
}
|
|
|
|
const auto timescale = static_cast<float>(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)
|