This commit is contained in:
EricPlayZ
2024-02-12 03:51:26 +02:00
parent 9459ddd9c7
commit b7e000176a
13 changed files with 175 additions and 33 deletions

View File

@ -102,6 +102,7 @@
</ItemGroup>
<ItemGroup>
<ClInclude Include="pch\pch.h" />
<ClInclude Include="source\changelog.h" />
<ClInclude Include="source\config\config.h" />
<ClInclude Include="source\config\ini.h" />
<ClInclude Include="source\core.h" />

View File

@ -377,6 +377,7 @@
<ClInclude Include="source\game\Engine\engine_hooks.h">
<Filter>game\Engine</Filter>
</ClInclude>
<ClInclude Include="source\changelog.h" />
</ItemGroup>
<ItemGroup>
<Filter Include="MinHook">

View File

@ -35,6 +35,7 @@
#include <cmath>
#include <assert.h>
#include <unordered_map>
#include <unordered_set>
#include <dxgi.h>
#include <dxgi1_4.h>

View File

@ -0,0 +1,19 @@
#pragma once
#include <map>
#include <string>
namespace Changelog {
std::map<std::string_view, std::string> changelogs = {
{ "v1.1.0",
R"(- You can now load custom mod files from "EGameTools\UserModFiles"! Please read the new "Welcome" screen which explains how to use this feature and how to use the rest of the mod menu
- By using the directory mentioned earlier for mod files, you can reload most of them by just reloading the savegame!
- Added "Reload Jump Params", using the directory mentioned earlier (Player)
- Added "One-handed Mode" (Player)
- Added "Nightrunner Mode" (Player)
- Added "Disable Game Pause While AFK" (Misc)
- Added "Freeze Time" (World)
- Added "Game Speed" slider (World)
- Added "Slow Motion" (World)
- Fixed having FreeCam enabled while in the Map view would cause a weird offset of the entire Map view)" }
};
}

View File

@ -4025,6 +4025,7 @@ namespace Config {
{ "Menu", "Transparency", 99.0f, &Menu::transparency, Float },
{ "Menu", "Scale", 1.0f, &Menu::scale, Float },
{ "Menu", "FirstTimeRunning", true, &Menu::firstTimeRunning, OPTION },
{ "Menu", "HasSeenChangelog", false, &Menu::hasSeenChangelog, OPTION },
{ "Menu:Keybinds", "MenuToggleKey", std::string("VK_F5"), &Menu::menuToggle, String},
{ "Menu:Keybinds", "GodModeToggleKey", std::string("VK_F6"), &Menu::Player::godMode, String},
{ "Menu:Keybinds", "FreezePlayerToggleKey", std::string("VK_F7"), &Menu::Player::freezePlayer, String},
@ -4040,7 +4041,7 @@ namespace Config {
{ "Menu:Keybinds", "DisableHUDToggleKey", std::string("VK_F8"), &Menu::Misc::disableHUD, String},
{ "Menu:Keybinds", "DisableGamePauseWhileAFKToggleKey", std::string("VK_NONE"), &Menu::Misc::disableGamePauseWhileAFK, String},
{ "Menu:Keybinds", "FreezeTimeToggleKey", std::string("VK_NONE"), &Menu::World::freezeTime, String},
{ "Menu:Keybinds", "SlowMotionToggleKey", std::string("VK_X"), &Menu::World::slowMotion, String},
{ "Menu:Keybinds", "SlowMotionToggleKey", std::string("VK_4"), &Menu::World::slowMotion, String},
{ "Player:Misc", "GodMode", false, &Menu::Player::godMode, OPTION },
{ "Player:Misc", "DisableOutOfBoundsTimer", true, &Menu::Player::disableOutOfBoundsTimer, OPTION },
{ "Player:Misc", "NightrunnerMode", false, &Menu::Player::nightrunnerMode, OPTION },

View File

@ -1,6 +1,7 @@
#include <pch.h>
#include "config\config.h"
#include "core.h"
#include "game\GamePH\LevelDI.h"
#include "game\GamePH\PlayerVariables.h"
#include "menu\menu.h"
@ -66,7 +67,7 @@ namespace Core {
}
static void CreateSymlinkForLoadingFiles() {
std::filesystem::create_directories("EGameTools\\FilesToLoad");
std::filesystem::create_directories("EGameTools\\UserModFiles");
for (const auto& entry : std::filesystem::directory_iterator("..\\..\\data")) {
if (entry.path().filename().string() == "EGameTools" && is_symlink(entry.symlink_status())) {
@ -75,6 +76,7 @@ namespace Core {
std::filesystem::remove(entry.path());
}
}
Utils::PrintWarning("Creating game shortcut for \"EGameTools\"");
std::filesystem::create_directory_symlink(Utils::Files::GetCurrentProcDirectory() + "\\EGameTools", "..\\..\\data\\EGameTools");
}
@ -97,7 +99,6 @@ namespace Core {
Utils::PrintInfo("Initializing config");
Config::InitConfig();
Utils::PrintInfo("Creating \"EGameTools\\FilesToLoad\"");
CreateSymlinkForLoadingFiles();
Utils::PrintInfo("Sorting Player Variables");
GamePH::PlayerVariables::SortPlayerVars();
@ -125,7 +126,7 @@ namespace Core {
void Cleanup() {
exiting = true;
Utils::PrintInfo("Game request exit, running cleanup");
Utils::PrintInfo("Game requested exit, running cleanup");
Utils::PrintInfo("Saving config to file");
Config::SaveConfig();

View File

@ -5,21 +5,23 @@
#include <set>
#include "..\utils\values.h"
#ifndef VK_NONE
#ifdef _DEBUG
#define LLMH_IMPL_DISABLE_DEBUG // this is for disabling low-level mouse hook in case ure trying to debug and u dont want ur pc to die lol
#endif
#define MOD_VERSION_STR "v1.1.0"
#define GAME_VER_COMPAT_STR ">= v1.14.0"
#define GAME_VER_COMPAT 11400
#define VK_NONE -1
#define VK_MWHEELDOWN 0x100
#define VK_MWHEELUP 0x101
#endif
constexpr auto MOD_VERSION_STR = "v1.1.0";
constexpr auto MOD_VERSION = 10100;
constexpr auto GAME_VER_COMPAT_STR = ">= v1.14.0";
constexpr auto GAME_VER_COMPAT = 11400;
struct Key {
constexpr Key(std::string_view name, int code, ImGuiKey imGuiCode) : name(name), code(code), imGuiCode(imGuiCode) {}

View File

@ -73,6 +73,23 @@ namespace Engine {
static DWORD64 detourFsOpen(DWORD64 file, DWORD a2, DWORD a3);
static Utils::Hook::MHook<LPVOID, DWORD64(*)(DWORD64, DWORD, DWORD)> FsOpenHook{ "fs::open", &GetFsOpen, &detourFsOpen };
static std::vector<std::string> cachedUserModDirs{};
static void CacheUserModDirs() {
Utils::PrintInfo("Recaching user mod directories");
if (!cachedUserModDirs.empty())
cachedUserModDirs.clear();
for (const auto& entry : std::filesystem::recursive_directory_iterator("EGameTools\\UserModFiles")) {
const std::filesystem::path pathToDir = entry.path();
if (!std::filesystem::is_directory(pathToDir))
continue;
cachedUserModDirs.push_back(pathToDir.string());
}
}
static Utils::Time::Timer timeSinceCache{ 0 };
static DWORD64 detourFsOpen(DWORD64 file, DWORD a2, DWORD a3) {
const DWORD64 firstByte = (file >> 56) & 0xFF; // get first byte of addr
@ -81,17 +98,18 @@ namespace Engine {
if (fileName.empty())
return FsOpenHook.pOriginal(file, a2, a3);
for (const auto& entry : std::filesystem::recursive_directory_iterator("EGameTools\\FilesToLoad")) {
const std::filesystem::path pathToFile = entry.path();
if (!std::filesystem::is_regular_file(pathToFile))
if (timeSinceCache.DidTimePass()) {
CacheUserModDirs();
timeSinceCache = Utils::Time::Timer(5000);
}
for (const auto& entry : cachedUserModDirs) {
const std::string finalPath = entry + "\\" + fileName;
if (!std::filesystem::exists(finalPath))
continue;
const std::filesystem::path pathToFilename = pathToFile.filename();
if (!pathToFilename.string().contains(fileName))
continue;
const std::string finalPath = pathToFile.string();
const char* filePath2 = finalPath.c_str();
Utils::PrintWarning("Loading user mod file \"%s\"", filePath2);
return FsOpenHook.pOriginal(firstByte != 0x0 ? (reinterpret_cast<DWORD64>(filePath2) | (firstByte << 56)) : reinterpret_cast<DWORD64>(filePath2), a2, a3); // restores first byte of addr if first byte was not 0
}

View File

@ -1,4 +1,6 @@
#pragma once
#include <string>
#include <vector>
#include "..\Vector3.h"
namespace Engine {

View File

@ -5,6 +5,8 @@
namespace Menu {
static constexpr ImGuiWindowFlags windowFlags = ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_HorizontalScrollbar;
static constexpr ImGuiWindowFlags welcomeWindowFlags = (windowFlags | ImGuiWindowFlags_NoMove) & ~ImGuiWindowFlags_HorizontalScrollbar;
static constexpr ImVec2 minChangelogWndSize = ImVec2(400.0f, 0.0f);
static constexpr ImVec2 defMaxChangelogWndSize = ImVec2(400.0f, 700.0f);
static constexpr ImVec2 minWelcomeWndSize = ImVec2(700.0f, 0.0f);
static constexpr ImVec2 defMaxWelcomeWndSize = ImVec2(700.0f, 700.0f);
@ -19,6 +21,7 @@ namespace Menu {
static Utils::Time::Timer timePassedFromWelcomeScreen{};
static bool firstTimeRunningFunc = true;
Option firstTimeRunning{};
Option hasSeenChangelog{};
void FirstTimeRunning() {
if (!firstTimeRunning.GetValue())
@ -27,23 +30,22 @@ namespace Menu {
firstTimeRunningFunc = false;
timePassedFromWelcomeScreen = Utils::Time::Timer(10000);
menuToggle.SetChangesAreDisabled(true);
if (!hasSeenChangelog.GetValue())
ImGui::OpenPopup("EGameTools - Update Changelog");
ImGui::OpenPopup("EGameTools - Welcome!");
}
ImGui::SetNextWindowSizeConstraints(minWelcomeWndSize, defMaxWelcomeWndSize);
if (ImGui::BeginPopupModal("EGameTools - Welcome!", nullptr, welcomeWindowFlags)) {
ImGui::TextCenteredColored("PLEASE read the following text!", IM_COL32(230, 0, 0, 255));
ImGui::Spacing(ImVec2(0.0f, 5.0f));
const std::string thankYou = "Thank you for downloading EGameTools (" + std::string(MOD_VERSION_STR) + ")!";
ImGui::TextCentered(thankYou.c_str());
ImGui::SetNextWindowSizeConstraints(minChangelogWndSize, defMaxChangelogWndSize);
if (ImGui::BeginPopupModal("EGameTools - Update Changelog", nullptr, welcomeWindowFlags)) {
const std::string title = "EGameTools (" + std::string(MOD_VERSION_STR) + ") - Update Changelog";
ImGui::TextCenteredColored(title.c_str(), IM_COL32(230, 0, 0, 255));
ImGui::Spacing(ImVec2(0.0f, 5.0f));
const std::string gameCompat = "This version of the mod is compatible with game version " + std::string(GAME_VER_COMPAT_STR) + ".";
ImGui::TextCentered(gameCompat.c_str());
const std::string gameVer = "The game version you are currently running is v" + GamePH::GetCurrentGameVersionStr() + ".";
ImGui::TextCentered(gameVer.c_str());
const std::string gameTestedVer = "This mod has been last tested with version v" + GamePH::GameVerToStr(GAME_VER_COMPAT) + ".";
const std::string gameTestedVer = "This mod has last been tested with version v" + GamePH::GameVerToStr(GAME_VER_COMPAT) + ".";
ImGui::TextCentered(gameTestedVer.c_str());
if (GamePH::GetCurrentGameVersion() < 11400 || GamePH::GetCurrentGameVersion() > GAME_VER_COMPAT) {
const std::string gameNotCompat = "Please note that your game version has not been officially tested with this mod, therefore expect bugs, glitches or the mod to completely stop working. If so, please " + std::string(GamePH::GetCurrentGameVersion() > GAME_VER_COMPAT ? "wait for a new patch." : "upgrade your game version to one that the mod supports.");
@ -69,16 +71,109 @@ namespace Menu {
ImGui::SeparatorTextColored("Custom File Loading", IM_COL32(200, 0, 0, 255));
ImGui::NewLine();
ImGui::TextCentered("The mod always creates a folder \"EGameTools\\FilesToLoad\" inside the same folder as the game executable (exe) or in the same folder as the mod file.");
ImGui::TextCentered("This folder is used for custom file loading. This has only been tested with a few mods that change some .scr files, GPUfx files, and other files included inside .pak game archives, or files like .rpack files.");
ImGui::TextCentered("Files in this folder must have the same names as the ones from the game files, otherwise the game won't know it should load those files. Files in subfolders of the \"EGameTools\\FilesToLoad\" folder will automatically be detected, so you can sort all your mods in different folders!");
ImGui::TextCentered("The mod always creates a folder \"EGameTools\\UserModFiles\" inside the same folder as the game executable (exe) or in the same folder as the mod file.");
ImGui::TextCentered("This folder is used for custom file loading. This has only been tested with a few mods that change some .scr files, gpufx files, and other files included inside .pak game archives, or files like .rpack files.");
ImGui::TextCentered("Files in this folder must have the same names as the ones from the game files, otherwise the game won't know it should load those files. Files in subfolders of the \"EGameTools\\UserModFiles\" folder will automatically be detected, so you can sort all your mods in different folders!");
ImGui::TextCentered("The game will reload a lot of the files upon a load of your savegame, so if you want to edit those files and reload them without having to restart the game, just reload your savegame and the game should automatically reload most of those files!");
ImGui::TextCentered("Just make sure that if you add new, additional files while you're in-game, please wait AT LEAST 5 seconds before reloading your savegame, otherwise additional files will not get detected.");
ImGui::TextCentered("Also, if there are multiple files of the same exact name, the game will pick the first instance of that file it finds in the folder.");
ImGui::Spacing(ImVec2(0.0f, 5.0f));
ImGui::TextCentered("The gist of it is, you now don't have to use dataX.pak mods anymore! You can open the pak files, extract their files in the \"EGameTools\\FilesToLoad\" folder and start the game!");
ImGui::TextCentered("The gist of it is, you now don't have to use dataX.pak mods anymore! You can open the pak files, extract their files in the \"EGameTools\\UserModFiles\" folder and start the game!");
ImGui::Spacing(ImVec2(0.0f, 5.0f));
ImGui::TextCentered("Please try not to touch \"EGameTools\\DefaultModFiles\"! Those are mods that come with EGameTools by default, and you should only ever touch those if I can't update them in time to make them work with the latest game version.");
ImGui::SeparatorTextColored("Game Variables Reloading", IM_COL32(200, 0, 0, 255));
ImGui::NewLine();
ImGui::TextCentered("You can also reload Player Variables from a file specified by you, or reload Jump Parameters from \"EGameTools\\FilesToLoad\".");
ImGui::TextCentered("You can also reload Player Variables from a file specified by you, or reload Jump Parameters from \"EGameTools\\UserModFiles\".");
ImGui::SeparatorTextColored("Hotkeys", IM_COL32(200, 0, 0, 255));
ImGui::NewLine();
ImGui::TextCentered("Most mod menu options are toggleable by a hotkey that you can change by clicking the hotkey button for the respective option and then pressing a key on your keyboard.");
ImGui::TextCentered("To change those hotkeys through the config file, visit the \"Virtual-Key Codes\" page from Microsoft which contains a list of all virtual key codes. Simply write the name of the keycode you want to use for each hotkey and save the config file.");
ImGui::SeparatorTextColored("Config", IM_COL32(200, 0, 0, 255));
ImGui::NewLine();
ImGui::TextCentered("A config file \"EGameTools.ini\" is stored in the same folder as the game executable (exe) or in the same folder as the mod file.");
ImGui::TextCentered("The config file stores the mod menu's options and hotkeys.");
ImGui::Spacing(ImVec2(0.0f, 5.0f));
ImGui::TextCentered("Changes to the mod menu or to the config file are always automatically saved or refreshed respectively.");
ImGui::TextCentered("You DO NOT NEED to restart the game for the changes in the config to be applied!");
ImGui::TextCentered("If you want to regenerate the config file, delete it and it will automatically be regenerated.");
ImGui::Separator();
ImGui::NewLine();
ImGui::TextCentered("Finally, if you've got any issue, no matter how small, please make sure to report it! I will try my best to fix it. I want this mod to be polished and enjoyable to use!");
ImGui::TextCentered("If you've got any suggestions for how I could improve the mod, in terms of UI, features, among other things, please let me know!");
ImGui::Spacing(ImVec2(0.0f, 5.0f));
ImGui::BeginDisabled(!timePassedFromWelcomeScreen.DidTimePass());
{
const std::string btnText = "Let me play!" + (!timePassedFromWelcomeScreen.DidTimePass() ? (std::to_string(10 - (timePassedFromWelcomeScreen.GetTimePassed() / 1000)) + ")") : "");
if (ImGui::ButtonCentered(btnText.c_str(), ImVec2(0.0f, 30.0f))) {
ImGui::CloseCurrentPopup();
menuToggle.SetChangesAreDisabled(false);
firstTimeRunning.Set(false);
}
ImGui::EndDisabled();
}
ImGui::EndPopup();
}
ImGui::SetNextWindowSizeConstraints(minWelcomeWndSize, defMaxWelcomeWndSize);
if (ImGui::BeginPopupModal("EGameTools - Welcome!", nullptr, welcomeWindowFlags)) {
ImGui::TextCenteredColored("PLEASE read the following text!", IM_COL32(230, 0, 0, 255));
ImGui::Spacing(ImVec2(0.0f, 5.0f));
const std::string thankYou = "Thank you for downloading EGameTools (" + std::string(MOD_VERSION_STR) + ")!";
ImGui::TextCentered(thankYou.c_str());
ImGui::Spacing(ImVec2(0.0f, 5.0f));
const std::string gameCompat = "This version of the mod is compatible with game version " + std::string(GAME_VER_COMPAT_STR) + ".";
ImGui::TextCentered(gameCompat.c_str());
const std::string gameVer = "The game version you are currently running is v" + GamePH::GetCurrentGameVersionStr() + ".";
ImGui::TextCentered(gameVer.c_str());
const std::string gameTestedVer = "This mod has last been tested with version v" + GamePH::GameVerToStr(GAME_VER_COMPAT) + ".";
ImGui::TextCentered(gameTestedVer.c_str());
if (GamePH::GetCurrentGameVersion() < 11400 || GamePH::GetCurrentGameVersion() > GAME_VER_COMPAT) {
const std::string gameNotCompat = "Please note that your game version has not been officially tested with this mod, therefore expect bugs, glitches or the mod to completely stop working. If so, please " + std::string(GamePH::GetCurrentGameVersion() > GAME_VER_COMPAT ? "wait for a new patch." : "upgrade your game version to one that the mod supports.");
ImGui::TextCenteredColored(gameNotCompat.c_str(), IM_COL32(200, 0, 0, 255));
}
ImGui::Spacing(ImVec2(0.0f, 5.0f));
ImGui::TextCentered("I will not bore you with what this mod is about, so let's get right to teaching you how to use it!");
ImGui::SeparatorTextColored("Menu Toggle", IM_COL32(200, 0, 0, 255));
ImGui::NewLine();
ImGui::TextCentered("The default key for opening/closing the menu is F5. You can use your mouse to navigate the menu.");
ImGui::TextCentered("To change it, you can open up the menu and change the hotkey by clicking the hotkey button for \"Menu Toggle Key\" and then pressing a key on your keyboard.");
ImGui::SeparatorTextColored("FreeCam", IM_COL32(200, 0, 0, 255));
ImGui::NewLine();
ImGui::TextCentered("While using FreeCam, you can press Shift or Alt to boost your speed or slow you down respectively.");
ImGui::TextCentered("You can also use the scroll wheel to change FreeCam speed while FreeCam is enabled.");
ImGui::SeparatorTextColored("Menu Sliders", IM_COL32(200, 0, 0, 255));
ImGui::NewLine();
ImGui::TextCentered("To manually change the value of a slider option, hold \"CTRL\" while clicking the slider.");
ImGui::TextCentered("This will let you input a value manually into the slider, which can even surpass the option's slider limit, given I allowed the option to do so.");
ImGui::SeparatorTextColored("Custom File Loading", IM_COL32(200, 0, 0, 255));
ImGui::NewLine();
ImGui::TextCentered("The mod always creates a folder \"EGameTools\\UserModFiles\" inside the same folder as the game executable (exe) or in the same folder as the mod file.");
ImGui::TextCentered("This folder is used for custom file loading. This has only been tested with a few mods that change some .scr files, gpufx files, and other files included inside .pak game archives, or files like .rpack files.");
ImGui::TextCentered("Files in this folder must have the same names as the ones from the game files, otherwise the game won't know it should load those files. Files in subfolders of the \"EGameTools\\UserModFiles\" folder will automatically be detected, so you can sort all your mods in different folders!");
ImGui::TextCentered("The game will reload a lot of the files upon a load of your savegame, so if you want to edit those files and reload them without having to restart the game, just reload your savegame and the game should automatically reload most of those files!");
ImGui::TextCentered("Just make sure that if you add new, additional files while you're in-game, please wait AT LEAST 5 seconds before reloading your savegame, otherwise additional files will not get detected.");
ImGui::TextCentered("Also, if there are multiple files of the same exact name, the game will pick the first instance of that file it finds in the folder.");
ImGui::Spacing(ImVec2(0.0f, 5.0f));
ImGui::TextCentered("The gist of it is, you now don't have to use dataX.pak mods anymore! You can open the pak files, extract their files in the \"EGameTools\\UserModFiles\" folder and start the game!");
ImGui::Spacing(ImVec2(0.0f, 5.0f));
ImGui::TextCentered("Please try not to touch \"EGameTools\\DefaultModFiles\"! Those are mods that come with EGameTools by default, and you should only ever touch those if I can't update them in time to make them work with the latest game version.");
ImGui::SeparatorTextColored("Game Variables Reloading", IM_COL32(200, 0, 0, 255));
ImGui::NewLine();
ImGui::TextCentered("You can also reload Player Variables from a file specified by you, or reload Jump Parameters from \"EGameTools\\UserModFiles\".");
ImGui::SeparatorTextColored("Hotkeys", IM_COL32(200, 0, 0, 255));
ImGui::NewLine();

View File

@ -21,6 +21,7 @@ namespace Menu {
extern float scale;
extern Option firstTimeRunning;
extern Option hasSeenChangelog;
extern void FirstTimeRunning();
extern void Render();

View File

@ -6357,13 +6357,13 @@ namespace Menu {
ImGuiFileDialog::Instance()->Close();
}
if (ImGui::BeginPopupModal("Failed reloading player jump parameters.", nullptr, ImGuiWindowFlags_AlwaysAutoResize)) {
ImGui::Text("Could not find any \"jump_parameters.scr\" inside \"EGameTools\\FilesToLoad\"! Please make sure a \"jump_parameters.scr\" file is present in the directory mentioned earlier.");
ImGui::Text("Could not find any \"jump_parameters.scr\" inside \"EGameTools\\UserModFiles\"! Please make sure a \"jump_parameters.scr\" file is present in the directory mentioned earlier.");
if (ImGui::Button("OK", ImVec2(120.0f, 0.0f)))
ImGui::CloseCurrentPopup();
ImGui::EndPopup();
}
if (ImGui::BeginPopupModal("Reloaded player jump parameters!", nullptr, ImGuiWindowFlags_AlwaysAutoResize)) {
ImGui::Text("Player jump parameters have been reloaded! from \"EGameTools\\FilesToLoad\"");
ImGui::Text("Player jump parameters have been reloaded! from \"EGameTools\\UserModFiles\"");
if (ImGui::Button("OK", ImVec2(120.0f, 0.0f)))
ImGui::CloseCurrentPopup();
ImGui::EndPopup();
@ -6429,7 +6429,7 @@ namespace Menu {
ImGui::SeparatorText("Player Jump Parameters");
if (ImGui::Button("Reload Jump Params")) {
if (Utils::Files::FileExistsInDir("jump_parameters.scr", "EGameTools\\FilesToLoad")) {
if (Utils::Files::FileExistsInDir("jump_parameters.scr", "EGameTools\\UserModFiles")) {
GamePH::ReloadJumps();
ImGui::OpenPopup("Reloaded player jump parameters!");
} else

View File

@ -12,7 +12,7 @@ namespace Menu {
float gameSpeed = 1.0f;
static float gameSpeedBeforeSlowMo = gameSpeed;
KeyBindOption freezeTime{ VK_NONE };
KeyBindOption slowMotion{ 'X' };
KeyBindOption slowMotion{ '4' };
float slowMotionSpeed = 0.4f;
static float slowMotionSpeedLerp = gameSpeed;
float slowMotionTransitionTime = 1.0f;