Refactored & cleaned up code

This commit is contained in:
Grinch_ 2021-06-18 22:49:11 +06:00
parent d67a91b473
commit 355db293b9
41 changed files with 1888 additions and 1746 deletions

View File

@ -3,39 +3,39 @@
#include "Ui.h" #include "Ui.h"
#include "Util.h" #include "Util.h"
Animation::Animation() CAnimation::CAnimation()
{ {
anim_data.json.LoadData(anim_data.categories, anim_data.selected); m_AnimData.m_Json.LoadData(m_AnimData.m_Categories, m_AnimData.m_Selected);
Cutscene::data.json.LoadData(Cutscene::data.categories, Cutscene::data.selected); m_Cutscene.m_Data.m_Json.LoadData(m_Cutscene.m_Data.m_Categories, m_Cutscene.m_Data.m_Selected);
Events::processScriptsEvent += [] Events::processScriptsEvent += [this]
{ {
if (Cutscene::running) if (m_Cutscene.m_bRunning)
{ {
if (Command<Commands::HAS_CUTSCENE_FINISHED>()) if (Command<Commands::HAS_CUTSCENE_FINISHED>())
{ {
Command<Commands::CLEAR_CUTSCENE>(); Command<Commands::CLEAR_CUTSCENE>();
Cutscene::running = false; m_Cutscene.m_bRunning = false;
Cutscene::scene_name = ""; m_Cutscene.m_SceneName = "";
CPlayerPed* player = FindPlayerPed(); CPlayerPed* player = FindPlayerPed();
player->m_nAreaCode = Cutscene::interior; player->m_nAreaCode = m_Cutscene.m_nInterior;
Command<Commands::SET_AREA_VISIBLE>(player->m_nAreaCode); Command<Commands::SET_AREA_VISIBLE>(player->m_nAreaCode);
Cutscene::interior = 0; m_Cutscene.m_nInterior = 0;
TheCamera.Fade(0, 1); TheCamera.Fade(0, 1);
} }
} }
else else
{ {
if (Cutscene::scene_name != "" && Command<Commands::HAS_CUTSCENE_LOADED>()) if (m_Cutscene.m_SceneName != "" && Command<Commands::HAS_CUTSCENE_LOADED>())
{ {
Command<Commands::START_CUTSCENE>(); Command<Commands::START_CUTSCENE>();
Cutscene::running = true; m_Cutscene.m_bRunning = true;
} }
} }
}; };
} }
void Animation::PlayCutscene(std::string& rootkey, std::string& cutscene_str, std::string& interior) void CAnimation::PlayCutscene(std::string& rootKey, std::string& cutsceneId, std::string& interior)
{ {
if (Util::IsOnCutscene()) if (Util::IsOnCutscene())
{ {
@ -43,20 +43,20 @@ void Animation::PlayCutscene(std::string& rootkey, std::string& cutscene_str, st
return; return;
} }
Cutscene::scene_name = cutscene_str; m_Cutscene.m_SceneName = cutsceneId;
Command<Commands::LOAD_CUTSCENE>(cutscene_str.c_str()); Command<Commands::LOAD_CUTSCENE>(cutsceneId.c_str());
CPlayerPed *player =FindPlayerPed(); CPlayerPed* pPlayer = FindPlayerPed();
Cutscene::interior = player->m_nAreaCode; m_Cutscene.m_nInterior = pPlayer->m_nAreaCode;
player->m_nAreaCode = std::stoi(interior); pPlayer->m_nAreaCode = std::stoi(interior);
Command<Commands::SET_AREA_VISIBLE>(player->m_nAreaCode); Command<Commands::SET_AREA_VISIBLE>(pPlayer->m_nAreaCode);
} }
void Animation::Draw() void CAnimation::Draw()
{ {
if (ImGui::BeginTabBar("Animation", ImGuiTabBarFlags_NoTooltip + ImGuiTabBarFlags_FittingPolicyScroll)) if (ImGui::BeginTabBar("Animation", ImGuiTabBarFlags_NoTooltip + ImGuiTabBarFlags_FittingPolicyScroll))
{ {
ImGui::Spacing(); ImGui::Spacing();
int hplayer = CPools::GetPedRef(FindPlayerPed()); int hPlayer = CPools::GetPedRef(FindPlayerPed());
ImGui::Spacing(); ImGui::Spacing();
@ -65,23 +65,24 @@ void Animation::Draw()
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::Button("Stop animation", Ui::GetSize())) if (ImGui::Button("Stop animation", Ui::GetSize()))
{ {
if (hplayer) if (hPlayer)
Command<Commands::CLEAR_CHAR_TASKS>(hplayer); Command<Commands::CLEAR_CHAR_TASKS>(hPlayer);
} }
ImGui::Spacing(); ImGui::Spacing();
ImGui::Columns(2, 0, false); ImGui::Columns(2, nullptr, false);
ImGui::Checkbox("Loop", &loop); ImGui::Checkbox("Loop", &m_Loop);
ImGui::NextColumn(); ImGui::NextColumn();
ImGui::Checkbox("Secondary", &secondary); ImGui::Checkbox("Secondary", &m_bSecondary);
ImGui::Columns(1); ImGui::Columns(1);
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::BeginChild("Anims Child")) if (ImGui::BeginChild("Anims Child"))
{ {
ImGui::Spacing(); ImGui::Spacing();
Ui::DrawJSON(anim_data.json, anim_data.categories, anim_data.selected, anim_data.filter, &PlayAnimation, &RemoveAnimation); Ui::DrawJSON(m_AnimData.m_Json, m_AnimData.m_Categories, m_AnimData.m_Selected, m_AnimData.m_Filter, &PlayAnimation,
&RemoveAnimation);
ImGui::EndChild(); ImGui::EndChild();
} }
ImGui::EndTabItem(); ImGui::EndTabItem();
@ -90,29 +91,27 @@ void Animation::Draw()
if (ImGui::BeginTabItem("Misc")) if (ImGui::BeginTabItem("Misc"))
{ {
ImGui::Spacing(); ImGui::Spacing();
if (Ui::ListBox("Fighting", fighting_vec, fighting_selected)) if (Ui::ListBox("Fighting", m_FightingStyleList, m_nFightingStyle))
{ {
Command<Commands::GIVE_MELEE_ATTACK_TO_CHAR>(hplayer, fighting_selected + 4, 6); Command<Commands::GIVE_MELEE_ATTACK_TO_CHAR>(hPlayer, m_nFightingStyle + 4, 6);
CHud::SetHelpMessage("Fighting anim set", false, false, false); CHud::SetHelpMessage("Fighting anim set", false, false, false);
} }
if (Ui::ListBoxStr("Walking", walking_vec, walking_selected)) if (Ui::ListBoxStr("Walking", m_WalkingStyleList, m_nWalkingStyle))
{ {
if (walking_selected == "default") if (m_nWalkingStyle == "default")
{ {
patch::Set<DWORD>(0x609A4E, 0x4D48689, false); patch::Set<DWORD>(0x609A4E, 0x4D48689, false);
patch::Set<WORD>(0x609A52, 0, false); patch::Set<WORD>(0x609A52, 0, false);
} }
else else
{ {
const char* cwalking_selected = walking_selected.c_str();
patch::Set<DWORD>(0x609A4E, -0x6F6F6F70, false); patch::Set<DWORD>(0x609A4E, -0x6F6F6F70, false);
patch::Nop(0x609A52, 2, false); patch::Nop(0x609A52, 2, false);
Command<Commands::REQUEST_ANIMATION>(cwalking_selected); Command<Commands::REQUEST_ANIMATION>(m_nWalkingStyle.c_str());
Command<Commands::LOAD_ALL_MODELS_NOW>(); Command<Commands::LOAD_ALL_MODELS_NOW>();
Command<Commands::SET_ANIM_GROUP_FOR_CHAR>(hplayer, cwalking_selected); Command<Commands::SET_ANIM_GROUP_FOR_CHAR>(hPlayer, m_nWalkingStyle.c_str());
Command<Commands::REMOVE_ANIMATION>(cwalking_selected); Command<Commands::REMOVE_ANIMATION>(m_nWalkingStyle.c_str());
} }
CHud::SetHelpMessage("Walking anim set", false, false, false); CHud::SetHelpMessage("Walking anim set", false, false, false);
} }
@ -121,13 +120,13 @@ void Animation::Draw()
if (ImGui::BeginTabItem("Custom")) if (ImGui::BeginTabItem("Custom"))
{ {
ImGui::InputTextWithHint("IFP name", "ped", ifp_buffer, INPUT_BUFFER_SIZE); ImGui::InputTextWithHint("IFP name", "ped", m_nIfpBuffer, INPUT_BUFFER_SIZE);
ImGui::InputTextWithHint("Anim name", "cower", anim_buffer, INPUT_BUFFER_SIZE); ImGui::InputTextWithHint("Anim name", "cower", m_nAnimBuffer, INPUT_BUFFER_SIZE);
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::Button("Add animation", Ui::GetSize())) if (ImGui::Button("Add animation", Ui::GetSize()))
{ {
anim_data.json.data["Custom"][anim_buffer] = ("0, " + std::string(ifp_buffer)); m_AnimData.m_Json.m_Data["Custom"][m_nAnimBuffer] = ("0, " + std::string(m_nIfpBuffer));
anim_data.json.WriteToDisk(); m_AnimData.m_Json.WriteToDisk();
} }
ImGui::EndTabItem(); ImGui::EndTabItem();
} }
@ -136,15 +135,15 @@ void Animation::Draw()
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::Button("Stop cutscene", Ui::GetSize())) if (ImGui::Button("Stop cutscene", Ui::GetSize()))
{ {
if (Cutscene::running) if (m_Cutscene.m_bRunning)
{ {
Command<Commands::CLEAR_CUTSCENE>(); Command<Commands::CLEAR_CUTSCENE>();
Cutscene::running = false; m_Cutscene.m_bRunning = false;
Cutscene::scene_name = ""; m_Cutscene.m_SceneName = "";
CPlayerPed* player = FindPlayerPed(); CPlayerPed* player = FindPlayerPed();
player->m_nAreaCode = Cutscene::interior; player->m_nAreaCode = m_Cutscene.m_nInterior;
Command<Commands::SET_AREA_VISIBLE>(player->m_nAreaCode); Command<Commands::SET_AREA_VISIBLE>(player->m_nAreaCode);
Cutscene::interior = 0; m_Cutscene.m_nInterior = 0;
TheCamera.Fade(0, 1); TheCamera.Fade(0, 1);
} }
} }
@ -153,7 +152,8 @@ void Animation::Draw()
if (ImGui::BeginChild("Cutscene Child")) if (ImGui::BeginChild("Cutscene Child"))
{ {
ImGui::Spacing(); ImGui::Spacing();
Ui::DrawJSON(Cutscene::data.json, Cutscene::data.categories, Cutscene::data.selected, Cutscene::data.filter, &PlayCutscene, nullptr); Ui::DrawJSON(m_Cutscene.m_Data.m_Json, m_Cutscene.m_Data.m_Categories, m_Cutscene.m_Data.m_Selected,
m_Cutscene.m_Data.m_Filter, &PlayCutscene, nullptr);
ImGui::EndChild(); ImGui::EndChild();
} }
ImGui::EndTabItem(); ImGui::EndTabItem();
@ -162,7 +162,7 @@ void Animation::Draw()
} }
} }
void Animation::PlayAnimation(std::string& ifp, std::string& anim, std::string& ifp_repeat) void CAnimation::PlayAnimation(std::string& ifp, std::string& anim, std::string& ifpRepeat)
{ {
int hplayer = CPools::GetPedRef(FindPlayerPed()); int hplayer = CPools::GetPedRef(FindPlayerPed());
@ -173,25 +173,23 @@ void Animation::PlayAnimation(std::string& ifp, std::string& anim, std::string&
} }
Command<Commands::CLEAR_CHAR_TASKS>(hplayer); Command<Commands::CLEAR_CHAR_TASKS>(hplayer);
if (secondary) if (m_bSecondary)
Command<Commands::TASK_PLAY_ANIM_SECONDARY>(hplayer, anim.c_str(), ifp.c_str(), 4.0, loop, 0, 0, 0, -1); Command<Commands::TASK_PLAY_ANIM_SECONDARY>(hplayer, anim.c_str(), ifp.c_str(), 4.0, m_Loop, 0, 0, 0, -1);
else else
Command<Commands::TASK_PLAY_ANIM>(hplayer, anim.c_str(), ifp.c_str(), 4.0, loop, 0, 0, 0, -1); Command<Commands::TASK_PLAY_ANIM>(hplayer, anim.c_str(), ifp.c_str(), 4.0, m_Loop, 0, 0, 0, -1);
if (ifp != "PED") if (ifp != "PED")
Command<Commands::REMOVE_ANIMATION>(ifp.c_str()); Command<Commands::REMOVE_ANIMATION>(ifp.c_str());
} }
void Animation::RemoveAnimation(std::string& ifp, std::string& anim, std::string& ifp_repeat) void CAnimation::RemoveAnimation(std::string& ifp, std::string& anim, std::string& ifpRepeat)
{ {
if (ifp == "Custom") if (ifp == "Custom")
{ {
anim_data.json.data["Custom"].erase(anim); m_AnimData.m_Json.m_Data["Custom"].erase(anim);
anim_data.json.WriteToDisk(); m_AnimData.m_Json.WriteToDisk();
CHud::SetHelpMessage("Animation removed", false, false, false); CHud::SetHelpMessage("Animation removed", false, false, false);
} }
else else
CHud::SetHelpMessage("You can only remove custom anims", false, false, false); CHud::SetHelpMessage("You can only remove custom anims", false, false, false);
} }

View File

@ -1,37 +1,36 @@
#pragma once #pragma once
class Animation class CAnimation
{ {
private: private:
inline static bool loop = false; inline static char m_nAnimBuffer[INPUT_BUFFER_SIZE] = "";
inline static bool secondary = false; inline static SSearchData m_AnimData{ "animation" };
static struct
inline static SearchData anim_data{"animation"};
struct Cutscene
{ {
inline static SearchData data{ "cutscene" }; inline static SSearchData m_Data{ "cutscene" };
inline static std::string scene_name = ""; inline static std::string m_SceneName = "";
inline static int interior = 0; inline static int m_nInterior = 0;
inline static bool running = false; inline static bool m_bRunning = false;
}; } m_Cutscene;
inline static int m_nFightingStyle = 0;
inline static char anim_buffer[INPUT_BUFFER_SIZE] = ""; inline static char m_nIfpBuffer[INPUT_BUFFER_SIZE] = "";
inline static char ifp_buffer[INPUT_BUFFER_SIZE] = ""; inline static bool m_Loop = false;
inline static bool m_bSecondary = false;
inline static std::string m_nWalkingStyle = "default";
inline static std::vector<std::string> fighting_vec{ "Default","Boxing","Kung fu","Kick Boxing","Punch Kick" }; inline static std::vector<std::string> m_FightingStyleList = {"Default", "Boxing", "Kung fu", "Kick Boxing", "Punch Kick"};
inline static int fighting_selected = 0; inline static std::vector<std::string> m_WalkingStyleList =
inline static std::vector<std::string> walking_vec{ "default", "man", "shuffle", "oldman", "gang1", "gang2", {
"oldfatman", "fatman", "jogger", "drunkman", "blindman", "swat", "woman", "shopping", "busywoman", "default", "man", "shuffle", "oldman", "gang1", "gang2", "oldfatman",
"sexywoman", "pro", "oldwoman", "fatwoman", "jogwoman", "oldfatwoman", "skate" }; "fatman", "jogger", "drunkman", "blindman", "swat", "woman", "shopping", "busywoman",
inline static std::string walking_selected = "default"; "sexywoman", "pro", "oldwoman", "fatwoman", "jogwoman", "oldfatwoman", "skate"
};
protected: protected:
Animation(); CAnimation();
public: public:
static void Draw(); static void Draw();
static void PlayAnimation(std::string& rootkey, std::string& anim, std::string& ifp); static void PlayAnimation(std::string& rootKey, std::string& anim, std::string& ifp);
static void PlayCutscene(std::string& rootkey, std::string& cutscene_str, std::string& interior); static void PlayCutscene(std::string& rootKey, std::string& cutsceneId, std::string& interior);
static void RemoveAnimation(std::string& rootkey, std::string& anim, std::string& ifp); static void RemoveAnimation(std::string& rootKey, std::string& anim, std::string& ifp);
}; };

View File

@ -9,74 +9,75 @@ void CheatMenu::DrawWindow()
ImGuiIO& io = ImGui::GetIO(); ImGuiIO& io = ImGui::GetIO();
if (FrontEndMenuManager.m_bMenuActive) if (FrontEndMenuManager.m_bMenuActive)
Hook::show_mouse = false; m_bShowMouse = false;
else else
{ {
if (Globals::show_menu || Menu::commands::show_menu) if (Globals::m_bShowMenu || m_Commands.m_bShowMenu)
{ {
if (Globals::show_menu) if (Globals::m_bShowMenu)
{ {
ImGui::SetNextWindowSize(Globals::menu_size); ImGui::SetNextWindowSize(Globals::m_fMenuSize);
if (ImGui::Begin(MENU_TITLE, &Globals::show_menu, ImGuiWindowFlags_NoCollapse)) if (ImGui::Begin(MENU_TITLE, &Globals::m_bShowMenu, ImGuiWindowFlags_NoCollapse))
{ {
ImGui::PushStyleVar(ImGuiStyleVar_WindowMinSize, ImVec2(250, 350)); ImGui::PushStyleVar(ImGuiStyleVar_WindowMinSize, ImVec2(250, 350));
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(ImGui::GetWindowWidth() / 85, ImGui::GetWindowHeight() / 200)); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding,
ImVec2(ImGui::GetWindowWidth() / 85, ImGui::GetWindowHeight() / 200));
if (Updater::state == UPDATER_UPDATE_FOUND) if (Updater::m_State == UPDATER_UPDATE_FOUND)
Updater::ShowUpdateScreen(); Updater::ShowUpdateScreen();
else else
Ui::DrawHeaders(header); Ui::DrawHeaders(header);
Globals::menu_size = ImGui::GetWindowSize(); Globals::m_fMenuSize = ImGui::GetWindowSize();
config.SetValue("window.sizeX", Globals::menu_size.x); config.SetValue("window.sizeX", Globals::m_fMenuSize.x);
config.SetValue("window.sizeY", Globals::menu_size.y); config.SetValue("window.sizeY", Globals::m_fMenuSize.y);
ImGui::PopStyleVar(2); ImGui::PopStyleVar(2);
ImGui::End(); ImGui::End();
} }
} }
else else
Menu::DrawShortcutsWindow(); DrawShortcutsWindow();
} }
} }
Menu::DrawOverlay(); DrawOverlay();
} }
CheatMenu::CheatMenu() CheatMenu::CheatMenu()
{ {
ApplyStyle(); ApplyStyle();
Hook::window_callback = std::bind(&DrawWindow); window_callback = std::bind(&DrawWindow);
// Load menu settings // Load menu settings
Globals::header_id = config.GetValue("window.id", std::string("")); Globals::m_HeaderId = config.GetValue("window.id", std::string(""));
Globals::menu_size.x = config.GetValue("window.sizeX", screen::GetScreenWidth() / 4.0f); Globals::m_fMenuSize.x = config.GetValue("window.sizeX", screen::GetScreenWidth() / 4.0f);
Globals::menu_size.y = config.GetValue("window.sizeY", screen::GetScreenHeight() / 1.2f); Globals::m_fMenuSize.y = config.GetValue("window.sizeY", screen::GetScreenHeight() / 1.2f);
srand(CTimer::m_snTimeInMilliseconds); srand(CTimer::m_snTimeInMilliseconds);
Events::processScriptsEvent += []() Events::processScriptsEvent += []()
{ {
if (Globals::init_done && !FrontEndMenuManager.m_bMenuActive) if (Globals::m_bInit && !FrontEndMenuManager.m_bMenuActive)
{ {
if (Ui::HotKeyPressed(hotkeys::menu_open)) if (Ui::HotKeyPressed(m_HotKeys.menuOpen))
Globals::show_menu = !Globals::show_menu; Globals::m_bShowMenu = !Globals::m_bShowMenu;
if (Ui::HotKeyPressed(hotkeys::command_window)) if (Ui::HotKeyPressed(m_HotKeys.commandWindow))
{ {
if (Menu::commands::show_menu) if (m_Commands.m_bShowMenu)
{ {
Menu::ProcessCommands(); ProcessCommands();
strcpy(commands::input_buffer, ""); strcpy(m_Commands.m_nInputBuffer, "");
} }
Menu::commands::show_menu = !Menu::commands::show_menu; m_Commands.m_bShowMenu = !m_Commands.m_bShowMenu;
} }
if (Hook::show_mouse != Globals::show_menu) if (m_bShowMouse != Globals::m_bShowMenu)
{ {
if (Hook::show_mouse) // Only write when the menu closes if (m_bShowMouse) // Only write when the menu closes
config.WriteToDisk(); config.WriteToDisk();
Hook::show_mouse = Globals::show_menu; m_bShowMouse = Globals::m_bShowMenu;
} }
} }
}; };
@ -181,17 +182,18 @@ void MenuThread(void* param)
MessageBox(RsGlobal.ps->window, "SilentPatch isn't installed. Exiting CheatMenu.", "CheatMenu", MB_ICONERROR); MessageBox(RsGlobal.ps->window, "SilentPatch isn't installed. Exiting CheatMenu.", "CheatMenu", MB_ICONERROR);
return; return;
} }
flog << "Starting...\nVersion: " MENU_TITLE "\nAuthor: Grinch_\nDiscord: " DISCORD_INVITE "\nMore Info: " GITHUB_LINK "\n" << std::endl; flog << "Starting...\nVersion: " MENU_TITLE "\nAuthor: Grinch_\nDiscord: " DISCORD_INVITE "\nMore Info: "
GITHUB_LINK "\n" << std::endl;
CFastman92limitAdjuster::Init(); CFastman92limitAdjuster::Init();
CheatMenu *menu = new CheatMenu; auto menu = new CheatMenu;
Updater::CheckForUpdate(); Updater::CheckForUpdate();
while (true) while (true)
{ {
Sleep(5000); Sleep(5000);
if (Updater::state == UPDATER_CHECKING) if (Updater::m_State == UPDATER_CHECKING)
Updater::CheckForUpdate(); Updater::CheckForUpdate();
} }
} }
@ -199,13 +201,13 @@ void MenuThread(void* param)
BOOL WINAPI DllMain(HINSTANCE hDllHandle, DWORD nReason, LPVOID Reserved) BOOL WINAPI DllMain(HINSTANCE hDllHandle, DWORD nReason, LPVOID Reserved)
{ {
if (nReason == DLL_PROCESS_ATTACH) if (nReason == DLL_PROCESS_ATTACH)
{ {
uint gameVersion = GetGameVersion(); uint gameVersion = GetGameVersion();
if (gameVersion == GAME_10US_HOODLUM || gameVersion == GAME_10US_COMPACT) if (gameVersion == GAME_10US_HOODLUM || gameVersion == GAME_10US_COMPACT)
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)&MenuThread, NULL, NULL, NULL); CreateThread(nullptr, NULL, (LPTHREAD_START_ROUTINE)&MenuThread, nullptr, NULL, nullptr);
else else
MessageBox(HWND_DESKTOP, "Unknown game version. GTA SA v1.0 US is required.", "CheatMenu", MB_ICONERROR); MessageBox(HWND_DESKTOP, "Unknown game version. GTA SA v1.0 US is required.", "CheatMenu", MB_ICONERROR);
} }
return TRUE; return TRUE;
} }

View File

@ -18,14 +18,14 @@
#include "Visual.h" #include "Visual.h"
#include "Weapon.h" #include "Weapon.h"
class CheatMenu : Hook, Animation, Game, Menu, Ped, Player, Teleport, Vehicle, Visual, Weapon class CheatMenu : Hook, CAnimation, CGame, Menu, Ped, Player, Teleport, Vehicle, Visual, Weapon
{ {
private: private:
inline static CallbackTable header inline static CallbackTable header
{ {
{ "Teleport", &Teleport::Draw },{ "Player", &Player::Draw },{ "Ped", &Ped::Draw }, {"Teleport", &Teleport::Draw}, {"Player", &Player::Draw}, {"Ped", &Ped::Draw},
{ "Animation", &Animation::Draw },{ "Vehicle", &Vehicle::Draw },{ "Weapon", &Weapon::Draw }, {"Animation", &CAnimation::Draw}, {"Vehicle", &Vehicle::Draw}, {"Weapon", &Weapon::Draw},
{ "Game", &Game::Draw },{ "Visual", &Visual::Draw },{ "Menu", &Menu::Draw } {"Game", &CGame::Draw}, {"Visual", &Visual::Draw}, {"Menu", &Menu::Draw}
}; };
static void ApplyStyle(); static void ApplyStyle();
@ -34,4 +34,3 @@ private:
public: public:
CheatMenu(); CheatMenu();
}; };

View File

@ -0,0 +1,2 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CppProjectProperties/LanguageStandard/@EntryValue">Cpp20</s:String></wpf:ResourceDictionary>

View File

@ -6,10 +6,10 @@
#include "CIplStore.h" #include "CIplStore.h"
// Thanks to aap // Thanks to aap
void Game::RealTimeClock() void CGame::RealTimeClock()
{ {
static int lastday; static int lastday;
time_t tmp = time(NULL); time_t tmp = time(nullptr);
struct tm* now = localtime(&tmp); struct tm* now = localtime(&tmp);
if (now->tm_yday != lastday) if (now->tm_yday != lastday)
@ -24,92 +24,92 @@ void Game::RealTimeClock()
CClock::ms_nGameClockSeconds = now->tm_sec; CClock::ms_nGameClockSeconds = now->tm_sec;
} }
Game::Game() CGame::CGame()
{ {
mission_data.json.LoadData(mission_data.categories, mission_data.selected); m_MissionData.m_Json.LoadData(m_MissionData.m_Categories, m_MissionData.m_Selected);
stat::json.LoadData(stat::search_categories, stat::selected_item); m_StatData.m_Json.LoadData(m_StatData.m_Categories, m_StatData.m_Selected);
freecam::fov = TheCamera.FindCamFOV(); m_Freecam.m_fFOV = TheCamera.FindCamFOV();
// Generate enabled cheats vector // Generate enabled cheats vector
for (auto element : random_cheats::name_json.data.items()) for (auto element : m_RandomCheats.m_Json.m_Data.items())
{ {
/* /*
[ [
cheat_id = [ cheat_name, state (true/false) ] cheat_id = [ cheat_name, state (true/false) ]
] ]
*/ */
random_cheats::enabled_cheats[std::stoi(element.key())][0] = element.value().get<std::string>(); m_RandomCheats.m_EnabledCheats[std::stoi(element.key())][0] = element.value().get<std::string>();
random_cheats::enabled_cheats[std::stoi(element.key())][1] = "true"; m_RandomCheats.m_EnabledCheats[std::stoi(element.key())][1] = "true";
} }
Events::processScriptsEvent += [] Events::processScriptsEvent += []
{ {
uint timer = CTimer::m_snTimeInMilliseconds; uint timer = CTimer::m_snTimeInMilliseconds;
static CPlayerPed* player = FindPlayerPed(); CPlayerPed* pPlayer = FindPlayerPed();
static int hplayer = CPools::GetPedRef(player); int hplayer = CPools::GetPedRef(pPlayer);
if (ss_shortcut) if (m_bScreenShot)
{ {
if (Ui::HotKeyPressed(Menu::hotkeys::quick_ss)) if (Ui::HotKeyPressed(Menu::m_HotKeys.quickSceenShot))
{ {
Command<Commands::TAKE_PHOTO>(); Command<Commands::TAKE_PHOTO>();
CHud::SetHelpMessage("Screenshot taken", false, false, false); CHud::SetHelpMessage("Screenshot taken", false, false, false);
} }
} }
if (hard_mode::state) if (m_HardMode.m_bEnabled)
{ {
if (player->m_fHealth > 50.0f) if (pPlayer->m_fHealth > 50.0f)
player->m_fHealth = 50.0f; pPlayer->m_fHealth = 50.0f;
player->m_fArmour = 0.0f; pPlayer->m_fArmour = 0.0f;
CStats::SetStatValue(STAT_MAX_HEALTH, 350.0f); CStats::SetStatValue(STAT_MAX_HEALTH, 350.0f);
CStats::SetStatValue(STAT_STAMINA, 0.0f); CStats::SetStatValue(STAT_STAMINA, 0.0f);
} }
if (solid_water) if (m_bSolidWater)
{ {
CVector pos = player->GetPosition(); CVector pos = pPlayer->GetPosition();
float water_height = 0; float waterHeight = 0;
Command<Commands::GET_WATER_HEIGHT_AT_COORDS>(pos.x, pos.y, false, &water_height); Command<Commands::GET_WATER_HEIGHT_AT_COORDS>(pos.x, pos.y, false, &waterHeight);
if (!Command<Commands::IS_CHAR_IN_ANY_BOAT>(hplayer) && water_height != -1000.0f && pos.z > (water_height)) if (!Command<Commands::IS_CHAR_IN_ANY_BOAT>(hplayer) && waterHeight != -1000.0f && pos.z > (waterHeight))
{ {
if (solid_water_object == 0) if (m_nSolidWaterObj == 0)
{ {
Command<Commands::CREATE_OBJECT>(3095, pos.x, pos.y, water_height, &solid_water_object); Command<Commands::CREATE_OBJECT>(3095, pos.x, pos.y, waterHeight, &m_nSolidWaterObj);
Command<Commands::SET_OBJECT_VISIBLE>(solid_water_object, false); Command<Commands::SET_OBJECT_VISIBLE>(m_nSolidWaterObj, false);
if (pos.z < (water_height + 1)) if (pos.z < (waterHeight + 1))
player->SetPosn(pos.x, pos.y, water_height + 1); pPlayer->SetPosn(pos.x, pos.y, waterHeight + 1);
} }
else else
Command<Commands::SET_OBJECT_COORDINATES>(solid_water_object, pos.x, pos.y, water_height); Command<Commands::SET_OBJECT_COORDINATES>(m_nSolidWaterObj, pos.x, pos.y, waterHeight);
} }
else else
{ {
if (solid_water_object != 0) if (m_nSolidWaterObj != 0)
{ {
Command<Commands::DELETE_OBJECT>(solid_water_object); Command<Commands::DELETE_OBJECT>(m_nSolidWaterObj);
solid_water_object = 0; m_nSolidWaterObj = 0;
} }
} }
} }
// improve this later // improve this later
if (sync_time && timer - sync_time_timer > 50) if (m_bSyncTime && timer - m_nSyncTimer > 50)
{ {
std::time_t t = std::time(0); std::time_t t = std::time(nullptr);
std::tm* now = std::localtime(&t); std::tm* now = std::localtime(&t);
CClock::ms_nGameClockHours = now->tm_hour; CClock::ms_nGameClockHours = now->tm_hour;
CClock::ms_nGameClockMinutes = now->tm_min; CClock::ms_nGameClockMinutes = now->tm_min;
sync_time_timer = timer; m_nSyncTimer = timer;
} }
if (random_cheats::enable if (m_RandomCheats.m_bEnabled
&& (timer - random_cheats::timer) > (uint(random_cheats::enable_wait_time) * 1000)) && (timer - m_RandomCheats.m_nTimer) > (static_cast<uint>(m_RandomCheats.m_nInterval) * 1000))
{ {
int id = Random(0, 91); int id = Random(0, 91);
@ -117,27 +117,27 @@ Game::Game()
{ {
if (i == id) if (i == id)
{ {
if (random_cheats::enabled_cheats[i][1] == "true") if (m_RandomCheats.m_EnabledCheats[i][1] == "true")
{ {
((void(*)(int))0x00438370)(id); // cheatEnableLegimate(int CheatID) ((void(*)(int))0x00438370)(id); // cheatEnableLegimate(int CheatID)
CHud::SetHelpMessage(random_cheats::enabled_cheats[i][0].c_str(), false, false, false); CHud::SetHelpMessage(m_RandomCheats.m_EnabledCheats[i][0].c_str(), false, false, false);
random_cheats::timer = timer; m_RandomCheats.m_nTimer = timer;
} }
break; break;
} }
} }
} }
if (Ui::HotKeyPressed(Menu::hotkeys::freecam)) if (Ui::HotKeyPressed(Menu::m_HotKeys.freeCam))
{ {
if (freecam::enable) if (m_Freecam.m_bEnabled)
{ {
freecam::enable = false; m_Freecam.m_bEnabled = false;
ClearFreecamStuff(); ClearFreecamStuff();
} }
else freecam::enable = true; else m_Freecam.m_bEnabled = true;
} }
if (freecam::enable) if (m_Freecam.m_bEnabled)
FreeCam(); FreeCam();
}; };
} }
@ -156,14 +156,14 @@ void SetPlayerMission(std::string& rootkey, std::string& name, std::string& id)
Command<Commands::LOAD_AND_LAUNCH_MISSION_INTERNAL>(std::stoi(id)); Command<Commands::LOAD_AND_LAUNCH_MISSION_INTERNAL>(std::stoi(id));
} }
else CHud::SetHelpMessage("Can't start mission now", false, false, false); else CHud::SetHelpMessage("Can't start mission now", false, false, false);
} }
void Game::FreeCam() void CGame::FreeCam()
{ {
int delta_speed = freecam::speed * (CTimer::m_snTimeInMillisecondsNonClipped - CTimer::m_snPreviousTimeInMillisecondsNonClipped); int deltaSpeed = m_Freecam.m_fSpeed * (CTimer::m_snTimeInMillisecondsNonClipped -
CTimer::m_snPreviousTimeInMillisecondsNonClipped);
if (!freecam::init_done) if (!m_Freecam.m_bInitDone)
{ {
CPlayerPed* player = FindPlayerPed(-1); CPlayerPed* player = FindPlayerPed(-1);
Command<Commands::SET_EVERYONE_IGNORE_PLAYER>(0, true); Command<Commands::SET_EVERYONE_IGNORE_PLAYER>(0, true);
@ -172,135 +172,135 @@ void Game::FreeCam()
CVector player_pos = player->GetPosition(); CVector player_pos = player->GetPosition();
CPad::GetPad(0)->DisablePlayerControls = true; CPad::GetPad(0)->DisablePlayerControls = true;
Command<Commands::CREATE_RANDOM_CHAR>(player_pos.x, player_pos.y, player_pos.z, &freecam::hped); Command<Commands::CREATE_RANDOM_CHAR>(player_pos.x, player_pos.y, player_pos.z, &m_Freecam.m_nPed);
freecam::ped = CPools::GetPed(freecam::hped); m_Freecam.m_pPed = CPools::GetPed(m_Freecam.m_nPed);
freecam::ped->m_bIsVisible = false; m_Freecam.m_pPed->m_bIsVisible = false;
Command<Commands::FREEZE_CHAR_POSITION_AND_DONT_LOAD_COLLISION>(freecam::hped, true); Command<Commands::FREEZE_CHAR_POSITION_AND_DONT_LOAD_COLLISION>(m_Freecam.m_nPed, true);
Command<Commands::SET_CHAR_COLLISION>(freecam::hped, false); Command<Commands::SET_CHAR_COLLISION>(m_Freecam.m_nPed, false);
Command<Commands::SET_LOAD_COLLISION_FOR_CHAR_FLAG>(freecam::hped, false); Command<Commands::SET_LOAD_COLLISION_FOR_CHAR_FLAG>(m_Freecam.m_nPed, false);
freecam::tmouseX = player->GetHeading() + 89.6f; m_Freecam.m_fTotalMouse.x = player->GetHeading() + 89.6f;
freecam::tmouseY = 0; m_Freecam.m_fTotalMouse.y = 0;
freecam::init_done = true; m_Freecam.m_bInitDone = true;
player_pos.z -= 20; player_pos.z -= 20;
freecam::ped->SetPosn(player_pos); m_Freecam.m_pPed->SetPosn(player_pos);
TheCamera.LerpFOV(TheCamera.FindCamFOV(), freecam::fov, 1000, true); TheCamera.LerpFOV(TheCamera.FindCamFOV(), m_Freecam.m_fFOV, 1000, true);
Command<Commands::CAMERA_PERSIST_FOV>(true); Command<Commands::CAMERA_PERSIST_FOV>(true);
} }
CVector pos = freecam::ped->GetPosition(); CVector pos = m_Freecam.m_pPed->GetPosition();
Command<Commands::GET_PC_MOUSE_MOVEMENT>(&freecam::mouseX, &freecam::mouseY); Command<Commands::GET_PC_MOUSE_MOVEMENT>(&m_Freecam.m_fMouse.x, &m_Freecam.m_fMouse.y);
freecam::tmouseX = freecam::tmouseX - freecam::mouseX / 250; m_Freecam.m_fTotalMouse.x = m_Freecam.m_fTotalMouse.x - m_Freecam.m_fMouse.x / 250;
freecam::tmouseY = freecam::tmouseY + freecam::mouseY / 3; m_Freecam.m_fTotalMouse.y = m_Freecam.m_fTotalMouse.y + m_Freecam.m_fMouse.y / 3;
if (freecam::tmouseY > 150) if (m_Freecam.m_fTotalMouse.x > 150)
freecam::tmouseY = 150; m_Freecam.m_fTotalMouse.y = 150;
if (freecam::tmouseY < -150) if (m_Freecam.m_fTotalMouse.y < -150)
freecam::tmouseY = -150; m_Freecam.m_fTotalMouse.y = -150;
if (Ui::HotKeyPressed(Menu::hotkeys::free_cam_tp_player)) if (Ui::HotKeyPressed(Menu::m_HotKeys.freeCamTeleportPlayer))
{ {
CPlayerPed* player = FindPlayerPed(-1); CPlayerPed* player = FindPlayerPed(-1);
CVector pos = freecam::ped->GetPosition(); CVector pos = m_Freecam.m_pPed->GetPosition();
CEntity* player_entity = FindPlayerEntity(-1); CEntity* player_entity = FindPlayerEntity(-1);
pos.z = CWorld::FindGroundZFor3DCoord(pos.x, pos.y, 1000, 0, &player_entity) + 0.5f; pos.z = CWorld::FindGroundZFor3DCoord(pos.x, pos.y, 1000, nullptr, &player_entity) + 0.5f;
Command<Commands::SET_CHAR_COORDINATES>(CPools::GetPedRef(player), pos.x, pos.y, pos.z); Command<Commands::SET_CHAR_COORDINATES>(CPools::GetPedRef(player), pos.x, pos.y, pos.z);
// disble them again cause they get enabled // disble them again cause they get enabled
CHud::bScriptDontDisplayRadar = true; CHud::bScriptDontDisplayRadar = true;
CHud::m_Wants_To_Draw_Hud = false; CHud::m_Wants_To_Draw_Hud = false;
CHud::SetHelpMessage((char*)"Player telported", false, false, false); CHud::SetHelpMessage("Player telported", false, false, false);
} }
if (KeyPressed(VK_RCONTROL)) if (KeyPressed(VK_RCONTROL))
delta_speed /= 2; deltaSpeed /= 2;
if (KeyPressed(VK_RSHIFT)) if (KeyPressed(VK_RSHIFT))
delta_speed *= 2; deltaSpeed *= 2;
if (KeyPressed(VK_KEY_I) || KeyPressed(VK_KEY_K)) if (KeyPressed(VK_KEY_I) || KeyPressed(VK_KEY_K))
{ {
if (KeyPressed(VK_KEY_K)) if (KeyPressed(VK_KEY_K))
delta_speed *= -1; deltaSpeed *= -1;
float angle; float angle;
Command<Commands::GET_CHAR_HEADING>(freecam::hped, &angle); Command<Commands::GET_CHAR_HEADING>(m_Freecam.m_nPed, &angle);
pos.x += delta_speed * cos(angle * 3.14159f / 180.0f); pos.x += deltaSpeed * cos(angle * 3.14159f / 180.0f);
pos.y += delta_speed * sin(angle * 3.14159f / 180.0f); pos.y += deltaSpeed * sin(angle * 3.14159f / 180.0f);
pos.z += delta_speed * 2 * sin(freecam::tmouseY / 3 * 3.14159f / 180.0f); pos.z += deltaSpeed * 2 * sin(m_Freecam.m_fTotalMouse.y / 3 * 3.14159f / 180.0f);
} }
if (KeyPressed(VK_KEY_J) || KeyPressed(VK_KEY_L)) if (KeyPressed(VK_KEY_J) || KeyPressed(VK_KEY_L))
{ {
if (KeyPressed(VK_KEY_J)) if (KeyPressed(VK_KEY_J))
delta_speed *= -1; deltaSpeed *= -1;
float angle; float angle;
Command<Commands::GET_CHAR_HEADING>(freecam::hped, &angle); Command<Commands::GET_CHAR_HEADING>(m_Freecam.m_nPed, &angle);
angle -= 90; angle -= 90;
pos.x += delta_speed * cos(angle * 3.14159f / 180.0f); pos.x += deltaSpeed * cos(angle * 3.14159f / 180.0f);
pos.y += delta_speed * sin(angle * 3.14159f / 180.0f); pos.y += deltaSpeed * sin(angle * 3.14159f / 180.0f);
} }
if (CPad::NewMouseControllerState.wheelUp) if (CPad::NewMouseControllerState.wheelUp)
{ {
if (freecam::fov > 10.0f) if (m_Freecam.m_fFOV > 10.0f)
freecam::fov -= 2.0f * delta_speed; m_Freecam.m_fFOV -= 2.0f * deltaSpeed;
TheCamera.LerpFOV(TheCamera.FindCamFOV(), freecam::fov, 250, true); TheCamera.LerpFOV(TheCamera.FindCamFOV(), m_Freecam.m_fFOV, 250, true);
Command<Commands::CAMERA_PERSIST_FOV>(true); Command<Commands::CAMERA_PERSIST_FOV>(true);
} }
if (CPad::NewMouseControllerState.wheelDown) if (CPad::NewMouseControllerState.wheelDown)
{ {
if (freecam::fov < 115.0f) if (m_Freecam.m_fFOV < 115.0f)
freecam::fov += 2.0f * delta_speed; m_Freecam.m_fFOV += 2.0f * deltaSpeed;
TheCamera.LerpFOV(TheCamera.FindCamFOV(), freecam::fov, 250, true); TheCamera.LerpFOV(TheCamera.FindCamFOV(), m_Freecam.m_fFOV, 250, true);
Command<Commands::CAMERA_PERSIST_FOV>(true); Command<Commands::CAMERA_PERSIST_FOV>(true);
} }
freecam::ped->SetHeading(freecam::tmouseX); m_Freecam.m_pPed->SetHeading(m_Freecam.m_fTotalMouse.x);
Command<Commands::ATTACH_CAMERA_TO_CHAR>(freecam::hped, 0.0, 0.0, 20.0, 90.0, 180, freecam::tmouseY, 0.0, 2); Command<Commands::ATTACH_CAMERA_TO_CHAR>(m_Freecam.m_nPed, 0.0, 0.0, 20.0, 90.0, 180, m_Freecam.m_fTotalMouse.y, 0.0, 2);
freecam::ped->SetPosn(pos); m_Freecam.m_pPed->SetPosn(pos);
CIplStore::AddIplsNeededAtPosn(pos); CIplStore::AddIplsNeededAtPosn(pos);
} }
void Game::ClearFreecamStuff() void CGame::ClearFreecamStuff()
{ {
freecam::init_done = false; m_Freecam.m_bInitDone = false;
Command<Commands::SET_EVERYONE_IGNORE_PLAYER>(0, false); Command<Commands::SET_EVERYONE_IGNORE_PLAYER>(0, false);
CHud::bScriptDontDisplayRadar = false; CHud::bScriptDontDisplayRadar = false;
CHud::m_Wants_To_Draw_Hud = true; CHud::m_Wants_To_Draw_Hud = true;
CPad::GetPad(0)->DisablePlayerControls = false; CPad::GetPad(0)->DisablePlayerControls = false;
Command<Commands::DELETE_CHAR>(freecam::hped); Command<Commands::DELETE_CHAR>(m_Freecam.m_nPed);
freecam::ped = nullptr; m_Freecam.m_pPed = nullptr;
Command<Commands::CAMERA_PERSIST_FOV>(false); Command<Commands::CAMERA_PERSIST_FOV>(false);
Command<Commands::RESTORE_CAMERA_JUMPCUT>(); Command<Commands::RESTORE_CAMERA_JUMPCUT>();
} }
void Game::Draw() void CGame::Draw()
{ {
ImGui::Spacing(); ImGui::Spacing();
CPlayerPed* player = FindPlayerPed(); CPlayerPed* pPlayer = FindPlayerPed();
int hplayer = CPools::GetPedRef(player); int hplayer = CPools::GetPedRef(pPlayer);
if (ImGui::BeginTabBar("Game", ImGuiTabBarFlags_NoTooltip + ImGuiTabBarFlags_FittingPolicyScroll)) if (ImGui::BeginTabBar("Game", ImGuiTabBarFlags_NoTooltip + ImGuiTabBarFlags_FittingPolicyScroll))
{ {
if (ImGui::BeginTabItem("Checkboxes")) if (ImGui::BeginTabItem("Checkboxes"))
{ {
ImGui::Spacing(); ImGui::Spacing();
ImGui::Columns(2, 0, false); ImGui::Columns(2, nullptr, false);
if (ImGui::Checkbox("Disable cheats", &disable_cheats)) if (ImGui::Checkbox("Disable cheats", &m_bDisableCheats))
{ {
if (disable_cheats) if (m_bDisableCheats)
{ {
patch::Set<BYTE>(0x4384D0, 0xE9, false); patch::Set<BYTE>(0x4384D0, 0xE9, false);
patch::SetInt(0x4384D1, 0xD0, false); patch::SetInt(0x4384D1, 0xD0, false);
@ -313,9 +313,9 @@ void Game::Draw()
patch::SetInt(0x4384D5, 0xCC, false); patch::SetInt(0x4384D5, 0xCC, false);
} }
} }
if (ImGui::Checkbox("Disable F1 & F3 replay", &disable_replay)) if (ImGui::Checkbox("Disable F1 & F3 replay", &m_bDisableReplay))
{ {
if (disable_replay) if (m_bDisableReplay)
patch::SetInt(0x460500, 0xC3, false); patch::SetInt(0x460500, 0xC3, false);
else else
patch::SetInt(0x460500, 0xBD844BB, false); patch::SetInt(0x460500, 0xBD844BB, false);
@ -323,10 +323,10 @@ void Game::Draw()
Ui::CheckboxAddress("Faster clock", 0x96913B); Ui::CheckboxAddress("Faster clock", 0x96913B);
if (Ui::CheckboxWithHint("Forbidden area wl", &forbidden_area_wl, "Wanted levels that appears outside \ if (Ui::CheckboxWithHint("Forbidden area wl", &m_bForbiddenArea, "Wanted levels that appears outside \
of LS without completing missions")) of LS without completing missions"))
{ {
if (forbidden_area_wl) if (m_bForbiddenArea)
patch::Set<BYTE>(0x441770, 0x83, false); patch::Set<BYTE>(0x441770, 0x83, false);
else else
patch::Set<BYTE>(0x441770, 0xC3, false); patch::Set<BYTE>(0x441770, 0xC3, false);
@ -334,52 +334,54 @@ of LS without completing missions"))
Ui::CheckboxAddress("Free pay n spray", 0x96C009); Ui::CheckboxAddress("Free pay n spray", 0x96C009);
if (ImGui::Checkbox("Freeze misson timer", &freeze_mission_timer)) if (ImGui::Checkbox("Freeze misson timer", &m_bMissionTimer))
Command<Commands::FREEZE_ONSCREEN_TIMER>(freeze_mission_timer); Command<Commands::FREEZE_ONSCREEN_TIMER>(m_bMissionTimer);
ImGui::NextColumn(); ImGui::NextColumn();
if (Ui::CheckboxWithHint("Hard mode", &hard_mode::state, "Makes the game more challanging to play. \n\ if (Ui::CheckboxWithHint("Hard mode", &m_HardMode.m_bEnabled, "Makes the game more challanging to play. \n\
Lowers armour, health, stamina etc.")) Lowers armour, health, stamina etc."))
{ {
CPlayerPed* player = FindPlayerPed(); CPlayerPed* player = FindPlayerPed();
if (hard_mode::state) if (m_HardMode.m_bEnabled)
{ {
hard_mode::prev_armour = player->m_fArmour; m_HardMode.m_fBacArmour = player->m_fArmour;
hard_mode::prev_health = player->m_fHealth; m_HardMode.m_fBacHealth = player->m_fHealth;
hard_mode::prev_max_health = CStats::GetStatValue(STAT_MAX_HEALTH); m_HardMode.m_fBacMaxHealth = CStats::GetStatValue(STAT_MAX_HEALTH);
hard_mode::prev_stamina = CStats::GetStatValue(STAT_STAMINA); m_HardMode.m_fBacStamina = CStats::GetStatValue(STAT_STAMINA);
player->m_fHealth = 50.0f; player->m_fHealth = 50.0f;
} }
else else
{ {
player->m_fArmour = hard_mode::prev_armour; player->m_fArmour = m_HardMode.m_fBacArmour;
CStats::SetStatValue(STAT_STAMINA, hard_mode::prev_stamina); CStats::SetStatValue(STAT_STAMINA, m_HardMode.m_fBacStamina);
CStats::SetStatValue(STAT_MAX_HEALTH, hard_mode::prev_max_health); CStats::SetStatValue(STAT_MAX_HEALTH, m_HardMode.m_fBacMaxHealth);
player->m_fHealth = hard_mode::prev_health; player->m_fHealth = m_HardMode.m_fBacHealth;
CWeaponInfo::LoadWeaponData(); CWeaponInfo::LoadWeaponData();
} }
} }
if (Ui::CheckboxWithHint("Keep stuff", &keep_stuff, "Keep stuff after arrest/death")) if (Ui::CheckboxWithHint("Keep stuff", &m_bKeepStuff, "Keep stuff after arrest/death"))
{ {
Command<Commands::SWITCH_ARREST_PENALTIES>(keep_stuff); Command<Commands::SWITCH_ARREST_PENALTIES>(m_bKeepStuff);
Command<Commands::SWITCH_DEATH_PENALTIES>(keep_stuff); Command<Commands::SWITCH_DEATH_PENALTIES>(m_bKeepStuff);
} }
Ui::CheckboxWithHint("Screenshot shortcut", &ss_shortcut, (("Take screenshot using ") + Ui::GetHotKeyNameString(Menu::hotkeys::quick_ss) Ui::CheckboxWithHint("Screenshot shortcut", &m_bScreenShot,
+ "\nSaved inside 'GTA San Andreas User Files\\Gallery'").c_str()); (("Take screenshot using ") + Ui::GetHotKeyNameString(Menu::m_HotKeys.quickSceenShot)
if (Ui::CheckboxWithHint("Solid water", &solid_water, "Player can walk on water\nTurn this off if you want to swim.")) + "\nSaved inside 'GTA San Andreas User Files\\Gallery'").c_str());
if (Ui::CheckboxWithHint("Solid water", &m_bSolidWater,
"Player can walk on water\nTurn this off if you want to swim."))
{ {
if (!solid_water && solid_water_object != 0) if (!m_bSolidWater && m_nSolidWaterObj != 0)
{ {
Command<Commands::DELETE_OBJECT>(solid_water_object); Command<Commands::DELETE_OBJECT>(m_nSolidWaterObj);
solid_water_object = 0; m_nSolidWaterObj = 0;
} }
} }
if (ImGui::Checkbox("Sync system time", &sync_time)) if (ImGui::Checkbox("Sync system time", &m_bSyncTime))
{ {
if (sync_time) if (m_bSyncTime)
patch::RedirectCall(0x53BFBD, &RealTimeClock); patch::RedirectCall(0x53BFBD, &RealTimeClock);
else else
patch::RedirectCall(0x53BFBD, &CClock::Update); patch::RedirectCall(0x53BFBD, &CClock::Update);
@ -393,7 +395,7 @@ Lowers armour, health, stamina etc."))
if (ImGui::CollapsingHeader("Current day")) if (ImGui::CollapsingHeader("Current day"))
{ {
int day = CClock::CurrentDay - 1; int day = CClock::CurrentDay - 1;
if (Ui::ListBox("Select day", day_names, day)) if (Ui::ListBox("Select day", m_DayNames, day))
CClock::CurrentDay = day + 1; CClock::CurrentDay = day + 1;
ImGui::Spacing(); ImGui::Spacing();
ImGui::Separator(); ImGui::Separator();
@ -402,20 +404,20 @@ Lowers armour, health, stamina etc."))
Ui::EditReference("FPS limit", RsGlobal.frameLimit, 1, 30, 60); Ui::EditReference("FPS limit", RsGlobal.frameLimit, 1, 30, 60);
if (ImGui::CollapsingHeader("Free cam")) if (ImGui::CollapsingHeader("Free cam"))
{ {
if (Ui::CheckboxWithHint("Enable", &freecam::enable, "Forward: I\tBackward: K\ if (Ui::CheckboxWithHint("Enable", &m_Freecam.m_bEnabled, "Forward: I\tBackward: K\
\nLeft: J\t\t Right: L\n\nSlower: RCtrl\tFaster: RShift\n\nZoom: Mouse wheel")) \nLeft: J\t\t Right: L\n\nSlower: RCtrl\tFaster: RShift\n\nZoom: Mouse wheel"))
{ {
if (!freecam::enable) if (!m_Freecam.m_bEnabled)
ClearFreecamStuff(); ClearFreecamStuff();
} }
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::SliderFloat("Field of view", &freecam::fov, 5.0f, 120.0f)) if (ImGui::SliderFloat("Field of view", &m_Freecam.m_fFOV, 5.0f, 120.0f))
{ {
TheCamera.LerpFOV(TheCamera.FindCamFOV(), freecam::fov, 250.0f, true); TheCamera.LerpFOV(TheCamera.FindCamFOV(), m_Freecam.m_fFOV, 250.0f, true);
Command<Commands::CAMERA_PERSIST_FOV>(true); Command<Commands::CAMERA_PERSIST_FOV>(true);
} }
ImGui::SliderFloat("Movement Speed", &freecam::speed, 0.0f, 0.5f); ImGui::SliderFloat("Movement Speed", &m_Freecam.m_fSpeed, 0.0f, 0.5f);
ImGui::Spacing(); ImGui::Spacing();
ImGui::TextWrapped("Press Enter to teleport player to camera location"); ImGui::TextWrapped("Press Enter to teleport player to camera location");
ImGui::Spacing(); ImGui::Spacing();
@ -447,12 +449,14 @@ Lowers armour, health, stamina etc."))
ImGui::Separator(); ImGui::Separator();
} }
static std::vector<Ui::NamedMemory> themes{ { "Beach", 0x969159 }, { "Country" ,0x96917D }, { "Fun house" ,0x969176 }, { "Ninja" ,0x96915C } }; static std::vector<Ui::NamedMemory> themes{
{"Beach", 0x969159}, {"Country", 0x96917D}, {"Fun house", 0x969176}, {"Ninja", 0x96915C}
};
Ui::EditRadioButtonAddress("Themes", themes); Ui::EditRadioButtonAddress("Themes", themes);
if (ImGui::CollapsingHeader("Weather")) if (ImGui::CollapsingHeader("Weather"))
{ {
typedef void func(void); using func = void(void);
if (ImGui::Button("Foggy", Ui::GetSize(3))) if (ImGui::Button("Foggy", Ui::GetSize(3)))
((func*)0x438F80)(); ((func*)0x438F80)();
@ -484,13 +488,13 @@ Lowers armour, health, stamina etc."))
{ {
ImGui::Spacing(); ImGui::Spacing();
if (!mission_warning_shown) if (!m_bMissionLoaderWarningShown)
{ {
ImGui::TextWrapped("Mission loader might cause unintended changes to your game. \ ImGui::TextWrapped("Mission loader might cause unintended changes to your game. \
It's recommanded not to save your game after using this. Use it at your own risk!"); It's recommanded not to save your game after using this. Use it at your own risk!");
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::Button("Show mission loader", ImVec2(Ui::GetSize())))\ if (ImGui::Button("Show mission loader", ImVec2(Ui::GetSize())))
mission_warning_shown = true; m_bMissionLoaderWarningShown = true;
} }
else else
{ {
@ -502,7 +506,8 @@ It's recommanded not to save your game after using this. Use it at your own risk
ImGui::Spacing(); ImGui::Spacing();
Ui::DrawJSON(mission_data.json, mission_data.categories, mission_data.selected, mission_data.filter, SetPlayerMission, nullptr); Ui::DrawJSON(m_MissionData.m_Json, m_MissionData.m_Categories, m_MissionData.m_Selected, m_MissionData.m_Filter,
SetPlayerMission, nullptr);
} }
ImGui::EndTabItem(); ImGui::EndTabItem();
} }
@ -512,22 +517,22 @@ It's recommanded not to save your game after using this. Use it at your own risk
ImGui::Spacing(); ImGui::Spacing();
ImGui::PushItemWidth(ImGui::GetContentRegionAvailWidth() / 2 - 5); ImGui::PushItemWidth(ImGui::GetContentRegionAvailWidth() / 2 - 5);
Ui::ListBoxStr("##Categories", stat::search_categories, stat::selected_item); Ui::ListBoxStr("##Categories", m_StatData.m_Categories, m_StatData.m_Selected);
ImGui::SameLine(); ImGui::SameLine();
Ui::FilterWithHint("##Filter", stat::filter, "Search"); Ui::FilterWithHint("##Filter", m_StatData.m_Filter, "Search");
ImGui::PopItemWidth(); ImGui::PopItemWidth();
ImGui::Spacing(); ImGui::Spacing();
ImGui::BeginChild("STATCHILD"); ImGui::BeginChild("STATCHILD");
for (auto root : stat::json.data.items()) for (auto root : m_StatData.m_Json.m_Data.items())
{ {
if (root.key() == stat::selected_item || stat::selected_item == "All") if (root.key() == m_StatData.m_Selected || m_StatData.m_Selected == "All")
{ {
for (auto _data : root.value().items()) for (auto _data : root.value().items())
{ {
std::string name = _data.value().get<std::string>(); auto name = _data.value().get<std::string>();
if (stat::filter.PassFilter(name.c_str())) if (m_StatData.m_Filter.PassFilter(name.c_str()))
Ui::EditStat(name.c_str(), std::stoi(_data.key())); Ui::EditStat(name.c_str(), std::stoi(_data.key()));
} }
} }
@ -538,12 +543,12 @@ It's recommanded not to save your game after using this. Use it at your own risk
if (ImGui::BeginTabItem("Random cheats")) if (ImGui::BeginTabItem("Random cheats"))
{ {
ImGui::Spacing(); ImGui::Spacing();
ImGui::Checkbox("Enable", &random_cheats::enable); ImGui::Checkbox("Enable", &m_RandomCheats.m_bEnabled);
ImGui::Spacing(); ImGui::Spacing();
ImGui::PushItemWidth(ImGui::GetWindowContentRegionWidth() / 2); ImGui::PushItemWidth(ImGui::GetWindowContentRegionWidth() / 2);
ImGui::SliderInt("Activate cheat timer", &random_cheats::enable_wait_time, 5, 60); ImGui::SliderInt("Activate cheat timer", &m_RandomCheats.m_nInterval, 5, 60);
Ui::ShowTooltip("Wait time after a cheat is activated."); Ui::ShowTooltip("Wait time after a cheat is activated.");
ImGui::PopItemWidth(); ImGui::PopItemWidth();
@ -552,11 +557,11 @@ It's recommanded not to save your game after using this. Use it at your own risk
ImGui::Separator(); ImGui::Separator();
if (ImGui::BeginChild("Cheats list")) if (ImGui::BeginChild("Cheats list"))
{ {
for (auto element : random_cheats::enabled_cheats) for (auto element : m_RandomCheats.m_EnabledCheats)
{ {
bool selected = (element[1] == "true") ? true : false; bool selected = (element[1] == "true") ? true : false;
if (ImGui::MenuItem(element[0].c_str(), 0, selected)) if (ImGui::MenuItem(element[0].c_str(), nullptr, selected))
element[1] = selected ? "false" : "true"; element[1] = selected ? "false" : "true";
} }
ImGui::EndChild(); ImGui::EndChild();

View File

@ -1,69 +1,57 @@
#pragma once #pragma once
class Game class CGame
{ {
public: public:
inline static SearchData mission_data{ "mission" }; inline static SSearchData m_MissionData{"mission"};
inline static std::vector<std::string> day_names = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" }; inline static std::vector<std::string> m_DayNames =
inline static char save_game_name[22] = "";
struct random_cheats
{ {
inline static bool enable = false; "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
inline static int enable_wait_time = 10;
inline static CJson name_json = CJson("cheat name");
inline static uint timer = 0;
inline static std::string enabled_cheats[92][2];
}; };
static struct
struct freecam
{ {
inline static bool enable = false; inline static bool m_bEnabled;
inline static float speed = 0.08f; inline static std::string m_EnabledCheats[92][2];
inline static float fov = -1; inline static int m_nInterval = 10;
inline static bool init_done = false; inline static CJson m_Json = CJson("cheat name");
inline static CPed* ped = nullptr; inline static uint m_nTimer;
inline static int hped = -1; } m_RandomCheats;
inline static float mouseX = 0.0f; static struct
inline static float mouseY = 0.0f;
inline static float tmouseX = 0.0f;
inline static float tmouseY = 0.0f;
};
struct hard_mode
{ {
inline static bool state = false; inline static bool m_bEnabled;
inline static float prev_health = 0.0f; inline static float m_fSpeed = 0.08f;
inline static float prev_max_health = 0.0f; inline static float m_fFOV = -1;
inline static float prev_armour = 0.0f; inline static bool m_bInitDone;
inline static float prev_stamina = 0.0f; inline static CPed* m_pPed;
}; inline static int m_nPed = -1;
inline static CVector m_fMouse;
inline static bool disable_cheats = false; inline static CVector m_fTotalMouse;
inline static bool disable_replay = false; } m_Freecam;
inline static bool forbidden_area_wl = true; static struct
inline static bool freeze_mission_timer = false;
inline static bool freeze_time = false;
inline static bool keep_stuff = false;
inline static bool solid_water = false;
inline static bool ss_shortcut = false;
inline static bool sync_time = false;
inline static uint sync_time_timer = 0;
inline static uint solid_water_object = 0;
inline static bool mission_warning_shown = false;
struct stat
{ {
inline static CJson json = CJson("stat"); inline static bool m_bEnabled;
inline static ImGuiTextFilter filter = ""; inline static float m_fBacHealth = 0.0f;
inline static std::vector<std::string> search_categories; inline static float m_fBacMaxHealth = 0.0f;
inline static std::string selected_item = "All"; inline static float m_fBacArmour = 0.0f;
}; inline static float m_fBacStamina = 0.0f;
} m_HardMode;
inline static bool m_bDisableCheats;
inline static bool m_bDisableReplay;
inline static bool m_bForbiddenArea = true;
inline static bool m_bMissionTimer;
inline static bool m_bFreezeTime;
inline static bool m_bKeepStuff;
inline static bool m_bSolidWater;
inline static bool m_bScreenShot;
inline static bool m_bSyncTime;
inline static uint m_nSyncTimer;
inline static uint m_nSolidWaterObj;
inline static bool m_bMissionLoaderWarningShown;
Game(); inline static SSearchData m_StatData{ "stat" };
CGame();
static void Draw(); static void Draw();
static void FreeCam(); static void FreeCam();
static void ClearFreecamStuff(); static void ClearFreecamStuff();
static void RealTimeClock(); static void RealTimeClock();
}; };

View File

@ -6,7 +6,7 @@ LRESULT Hook::WndProc(const HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ {
ImGui_ImplWin32_WndProcHandler(hWnd, uMsg, wParam, lParam); ImGui_ImplWin32_WndProcHandler(hWnd, uMsg, wParam, lParam);
if (Hook::show_mouse) if (m_bShowMouse)
{ {
patch::Nop(0x4EB9F4, 5); // disable radio scroll patch::Nop(0x4EB9F4, 5); // disable radio scroll
CPad::ClearMouseHistory(); CPad::ClearMouseHistory();
@ -35,20 +35,20 @@ HRESULT Hook::Reset(IDirect3DDevice9* pDevice, D3DPRESENT_PARAMETERS* pPresentat
void Hook::RenderFrame(void* ptr) void Hook::RenderFrame(void* ptr)
{ {
if (!ImGui::GetCurrentContext() || Globals::menu_closing) if (!ImGui::GetCurrentContext())
return; return;
ImGuiIO& io = ImGui::GetIO(); ImGuiIO& io = ImGui::GetIO();
if (Globals::init_done) if (Globals::m_bInit)
{ {
Hook::ShowMouse(show_mouse); ShowMouse(m_bShowMouse);
// handle window scaling here // handle window scaling here
ImVec2 size(screen::GetScreenWidth(), screen::GetScreenHeight()); ImVec2 size(screen::GetScreenWidth(), screen::GetScreenHeight());
if (Globals::screen_size.x != size.x && Globals::screen_size.y != size.y) if (Globals::m_fScreenSize.x != size.x && Globals::m_fScreenSize.y != size.y)
{ {
int font_size = int(size.y / 54.85f); // manually tested int font_size = static_cast<int>(size.y / 54.85f); // manually tested
io.FontDefault = io.Fonts->AddFontFromFileTTF("C:/Windows/Fonts/trebucbd.ttf", font_size); io.FontDefault = io.Fonts->AddFontFromFileTTF("C:/Windows/Fonts/trebucbd.ttf", font_size);
io.Fonts->Build(); io.Fonts->Build();
@ -58,10 +58,10 @@ void Hook::RenderFrame(void* ptr)
else else
ImGui_ImplDX11_InvalidateDeviceObjects(); ImGui_ImplDX11_InvalidateDeviceObjects();
if (Globals::screen_size.x != -1 && Globals::screen_size.y != -1) if (Globals::m_fScreenSize.x != -1 && Globals::m_fScreenSize.y != -1)
{ {
Globals::menu_size.x += (size.x - Globals::screen_size.x) / 4.0f; Globals::m_fMenuSize.x += (size.x - Globals::m_fScreenSize.x) / 4.0f;
Globals::menu_size.y += (size.y - Globals::screen_size.y) / 1.2f; Globals::m_fMenuSize.y += (size.y - Globals::m_fScreenSize.y) / 1.2f;
} }
ImGuiStyle* style = &ImGui::GetStyle(); ImGuiStyle* style = &ImGui::GetStyle();
@ -74,7 +74,7 @@ void Hook::RenderFrame(void* ptr)
style->IndentSpacing = 20 * scale_x; style->IndentSpacing = 20 * scale_x;
style->ItemInnerSpacing = ImVec2(4 * scale_x, 4 * scale_y); style->ItemInnerSpacing = ImVec2(4 * scale_x, 4 * scale_y);
Globals::screen_size = size; Globals::m_fScreenSize = size;
} }
ImGui_ImplWin32_NewFrame(); ImGui_ImplWin32_NewFrame();
@ -85,7 +85,7 @@ void Hook::RenderFrame(void* ptr)
ImGui::NewFrame(); ImGui::NewFrame();
if (window_callback != NULL) if (window_callback != nullptr)
window_callback(); window_callback();
ImGui::EndFrame(); ImGui::EndFrame();
@ -98,7 +98,7 @@ void Hook::RenderFrame(void* ptr)
} }
else else
{ {
Globals::init_done = true; Globals::m_bInit = true;
ImGui::CreateContext(); ImGui::CreateContext();
ImGuiStyle& style = ImGui::GetStyle(); ImGuiStyle& style = ImGui::GetStyle();
@ -116,7 +116,7 @@ void Hook::RenderFrame(void* ptr)
else else
{ {
// for dx11 device ptr is swapchain // for dx11 device ptr is swapchain
reinterpret_cast<IDXGISwapChain*>(ptr)->GetDevice(__uuidof(ID3D11Device), (void**)&Globals::device); reinterpret_cast<IDXGISwapChain*>(ptr)->GetDevice(__uuidof(ID3D11Device), &Globals::device);
ID3D11DeviceContext* context; ID3D11DeviceContext* context;
reinterpret_cast<ID3D11Device*>(Globals::device)->GetImmediateContext(&context); reinterpret_cast<ID3D11Device*>(Globals::device)->GetImmediateContext(&context);
@ -125,8 +125,8 @@ void Hook::RenderFrame(void* ptr)
ImGui_ImplWin32_EnableDpiAwareness(); ImGui_ImplWin32_EnableDpiAwareness();
io.IniFilename = NULL; io.IniFilename = nullptr;
io.LogFilename = NULL; io.LogFilename = nullptr;
io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad && ImGuiConfigFlags_NavEnableKeyboard; io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad && ImGuiConfigFlags_NavEnableKeyboard;
style.WindowTitleAlign = ImVec2(0.5, 0.5); style.WindowTitleAlign = ImVec2(0.5, 0.5);
@ -163,16 +163,17 @@ void Hook::ShowMouse(bool state)
} }
else else
{ {
if (mouse_visibility != show_mouse) if (m_bMouseVisibility != m_bShowMouse)
{ {
patch::SetUChar(0x6194A0, 0xE9); // jmp setup patch::SetUChar(0x6194A0, 0xE9); // jmp setup
patch::SetUChar(0x746ED0, 0xA1); patch::SetUChar(0x746ED0, 0xA1);
patch::SetRaw(0x53F41F, (void*)"\x85\xC0\x0F\x8C", 4); // xor eax, eax -> test eax, eax , enable camera mouse movement patch::SetRaw(0x53F41F, (void*)"\x85\xC0\x0F\x8C", 4);
// jz loc_53F526 -> jl loc_53F526 // xor eax, eax -> test eax, eax , enable camera mouse movement
// jz loc_53F526 -> jl loc_53F526
} }
} }
if (mouse_visibility != show_mouse) if (m_bMouseVisibility != m_bShowMouse)
{ {
CPad::ClearMouseHistory(); CPad::ClearMouseHistory();
CPad::UpdatePads(); CPad::UpdatePads();
@ -182,7 +183,7 @@ void Hook::ShowMouse(bool state)
CPad::NewMouseControllerState.X = 0; CPad::NewMouseControllerState.X = 0;
CPad::NewMouseControllerState.Y = 0; CPad::NewMouseControllerState.Y = 0;
mouse_visibility = show_mouse; m_bMouseVisibility = m_bShowMouse;
} }
} }
@ -191,14 +192,14 @@ Hook::Hook()
ImGui::CreateContext(); ImGui::CreateContext();
// gtaRenderHook // gtaRenderHook
if (kiero::init(kiero::RenderType::D3D11) == kiero::Status::Success) if (init(kiero::RenderType::D3D11) == kiero::Status::Success)
{ {
Globals::renderer = Render_DirectX11; Globals::renderer = Render_DirectX11;
kiero::bind(8, (void**)&oPresent11, Dx11Handler); kiero::bind(8, (void**)&oPresent11, Dx11Handler);
} }
else else
{ {
if (kiero::init(kiero::RenderType::D3D9) == kiero::Status::Success) if (init(kiero::RenderType::D3D9) == kiero::Status::Success)
{ {
Globals::renderer = Render_DirectX9; Globals::renderer = Render_DirectX9;
kiero::bind(16, (void**)&oReset, Reset); kiero::bind(16, (void**)&oReset, Reset);
@ -214,4 +215,4 @@ Hook::~Hook()
ImGui_ImplWin32_Shutdown(); ImGui_ImplWin32_Shutdown();
ImGui::DestroyContext(); ImGui::DestroyContext();
kiero::shutdown(); kiero::shutdown();
} }

View File

@ -1,33 +1,31 @@
#pragma once #pragma once
#include "pch.h" #include "pch.h"
typedef HRESULT(CALLBACK* f_EndScene)(IDirect3DDevice9*); using f_EndScene = HRESULT(CALLBACK*)(IDirect3DDevice9*);
typedef HRESULT(CALLBACK* f_Present11)(IDXGISwapChain*, UINT, UINT); using f_Present11 = HRESULT(CALLBACK*)(IDXGISwapChain*, UINT, UINT);
typedef HRESULT(CALLBACK* f_Reset)(IDirect3DDevice9*, D3DPRESENT_PARAMETERS*); using f_Reset = HRESULT(CALLBACK*)(IDirect3DDevice9*, D3DPRESENT_PARAMETERS*);
extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
class Hook class Hook
{ {
private: private:
inline static WNDPROC oWndProc = NULL; inline static WNDPROC oWndProc;
inline static f_Present11 oPresent11 = NULL; inline static f_Present11 oPresent11;
inline static f_EndScene oEndScene = NULL; inline static f_EndScene oEndScene;
inline static f_Reset oReset = NULL; inline static f_Reset oReset;
inline static bool mouse_visibility = false; inline static bool m_bMouseVisibility;
static void CALLBACK RenderFrame(void* ptr); static void CALLBACK RenderFrame(void* ptr);
static HRESULT CALLBACK Dx9Handler(IDirect3DDevice9* pDevice); static HRESULT CALLBACK Dx9Handler(IDirect3DDevice9* pDevice);
static HRESULT CALLBACK Dx11Handler(IDXGISwapChain* pSwapChain, UINT SyncInterval, UINT Flags); static HRESULT CALLBACK Dx11Handler(IDXGISwapChain* pSwapChain, UINT SyncInterval, UINT Flags);
static HRESULT CALLBACK Reset(IDirect3DDevice9* pDevice, D3DPRESENT_PARAMETERS* pPresentationParameters); static HRESULT CALLBACK Reset(IDirect3DDevice9* pDevice, D3DPRESENT_PARAMETERS* pPresentationParameters);
static LRESULT CALLBACK WndProc(const HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
static void ShowMouse(bool state); static void ShowMouse(bool state);
protected: protected:
inline static bool show_mouse = false; inline static bool m_bShowMouse = false;
inline static std::function<void()> window_callback = NULL; inline static std::function<void()> window_callback = nullptr;
Hook(); Hook();
~Hook(); ~Hook();
}; };

View File

@ -6,42 +6,42 @@ CJson::CJson(const char* name)
if (name == "") if (name == "")
return; return;
file_path = PLUGIN_PATH((char*)"/CheatMenu/json/") + std::string(name) + ".json"; m_FilePath = PLUGIN_PATH((char*)"/CheatMenu/json/") + std::string(name) + ".json";
if (fs::exists(file_path)) if (fs::exists(m_FilePath))
{ {
try try
{ {
std::ifstream file(file_path); std::ifstream file(m_FilePath);
file >> data; file >> m_Data;
file.close(); file.close();
} }
catch (...) catch (...)
{ {
flog << "Error trying to read " << file_path << std::endl; flog << "Error trying to read " << m_FilePath << std::endl;
data = "{}"_json; m_Data = "{}"_json;
} }
} }
else else
{ {
data = "{}"_json; m_Data = "{}"_json;
if (file_path.find("config")) if (m_FilePath.find("config"))
flog << "Creating config.json file" << std::endl; flog << "Creating config.json file" << std::endl;
else else
flog << "Failed to locate file " << file_path << std::endl; flog << "Failed to locate file " << m_FilePath << std::endl;
} }
} }
void CJson::WriteToDisk() void CJson::WriteToDisk()
{ {
std::ofstream file(file_path); std::ofstream file(m_FilePath);
file << data.dump(4, ' ', false, nlohmann::json::error_handler_t::replace) << std::endl; file << m_Data.dump(4, ' ', false, nlohmann::json::error_handler_t::replace) << std::endl;
file.close(); file.close();
} }
void CJson::LoadData(std::vector<std::string>& vec, std::string& selected) // Test void CJson::LoadData(std::vector<std::string>& vec, std::string& selected) // Test
{ {
for (auto element : data.items()) for (auto element : m_Data.items())
vec.push_back(element.key()); vec.push_back(element.key());
} }

View File

@ -3,11 +3,10 @@
class CJson class CJson
{ {
private: private:
std::string file_path; std::string m_FilePath;
public: public:
nlohmann::json data; nlohmann::json m_Data;
/* /*
Returns a value from json structure hierarchy using '.' Returns a value from json structure hierarchy using '.'
@ -16,13 +15,14 @@ public:
// specialize since typeid(std::string) doesn't work // specialize since typeid(std::string) doesn't work
template <typename T> template <typename T>
T GetValue(std::string&& key, T&& default_val) T GetValue(std::string&& key, T&& defaultVal)
{ {
try { try
{
std::stringstream ss(key); std::stringstream ss(key);
std::string line; std::string line;
nlohmann::json* json = &data; nlohmann::json* json = &m_Data;
while (getline(ss, line, '.')) while (getline(ss, line, '.'))
json = &((*json)[line]); json = &((*json)[line]);
@ -32,30 +32,32 @@ public:
{ {
return ((json->get<int>() == 1) ? true : false); return ((json->get<int>() == 1) ? true : false);
} }
else return json->get<T>();
return json->get<T>();
} }
catch (...) { catch (...)
return default_val; {
return defaultVal;
} }
} }
template<> template <>
std::string GetValue(std::string&& key, std::string&& default_val) std::string GetValue(std::string&& key, std::string&& defaultVal)
{ {
try { try
{
std::stringstream ss(key); std::stringstream ss(key);
std::string line; std::string line;
nlohmann::json* json = &data; nlohmann::json* json = &m_Data;
while (getline(ss, line, '.')) while (getline(ss, line, '.'))
json = &((*json)[line]); json = &((*json)[line]);
return json->get<std::string>(); return json->get<std::string>();
} }
catch (...) { catch (...)
return default_val; {
return defaultVal;
} }
} }
@ -70,7 +72,7 @@ public:
std::stringstream ss(key); std::stringstream ss(key);
std::string line; std::string line;
nlohmann::json* json = &data; nlohmann::json* json = &m_Data;
while (getline(ss, line, '.')) while (getline(ss, line, '.'))
json = &((*json)[line]); json = &((*json)[line]);
@ -82,19 +84,20 @@ public:
*json = val; *json = val;
} }
template<> template <>
void SetValue(std::string&& key, std::string& val) void SetValue(std::string&& key, std::string& val)
{ {
std::stringstream ss(key); std::stringstream ss(key);
std::string line; std::string line;
nlohmann::json* json = &data; nlohmann::json* json = &m_Data;
while (getline(ss, line, '.')) while (getline(ss, line, '.'))
json = &((*json)[line]); json = &((*json)[line]);
*json = val; *json = val;
} }
/* /*
Loads the section names into a category vector. Loads the section names into a category vector.
Used to create drop down category menus Used to create drop down category menus
@ -107,5 +110,3 @@ public:
void WriteToDisk(); void WriteToDisk();
CJson(const char* text = ""); CJson(const char* text = "");
}; };

View File

@ -12,143 +12,164 @@ Menu::Menu()
{ {
// TODO: use structs // TODO: use structs
// Load config data // Load config data
overlay::bCoord = config.GetValue("overlay.bCoord", false); m_Overlay.bCoord = config.GetValue("overlay.bCoord", false);
overlay::bCpuUsage = config.GetValue("overlay.bCpuUsage", false); m_Overlay.bCpuUsage = config.GetValue("overlay.bCpuUsage", false);
overlay::bFPS = config.GetValue("overlay.bFPS", false); m_Overlay.bFPS = config.GetValue("overlay.bFPS", false);
overlay::bLocName = config.GetValue("overlay.bLocName", false); m_Overlay.bLocName = config.GetValue("overlay.bLocName", false);
overlay::bTransparent = config.GetValue("overlay.bTransparent", false); m_Overlay.bTransparent = config.GetValue("overlay.bTransparent", false);
overlay::bMemUsage = config.GetValue("overlay.bMemUsage", false); m_Overlay.bMemUsage = config.GetValue("overlay.bMemUsage", false);
overlay::bVehHealth = config.GetValue("overlay.bVehHealth", false); m_Overlay.bVehHealth = config.GetValue("overlay.bVehHealth", false);
overlay::bVehSpeed = config.GetValue("overlay.bVehSpeed", false); m_Overlay.bVehSpeed = config.GetValue("overlay.bVehSpeed", false);
overlay::mSelectedPos = config.GetValue("overlay.mSelectedPos", 4); m_Overlay.mSelectedPos = (DISPLAY_POS)config.GetValue("overlay.mSelectedPos", (int)DISPLAY_POS::BOTTOM_RIGHT);
overlay::fPosX = config.GetValue("overlay.fPosX", 0); m_Overlay.fPosX = config.GetValue("overlay.fPosX", 0);
overlay::fPosY = config.GetValue("overlay.fPosY", 0); m_Overlay.fPosY = config.GetValue("overlay.fPosY", 0);
// Hotkeys // Hotkeys
hotkeys::aim_skin_changer.key1 = config.GetValue("hotkey.aim_skin_changer.key1", VK_RETURN); m_HotKeys.aimSkinChanger.m_key1 = config.GetValue("hotkey.aim_skin_changer.key1", VK_RETURN);
hotkeys::aim_skin_changer.key2 = config.GetValue("hotkey.aim_skin_changer.key2", VK_RETURN); m_HotKeys.aimSkinChanger.m_key2 = config.GetValue("hotkey.aim_skin_changer.key2", VK_RETURN);
hotkeys::freecam.key1 = config.GetValue("hotkey.freecam.key1", VK_F6); m_HotKeys.freeCam.m_key1 = config.GetValue("hotkey.freecam.key1", VK_F6);
hotkeys::freecam.key2 = config.GetValue("hotkey.freecam.key2", VK_F6); m_HotKeys.freeCam.m_key2 = config.GetValue("hotkey.freecam.key2", VK_F6);
hotkeys::quick_ss.key1 = config.GetValue("hotkey.quick_screenshot.key1", VK_F5); m_HotKeys.quickSceenShot.m_key1 = config.GetValue("hotkey.quick_screenshot.key1", VK_F5);
hotkeys::quick_ss.key2 = config.GetValue("hotkey.quick_screenshot.key2", VK_F5); m_HotKeys.quickSceenShot.m_key2 = config.GetValue("hotkey.quick_screenshot.key2", VK_F5);
hotkeys::quick_tp.key1 = config.GetValue("hotkey.quick_tp.key1", VK_KEY_X); m_HotKeys.quickTeleport.m_key1 = config.GetValue("hotkey.quick_tp.key1", VK_KEY_X);
hotkeys::quick_tp.key2 = config.GetValue("hotkey.quick_tp.key2", VK_KEY_Y); m_HotKeys.quickTeleport.m_key2 = config.GetValue("hotkey.quick_tp.key2", VK_KEY_Y);
hotkeys::menu_open.key1 = config.GetValue("hotkey.menu_open.key1", VK_LCONTROL); m_HotKeys.menuOpen.m_key1 = config.GetValue("hotkey.menu_open.key1", VK_LCONTROL);
hotkeys::menu_open.key2 = config.GetValue("hotkey.menu_open.key2", VK_KEY_M); m_HotKeys.menuOpen.m_key2 = config.GetValue("hotkey.menu_open.key2", VK_KEY_M);
hotkeys::command_window.key1 = config.GetValue("hotkey.command_window.key1", VK_LMENU); m_HotKeys.commandWindow.m_key1 = config.GetValue("hotkey.command_window.key1", VK_LMENU);
hotkeys::command_window.key2 = config.GetValue("hotkey.command_window.key2", VK_KEY_C); m_HotKeys.commandWindow.m_key2 = config.GetValue("hotkey.command_window.key2", VK_KEY_C);
hotkeys::flip_veh.key1 = config.GetValue("hotkey.flip_veh.key1", VK_NONE); m_HotKeys.flipVeh.m_key1 = config.GetValue("hotkey.flip_veh.key1", VK_NONE);
hotkeys::flip_veh.key2 = config.GetValue("hotkey.flip_veh.key2", VK_NONE); m_HotKeys.flipVeh.m_key2 = config.GetValue("hotkey.flip_veh.key2", VK_NONE);
hotkeys::fix_veh.key1 = config.GetValue("hotkey.fix_veh.key1", VK_NONE); m_HotKeys.fixVeh.m_key1 = config.GetValue("hotkey.fix_veh.key1", VK_NONE);
hotkeys::fix_veh.key2 = config.GetValue("hotkey.fix_veh.key2", VK_NONE); m_HotKeys.fixVeh.m_key2 = config.GetValue("hotkey.fix_veh.key2", VK_NONE);
hotkeys::god_mode.key1 = config.GetValue("hotkey.god_mode.key1", VK_NONE); m_HotKeys.godMode.m_key1 = config.GetValue("hotkey.god_mode.key1", VK_NONE);
hotkeys::god_mode.key2 = config.GetValue("hotkey.god_mode.key2", VK_NONE); m_HotKeys.godMode.m_key2 = config.GetValue("hotkey.god_mode.key2", VK_NONE);
hotkeys::veh_engine.key1 = config.GetValue("hotkey.veh_engine.key1", VK_NONE); m_HotKeys.vehEngine.m_key1 = config.GetValue("hotkey.veh_engine.key1", VK_NONE);
hotkeys::veh_engine.key2 = config.GetValue("hotkey.veh_engine.key2", VK_NONE); m_HotKeys.vehEngine.m_key2 = config.GetValue("hotkey.veh_engine.key2", VK_NONE);
hotkeys::veh_instant_start.key1 = config.GetValue("hotkey.veh_instant_start.key1", VK_NONE); m_HotKeys.vehInstantStart.m_key1 = config.GetValue("hotkey.veh_instant_start.key1", VK_NONE);
hotkeys::veh_instant_start.key2 = config.GetValue("hotkey.veh_instant_start.key2", VK_NONE); m_HotKeys.vehInstantStart.m_key2 = config.GetValue("hotkey.veh_instant_start.key2", VK_NONE);
hotkeys::veh_instant_stop.key1 = config.GetValue("hotkey.veh_instant_stop.key1", VK_NONE); m_HotKeys.vehInstantStop.m_key1 = config.GetValue("hotkey.veh_instant_stop.key1", VK_NONE);
hotkeys::veh_instant_stop.key2 = config.GetValue("hotkey.veh_instant_stop.key2", VK_NONE); m_HotKeys.vehInstantStop.m_key2 = config.GetValue("hotkey.veh_instant_stop.key2", VK_NONE);
Util::GetCPUUsageInit(); Util::GetCPUUsageInit();
MEMORYSTATUSEX memInfo; MEMORYSTATUSEX memInfo;
memInfo.dwLength = sizeof(MEMORYSTATUSEX); memInfo.dwLength = sizeof(MEMORYSTATUSEX);
GlobalMemoryStatusEx(&memInfo); GlobalMemoryStatusEx(&memInfo);
overlay::mTotalRam = int(memInfo.ullTotalPhys * 1e-6); // Bytes -> MegaBytes m_Overlay.mTotalRam = static_cast<int>(memInfo.ullTotalPhys * 1e-6); // Bytes -> MegaBytes
} }
void Menu::DrawOverlay() void Menu::DrawOverlay()
{ {
CPlayerPed* player = FindPlayerPed(); CPlayerPed* player = FindPlayerPed();
bool show_menu = overlay::bCoord || overlay::bFPS || overlay::bLocName || bool m_bShowMenu = m_Overlay.bCoord || m_Overlay.bFPS || m_Overlay.bLocName || m_Overlay.bCpuUsage || m_Overlay.bMemUsage ||
((overlay::bVehHealth || overlay::bVehSpeed) && player->m_pVehicle && player->m_pVehicle->IsDriver(player)); ((m_Overlay.bVehHealth || m_Overlay.bVehSpeed) && player->m_pVehicle && player->m_pVehicle->IsDriver(player));
int corner = overlay::mSelectedPos - 1;
const float offset = 10.0f; const float offset = 10.0f;
ImGuiIO& io = ImGui::GetIO(); ImGuiIO& io = ImGui::GetIO();
ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav; ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_AlwaysAutoResize |
ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav;
if (corner != -1) if (m_Overlay.mSelectedPos == DISPLAY_POS::CUSTOM)
{ {
window_flags |= ImGuiWindowFlags_NoMove; if (m_Overlay.fPosX != NULL && m_Overlay.fPosY != NULL)
ImVec2 window_pos = ImVec2((corner & 1) ? io.DisplaySize.x - offset : offset, (corner & 2) ? io.DisplaySize.y - offset : offset); {
ImVec2 window_pos_pivot = ImVec2((corner & 1) ? 1.0f : 0.0f, (corner & 2) ? 1.0f : 0.0f); config.SetValue("overlay.fPosX", m_Overlay.fPosX);
ImGui::SetNextWindowPos(window_pos, ImGuiCond_Always, window_pos_pivot); config.SetValue("overlay.fPosY", m_Overlay.fPosY);
ImGui::SetNextWindowPos(ImVec2(m_Overlay.fPosX, m_Overlay.fPosY), ImGuiCond_Once);
}
} }
else else
{ {
if (overlay::fPosX != NULL && overlay::fPosY != NULL) window_flags |= ImGuiWindowFlags_NoMove;
ImVec2 pos, pivot;
if (m_Overlay.mSelectedPos == DISPLAY_POS::TOP_LEFT)
{ {
config.SetValue("overlay.fPosX", overlay::fPosX); pos = ImVec2(offset, offset);
config.SetValue("overlay.fPosY", overlay::fPosY); pivot = ImVec2(0.0f, 0.0f);
ImGui::SetNextWindowPos(ImVec2(overlay::fPosX, overlay::fPosY), ImGuiCond_Once);
} }
if (m_Overlay.mSelectedPos == DISPLAY_POS::TOP_RIGHT)
{
pos = ImVec2(io.DisplaySize.x - offset, offset);
pivot = ImVec2(1.0f, 0.0f);
}
if (m_Overlay.mSelectedPos == DISPLAY_POS::BOTTOM_LEFT)
{
pos = ImVec2(offset, io.DisplaySize.y - offset);
pivot = ImVec2(0.0f, 1.0f);
}
if (m_Overlay.mSelectedPos == DISPLAY_POS::BOTTOM_RIGHT)
{
pos = ImVec2(io.DisplaySize.x - offset, io.DisplaySize.y - offset);
pivot = ImVec2(1.0f, 1.0f);
}
ImGui::SetNextWindowPos(pos, ImGuiCond_Always, pivot);
} }
ImGui::SetNextWindowBgAlpha(overlay::bTransparent ? 0.0f : 0.5f); ImGui::SetNextWindowBgAlpha(m_Overlay.bTransparent ? 0.0f : 0.5f);
if (show_menu && ImGui::Begin("Overlay", NULL, window_flags)) if (m_bShowMenu && ImGui::Begin("Overlay", nullptr, window_flags))
{ {
CPlayerPed* player = FindPlayerPed(); CPlayerPed* player = FindPlayerPed();
CVector pos = player->GetPosition(); CVector pos = player->GetPosition();
size_t game_ms = CTimer::m_snTimeInMilliseconds; size_t game_ms = CTimer::m_snTimeInMilliseconds;
if (game_ms - overlay::mLastInterval > overlay::mInterval) if (game_ms - m_Overlay.mLastInterval > m_Overlay.mInterval)
{ {
overlay::fCpuUsage = (float)Util::GetCurrentCPUUsage(); m_Overlay.fCpuUsage = static_cast<float>(Util::GetCurrentCPUUsage());
MEMORYSTATUSEX memInfo; MEMORYSTATUSEX memInfo;
memInfo.dwLength = sizeof(MEMORYSTATUSEX); memInfo.dwLength = sizeof(MEMORYSTATUSEX);
GlobalMemoryStatusEx(&memInfo); GlobalMemoryStatusEx(&memInfo);
int mUsedRam = int((memInfo.ullTotalPhys - memInfo.ullAvailPhys) * 1e-6); int mUsedRam = static_cast<int>((memInfo.ullTotalPhys - memInfo.ullAvailPhys) * 1e-6);
overlay::fMemUsage = 100.0f * (float(mUsedRam) / float(overlay::mTotalRam)); m_Overlay.fMemUsage = 100.0f * (static_cast<float>(mUsedRam) / static_cast<float>(m_Overlay.mTotalRam));
overlay::mFPS = (size_t)CTimer::game_FPS; m_Overlay.mFPS = static_cast<size_t>(CTimer::game_FPS);
overlay::mLastInterval = game_ms; m_Overlay.mLastInterval = game_ms;
} }
if (overlay::bCoord) if (m_Overlay.bCoord)
ImGui::Text("Coord: %.2f, %.2f, %.2f", pos.x, pos.y, pos.z); ImGui::Text("Coord: %.2f, %.2f, %.2f", pos.x, pos.y, pos.z);
if (overlay::bCpuUsage) if (m_Overlay.bCpuUsage)
ImGui::Text("CPU usage: %.2f%%", overlay::fCpuUsage); ImGui::Text("CPU usage: %.2f%%", m_Overlay.fCpuUsage);
if (overlay::bFPS) if (m_Overlay.bFPS)
ImGui::Text("Frames: %d", overlay::mFPS); ImGui::Text("Frames: %d", m_Overlay.mFPS);
if (overlay::bLocName) if (m_Overlay.bLocName)
ImGui::Text("Location: %s", Util::GetLocationName(&pos).c_str()); ImGui::Text("Location: %s", Util::GetLocationName(&pos).c_str());
if (overlay::bMemUsage) if (m_Overlay.bMemUsage)
ImGui::Text("RAM usage: %.2f%%", overlay::fMemUsage); ImGui::Text("RAM usage: %.2f%%", m_Overlay.fMemUsage);
if (player->m_pVehicle && player->m_pVehicle->IsDriver(player)) if (player->m_pVehicle && player->m_pVehicle->IsDriver(player))
{ {
if (overlay::bVehHealth) if (m_Overlay.bVehHealth)
ImGui::Text("Veh Health: %.f", player->m_pVehicle->m_fHealth); ImGui::Text("Veh Health: %.f", player->m_pVehicle->m_fHealth);
if (overlay::bVehSpeed) if (m_Overlay.bVehSpeed)
{ ImGui::Text("Veh Speed: %d", int(player->m_pVehicle->m_vecMoveSpeed.Magnitude()) * 50); // 02E3 - GET_CAR_SPEED
int speed = player->m_pVehicle->m_vecMoveSpeed.Magnitude() * 50; // 02E3 - GET_CAR_SPEED
ImGui::Text("Veh Speed: %d", speed);
}
} }
ImVec2 windowPos = ImGui::GetWindowPos(); ImVec2 windowPos = ImGui::GetWindowPos();
overlay::fPosX = windowPos.x; m_Overlay.fPosX = windowPos.x;
overlay::fPosY = windowPos.y; m_Overlay.fPosY = windowPos.y;
ImGui::End(); ImGui::End();
} }
@ -156,16 +177,17 @@ void Menu::DrawOverlay()
void Menu::DrawShortcutsWindow() void Menu::DrawShortcutsWindow()
{ {
int resX = int(screen::GetScreenWidth()); int resX = static_cast<int>(screen::GetScreenWidth());
int resY = int(screen::GetScreenHeight()); int resY = static_cast<int>(screen::GetScreenHeight());
ImGui::SetNextWindowPos(ImVec2(0, resY - 40), ImGuiCond_Always); ImGui::SetNextWindowPos(ImVec2(0, resY - 40), ImGuiCond_Always);
ImGui::SetNextWindowSize(ImVec2(resX, 40)); ImGui::SetNextWindowSize(ImVec2(resX, 40));
ImGuiWindowFlags flags = ImGuiWindowFlags_NoDecoration + ImGuiWindowFlags_AlwaysAutoResize + ImGuiWindowFlags_NoSavedSettings ImGuiWindowFlags flags = ImGuiWindowFlags_NoDecoration + ImGuiWindowFlags_AlwaysAutoResize +
ImGuiWindowFlags_NoSavedSettings
+ ImGuiWindowFlags_NoMove; + ImGuiWindowFlags_NoMove;
if (ImGui::Begin("Shortcuts window", NULL, flags)) if (ImGui::Begin("Shortcuts window", nullptr, flags))
{ {
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(ImGui::GetStyle().FramePadding.x, resY / 130)); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(ImGui::GetStyle().FramePadding.x, resY / 130));
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(3, 3)); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(3, 3));
@ -173,11 +195,12 @@ void Menu::DrawShortcutsWindow()
ImGui::SetNextItemWidth(resX); ImGui::SetNextItemWidth(resX);
ImGui::SetKeyboardFocusHere(-1); ImGui::SetKeyboardFocusHere(-1);
if (ImGui::InputTextWithHint("##TEXTFIELD", "Enter command", commands::input_buffer, INPUT_BUFFER_SIZE, ImGuiInputTextFlags_EnterReturnsTrue)) if (ImGui::InputTextWithHint("##TEXTFIELD", "Enter command", m_Commands.m_nInputBuffer, INPUT_BUFFER_SIZE,
ImGuiInputTextFlags_EnterReturnsTrue))
{ {
ProcessCommands(); ProcessCommands();
commands::show_menu = false; m_Commands.m_bShowMenu = false;
strcpy(commands::input_buffer, ""); strcpy(m_Commands.m_nInputBuffer, "");
} }
ImGui::PopStyleVar(2); ImGui::PopStyleVar(2);
@ -187,7 +210,7 @@ void Menu::DrawShortcutsWindow()
void Menu::ProcessCommands() void Menu::ProcessCommands()
{ {
std::stringstream ss(commands::input_buffer); std::stringstream ss(m_Commands.m_nInputBuffer);
std::string command; std::string command;
ss >> command; ss >> command;
@ -200,7 +223,8 @@ void Menu::ProcessCommands()
ss >> temp; ss >> temp;
FindPlayerPed()->m_fHealth = std::stof(temp); FindPlayerPed()->m_fHealth = std::stof(temp);
} }
catch (...) { catch (...)
{
CHud::SetHelpMessage("Invalid value", false, false, false); CHud::SetHelpMessage("Invalid value", false, false, false);
} }
} }
@ -216,14 +240,16 @@ void Menu::ProcessCommands()
ss >> temp; ss >> temp;
CClock::ms_nGameClockMinutes = std::stoi(temp); CClock::ms_nGameClockMinutes = std::stoi(temp);
} }
catch (...) { catch (...)
{
CHud::SetHelpMessage("Invalid value", false, false, false); CHud::SetHelpMessage("Invalid value", false, false, false);
} }
} }
if (command == "tp") if (command == "tp")
{ {
try { try
{
CVector pos; CVector pos;
std::string temp; std::string temp;
@ -238,7 +264,8 @@ void Menu::ProcessCommands()
Teleport::TeleportPlayer(false, pos, 0); Teleport::TeleportPlayer(false, pos, 0);
} }
catch (...) { catch (...)
{
CHud::SetHelpMessage("Invalid location", false, false, false); CHud::SetHelpMessage("Invalid location", false, false, false);
} }
} }
@ -285,8 +312,6 @@ void Menu::ProcessCommands()
} }
else else
CHud::SetHelpMessage("Invalid command", false, false, false); CHud::SetHelpMessage("Invalid command", false, false, false);
return;
} }
} }
@ -299,37 +324,37 @@ void Menu::Draw()
ImGui::Spacing(); ImGui::Spacing();
ImGui::Spacing(); ImGui::Spacing();
ImGui::SameLine(); ImGui::SameLine();
if (Ui::ListBox("Overlay", overlay::posNames, overlay::mSelectedPos)) if (Ui::ListBox("Overlay", m_Overlay.posNames, (int&)m_Overlay.mSelectedPos))
config.SetValue("overlay.mSelectedPos", overlay::mSelectedPos); config.SetValue("overlay.mSelectedPos", m_Overlay.mSelectedPos);
ImGui::Spacing(); ImGui::Spacing();
ImGui::Columns(2, NULL, false); ImGui::Columns(2, nullptr, false);
if (ImGui::Checkbox("No background", &overlay::bTransparent)) if (ImGui::Checkbox("No background", &m_Overlay.bTransparent))
config.SetValue("overlay.bTransparent", overlay::bTransparent); config.SetValue("overlay.bTransparent", m_Overlay.bTransparent);
if (ImGui::Checkbox("Show coordinates", &overlay::bCoord)) if (ImGui::Checkbox("Show coordinates", &m_Overlay.bCoord))
config.SetValue("overlay.bCoord", overlay::bCoord); config.SetValue("overlay.bCoord", m_Overlay.bCoord);
if (ImGui::Checkbox("Show CPU usage", &overlay::bCpuUsage)) if (ImGui::Checkbox("Show CPU usage", &m_Overlay.bCpuUsage))
config.SetValue("overlay.bCpuUsage", overlay::bCpuUsage); config.SetValue("overlay.bCpuUsage", m_Overlay.bCpuUsage);
if (ImGui::Checkbox("Show FPS", &overlay::bFPS)) if (ImGui::Checkbox("Show FPS", &m_Overlay.bFPS))
config.SetValue("overlay.bFPS", overlay::bFPS); config.SetValue("overlay.bFPS", m_Overlay.bFPS);
ImGui::NextColumn(); ImGui::NextColumn();
if (ImGui::Checkbox("Show location", &overlay::bLocName)) if (ImGui::Checkbox("Show location", &m_Overlay.bLocName))
config.SetValue("overlay.bLocName", overlay::bLocName); config.SetValue("overlay.bLocName", m_Overlay.bLocName);
if (ImGui::Checkbox("Show RAM usage", &overlay::bMemUsage)) if (ImGui::Checkbox("Show RAM usage", &m_Overlay.bMemUsage))
config.SetValue("overlay.bMemUsage", overlay::bMemUsage); config.SetValue("overlay.bMemUsage", m_Overlay.bMemUsage);
if (ImGui::Checkbox("Show veh health", &overlay::bVehHealth)) if (ImGui::Checkbox("Show veh health", &m_Overlay.bVehHealth))
config.SetValue("overlay.bVehHealth", overlay::bVehHealth); config.SetValue("overlay.bVehHealth", m_Overlay.bVehHealth);
if (ImGui::Checkbox("Show veh speed", &overlay::bVehSpeed)) if (ImGui::Checkbox("Show veh speed", &m_Overlay.bVehSpeed))
config.SetValue("overlay.bVehSpeed", overlay::bVehSpeed); config.SetValue("overlay.bVehSpeed", m_Overlay.bVehSpeed);
ImGui::Columns(1); ImGui::Columns(1);
@ -340,79 +365,79 @@ void Menu::Draw()
ImGui::Spacing(); ImGui::Spacing();
ImGui::Text("Usage"); ImGui::Text("Usage");
Ui::ShowTooltip("Left-click selects hotkey.\nLeft clicking outside deselects." Ui::ShowTooltip("Left-click selects hotkey.\nLeft clicking outside deselects."
"\nRight click disables hotkey."); "\nRight click disables hotkey.");
ImGui::Spacing(); ImGui::Spacing();
ImGui::BeginChild("Hotkeys"); ImGui::BeginChild("Hotkeys");
if (Ui::HotKey("Open/ close cheat menu", hotkeys::menu_open)) if (Ui::HotKey("Open/ close cheat menu", m_HotKeys.menuOpen))
{ {
config.SetValue("hotkey.menu_open.key1", hotkeys::menu_open.key1); config.SetValue("hotkey.menu_open.key1", m_HotKeys.menuOpen.m_key1);
config.SetValue("hotkey.menu_open.key2", hotkeys::menu_open.key2); config.SetValue("hotkey.menu_open.key2", m_HotKeys.menuOpen.m_key2);
} }
if (Ui::HotKey("Open/ close command window", hotkeys::command_window)) if (Ui::HotKey("Open/ close command window", m_HotKeys.commandWindow))
{ {
config.SetValue("hotkey.command_window.key1", hotkeys::command_window.key1); config.SetValue("hotkey.command_window.key1", m_HotKeys.commandWindow.m_key1);
config.SetValue("hotkey.command_window.key2", hotkeys::command_window.key2); config.SetValue("hotkey.command_window.key2", m_HotKeys.commandWindow.m_key2);
} }
ImGui::Dummy(ImVec2(0, 10)); ImGui::Dummy(ImVec2(0, 10));
if (Ui::HotKey("Activate aim skin changer", hotkeys::aim_skin_changer)) if (Ui::HotKey("Activate aim skin changer", m_HotKeys.aimSkinChanger))
{ {
config.SetValue("hotkey.aim_skin_changer.key1", hotkeys::aim_skin_changer.key1); config.SetValue("hotkey.aim_skin_changer.key1", m_HotKeys.aimSkinChanger.m_key1);
config.SetValue("hotkey.aim_skin_changer.key2", hotkeys::aim_skin_changer.key2); config.SetValue("hotkey.aim_skin_changer.key2", m_HotKeys.aimSkinChanger.m_key2);
} }
if (Ui::HotKey("Freecam", hotkeys::freecam)) if (Ui::HotKey("Freecam", m_HotKeys.freeCam))
{ {
config.SetValue("hotkey.freecam.key1", hotkeys::freecam.key1); config.SetValue("hotkey.freecam.key1", m_HotKeys.freeCam.m_key1);
config.SetValue("hotkey.freecam.key2", hotkeys::freecam.key2); config.SetValue("hotkey.freecam.key2", m_HotKeys.freeCam.m_key2);
} }
if (Ui::HotKey("Take quick screenshot", hotkeys::quick_ss)) if (Ui::HotKey("Take quick screenshot", m_HotKeys.quickSceenShot))
{ {
config.SetValue("hotkey.quick_screenshot.key1", hotkeys::quick_ss.key1); config.SetValue("hotkey.quick_screenshot.key1", m_HotKeys.quickSceenShot.m_key1);
config.SetValue("hotkey.quick_screenshot.key2", hotkeys::quick_ss.key2); config.SetValue("hotkey.quick_screenshot.key2", m_HotKeys.quickSceenShot.m_key2);
} }
if (Ui::HotKey("Toggle quick teleport", hotkeys::quick_tp)) if (Ui::HotKey("Toggle quick teleport", m_HotKeys.quickTeleport))
{ {
config.SetValue("hotkey.quick_tp.key1", hotkeys::quick_tp.key1); config.SetValue("hotkey.quick_tp.key1", m_HotKeys.quickTeleport.m_key1);
config.SetValue("hotkey.quick_tp.key2", hotkeys::quick_tp.key2); config.SetValue("hotkey.quick_tp.key2", m_HotKeys.quickTeleport.m_key2);
} }
ImGui::Dummy(ImVec2(0, 10)); ImGui::Dummy(ImVec2(0, 10));
if (Ui::HotKey("Fix current vehicle", hotkeys::fix_veh)) if (Ui::HotKey("Fix current vehicle", m_HotKeys.fixVeh))
{ {
config.SetValue("hotkey.fix_veh.key1", hotkeys::fix_veh.key1); config.SetValue("hotkey.fix_veh.key1", m_HotKeys.fixVeh.m_key1);
config.SetValue("hotkey.fix_veh.key2", hotkeys::fix_veh.key2); config.SetValue("hotkey.fix_veh.key2", m_HotKeys.fixVeh.m_key2);
} }
if (Ui::HotKey("Flip current vehicle", hotkeys::flip_veh)) if (Ui::HotKey("Flip current vehicle", m_HotKeys.flipVeh))
{ {
config.SetValue("hotkey.flip_veh.key1", hotkeys::flip_veh.key1); config.SetValue("hotkey.flip_veh.key1", m_HotKeys.flipVeh.m_key1);
config.SetValue("hotkey.flip_veh.key2", hotkeys::flip_veh.key2); config.SetValue("hotkey.flip_veh.key2", m_HotKeys.flipVeh.m_key2);
} }
if (Ui::HotKey("Toggle god mode", hotkeys::god_mode)) if (Ui::HotKey("Toggle god mode", m_HotKeys.godMode))
{ {
config.SetValue("hotkey.god_mode.key1", hotkeys::god_mode.key1); config.SetValue("hotkey.god_mode.key1", m_HotKeys.godMode.m_key1);
config.SetValue("hotkey.god_mode.key2", hotkeys::god_mode.key2); config.SetValue("hotkey.god_mode.key2", m_HotKeys.godMode.m_key2);
} }
if (Ui::HotKey("Toggle veh engine", hotkeys::veh_engine)) if (Ui::HotKey("Toggle veh engine", m_HotKeys.vehEngine))
{ {
config.SetValue("hotkey.veh_engine.key1", hotkeys::veh_engine.key1); config.SetValue("hotkey.veh_engine.key1", m_HotKeys.vehEngine.m_key1);
config.SetValue("hotkey.veh_engine.key2", hotkeys::veh_engine.key2); config.SetValue("hotkey.veh_engine.key2", m_HotKeys.vehEngine.m_key2);
} }
if (Ui::HotKey("Vehicle instant start", hotkeys::veh_instant_start)) if (Ui::HotKey("Vehicle instant start", m_HotKeys.vehInstantStart))
{ {
config.SetValue("hotkey.veh_instant_start.key1", hotkeys::veh_instant_start.key1); config.SetValue("hotkey.veh_instant_start.key1", m_HotKeys.vehInstantStart.m_key1);
config.SetValue("hotkey.veh_instant_start.key2", hotkeys::veh_instant_start.key2); config.SetValue("hotkey.veh_instant_start.key2", m_HotKeys.vehInstantStart.m_key2);
} }
if (Ui::HotKey("Vehicle instant stop", hotkeys::veh_instant_stop)) if (Ui::HotKey("Vehicle instant stop", m_HotKeys.vehInstantStop))
{ {
config.SetValue("hotkey.veh_instant_stop.key1", hotkeys::veh_instant_stop.key1); config.SetValue("hotkey.veh_instant_stop.key1", m_HotKeys.vehInstantStop.m_key1);
config.SetValue("hotkey.veh_instant_stop.key2", hotkeys::veh_instant_stop.key2); config.SetValue("hotkey.veh_instant_stop.key2", m_HotKeys.vehInstantStop.m_key2);
} }
ImGui::Dummy(ImVec2(0, 10)); ImGui::Dummy(ImVec2(0, 10));
@ -424,7 +449,10 @@ void Menu::Draw()
{ {
if (ImGui::BeginChild("CommandsChild")) if (ImGui::BeginChild("CommandsChild"))
{ {
ImGui::TextWrapped(std::string("Open or close command window using " + Ui::GetHotKeyNameString(hotkeys::command_window)).c_str()); ImGui::TextWrapped(
std::string(
"Open or close command window using " + Ui::GetHotKeyNameString(m_HotKeys.commandWindow)).
c_str());
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::CollapsingHeader("Set health")) if (ImGui::CollapsingHeader("Set health"))
{ {
@ -465,26 +493,26 @@ void Menu::Draw()
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::Button("Check update", ImVec2(Ui::GetSize(3)))) if (ImGui::Button("Check update", ImVec2(Ui::GetSize(3))))
{ {
if (Updater::state == UPDATER_IDLE) if (Updater::m_State == UPDATER_IDLE)
Updater::state = UPDATER_CHECKING; Updater::m_State = UPDATER_CHECKING;
} }
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Discord server", ImVec2(Ui::GetSize(3)))) if (ImGui::Button("Discord server", ImVec2(Ui::GetSize(3))))
ShellExecute(NULL, "open", DISCORD_INVITE, NULL, NULL, SW_SHOWNORMAL); ShellExecute(nullptr, "open", DISCORD_INVITE, nullptr, nullptr, SW_SHOWNORMAL);
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("GitHub repo", ImVec2(Ui::GetSize(3)))) if (ImGui::Button("GitHub repo", ImVec2(Ui::GetSize(3))))
ShellExecute(NULL, "open", GITHUB_LINK, NULL, NULL, SW_SHOWNORMAL); ShellExecute(nullptr, "open", GITHUB_LINK, nullptr, nullptr, SW_SHOWNORMAL);
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::BeginChild("AboutChild")) if (ImGui::BeginChild("AboutChild"))
{ {
ImGui::Columns(2, NULL, false); ImGui::Columns(2, nullptr, false);
ImGui::Text("Author: Grinch_"); ImGui::Text("Author: Grinch_");
ImGui::Text("Version: %s",MENU_VERSION); ImGui::Text("Version: %s",MENU_VERSION);
@ -509,4 +537,4 @@ void Menu::Draw()
} }
ImGui::EndTabBar(); ImGui::EndTabBar();
} }
} }

View File

@ -3,7 +3,17 @@
class Menu class Menu
{ {
private: private:
struct overlay
enum DISPLAY_POS
{
CUSTOM,
TOP_LEFT,
TOP_RIGHT,
BOTTOM_LEFT,
BOTTOM_RIGHT
};
static struct
{ {
inline static bool bCoord = false; inline static bool bCoord = false;
inline static bool bFPS = false; inline static bool bFPS = false;
@ -16,36 +26,40 @@ private:
inline static float fCpuUsage = 0.0f; inline static float fCpuUsage = 0.0f;
inline static bool bMemUsage = false; inline static bool bMemUsage = false;
inline static float fMemUsage = 0.0f; inline static float fMemUsage = 0.0f;
inline static std::vector<std::string> posNames = { "Custom", "Top left", "Top right", "Bottom left", "Bottom right" }; inline static std::vector<std::string> posNames = {
inline static int mSelectedPos = 4; // TODO: Create Enum "Custom", "Top left", "Top right", "Bottom left", "Bottom right"
};
inline static DISPLAY_POS mSelectedPos = DISPLAY_POS::BOTTOM_RIGHT;
inline static float fPosX = 0.0f; inline static float fPosX = 0.0f;
inline static float fPosY = 0.0f; inline static float fPosY = 0.0f;
inline static size_t mInterval = 1000; inline static size_t mInterval = 1000;
inline static size_t mLastInterval = 0; inline static size_t mLastInterval = 0;
inline static int mTotalRam = 0; inline static int mTotalRam = 0;
}; } m_Overlay;
public: public:
struct hotkeys static struct
{ {
inline static HotKeyData aim_skin_changer; inline static HotKeyData aimSkinChanger;
inline static HotKeyData freecam; inline static HotKeyData freeCam;
inline static HotKeyData command_window; inline static HotKeyData commandWindow;
inline static HotKeyData fix_veh; inline static HotKeyData fixVeh;
inline static HotKeyData flip_veh; inline static HotKeyData flipVeh;
inline static HotKeyData free_cam_tp_player{VK_RETURN,VK_RETURN}; inline static HotKeyData freeCamTeleportPlayer{VK_RETURN,VK_RETURN};
inline static HotKeyData god_mode; inline static HotKeyData godMode;
inline static HotKeyData menu_open; inline static HotKeyData menuOpen;
inline static HotKeyData quick_ss; inline static HotKeyData quickSceenShot;
inline static HotKeyData quick_tp; inline static HotKeyData quickTeleport;
inline static HotKeyData veh_engine; inline static HotKeyData vehEngine;
inline static HotKeyData veh_instant_start; inline static HotKeyData vehInstantStart;
inline static HotKeyData veh_instant_stop; inline static HotKeyData vehInstantStop;
}; } m_HotKeys;
struct commands
static struct
{ {
inline static bool show_menu = false; inline static bool m_bShowMenu = false;
inline static char input_buffer[INPUT_BUFFER_SIZE] = ""; inline static char m_nInputBuffer[INPUT_BUFFER_SIZE] = "";
}; } m_Commands;
Menu(); Menu();
static void Draw(); static void Draw();
@ -53,4 +67,3 @@ public:
static void DrawShortcutsWindow(); static void DrawShortcutsWindow();
static void ProcessCommands(); static void ProcessCommands();
}; };

View File

@ -3,4 +3,4 @@
#define MENU_VERSION_NUMBER "2.7" #define MENU_VERSION_NUMBER "2.7"
#define MENU_VERSION MENU_VERSION_NUMBER"-beta" #define MENU_VERSION MENU_VERSION_NUMBER"-beta"
#define BUILD_NUMBER "20210615" #define BUILD_NUMBER "20210615"
#define MENU_TITLE MENU_NAME " v" MENU_VERSION "(" BUILD_NUMBER ")" #define MENU_TITLE MENU_NAME " v" MENU_VERSION "(" BUILD_NUMBER ")"

View File

@ -1,10 +1,7 @@
#include "pch.h" #include "pch.h"
#include "Events.h" #include "Events.h"
namespace plugin namespace plugin::Events
{ {
namespace Events decltype(vehicleResetAfterRender) vehicleResetAfterRender;
{
decltype(vehicleResetAfterRender) vehicleResetAfterRender;
}
} }

View File

@ -1,9 +1,7 @@
#pragma once #pragma once
namespace plugin namespace plugin::Events
{ {
namespace Events extern ThiscallEvent<AddressList<0x55332A, H_CALL>, PRIORITY_BEFORE, ArgPickN<CVehicle*, 0>, void(CVehicle*)>
{ vehicleResetAfterRender;
extern ThiscallEvent<AddressList<0x55332A, H_CALL>, PRIORITY_BEFORE, ArgPickN<CVehicle*, 0>, void(CVehicle*)> vehicleResetAfterRender;
}
} }

View File

@ -2,33 +2,34 @@
#include "Neon.h" #include "Neon.h"
#include "Util.h" #include "Util.h"
void Neon::RenderEvent(CVehicle *pVeh) void Neon::RenderEvent(CVehicle* pVeh)
{ {
NeonData* data = &VehNeon.Get(pVeh); NeonData* data = &m_VehNeon.Get(pVeh);
if (data->neon_installed && !pVeh->IsUpsideDown()) if (data->m_bNeonInstalled && !pVeh->IsUpsideDown())
{ {
CVector Pos = CModelInfo::GetModelInfo(pVeh->m_nModelIndex)->m_pColModel->m_boundBox.m_vecMin; CVector Pos = CModelInfo::GetModelInfo(pVeh->m_nModelIndex)->m_pColModel->m_boundBox.m_vecMin;
CVector center = pVeh->TransformFromObjectSpace(CVector(0.0f, 0.0f, 0.0f)); CVector center = pVeh->TransformFromObjectSpace(CVector(0.0f, 0.0f, 0.0f));
CVector up = pVeh->TransformFromObjectSpace(CVector(0.0f, -Pos.y - data->val, 0.0f)) - center; CVector up = pVeh->TransformFromObjectSpace(CVector(0.0f, -Pos.y - data->m_fVal, 0.0f)) - center;
CVector right = pVeh->TransformFromObjectSpace(CVector(Pos.x + data->val, 0.0f, 0.0f)) - center; CVector right = pVeh->TransformFromObjectSpace(CVector(Pos.x + data->m_fVal, 0.0f, 0.0f)) - center;
CShadows::StoreShadowToBeRendered(5, neon_texture, &center, up.x, up.y, right.x, right.y, 180, data->color.r, data->color.g, data->color.b, 2.0f, false, 1.0f, 0, true); CShadows::StoreShadowToBeRendered(5, m_pNeonTexture, &center, up.x, up.y, right.x, right.y, 180, data->m_Color.r,
data->m_Color.g, data->m_Color.b, 2.0f, false, 1.0f, 0, true);
if (CTimer::m_snTimeInMilliseconds - data->timer > 150) if (CTimer::m_snTimeInMilliseconds - data->m_nTimer > 150)
{ {
data->timer = CTimer::m_snTimeInMilliseconds; data->m_nTimer = CTimer::m_snTimeInMilliseconds;
if (data->pulsing) if (data->m_bPulsing)
{ {
if (data->val < 0.0f) if (data->m_fVal < 0.0f)
data->increment = true; data->m_bIncrement = true;
if (data->val > 0.3f) if (data->m_fVal > 0.3f)
data->increment = false; data->m_bIncrement = false;
if (data->increment) if (data->m_bIncrement)
data->val += 0.1f; data->m_fVal += 0.1f;
else else
data->val -= 0.1f; data->m_fVal -= 0.1f;
} }
} }
} }
@ -38,58 +39,58 @@ Neon::Neon()
{ {
Events::processScriptsEvent += [this] Events::processScriptsEvent += [this]
{ {
if (!mask_loaded) if (!m_bMaskLoaded)
{ {
neon_texture = Util::LoadTextureFromPngFile(PLUGIN_PATH((char*)"CheatMenu\\vehicles\\neon_mask.png")); m_pNeonTexture = Util::LoadTextureFromPngFile(PLUGIN_PATH((char*)"CheatMenu\\vehicles\\neon_mask.png"));
if (!neon_texture) if (!m_pNeonTexture)
flog << "Failed to load neon mask" << std::endl; flog << "Failed to load neon mask" << std::endl;
mask_loaded = true; m_bMaskLoaded = true;
} }
}; };
Events::vehicleRenderEvent += RenderEvent; Events::vehicleRenderEvent += RenderEvent;
} }
Neon::~Neon() Neon::~Neon()
{ {
Events::vehicleRenderEvent -= RenderEvent; Events::vehicleRenderEvent -= RenderEvent;
if (neon_texture) if (m_pNeonTexture)
{ {
RwTextureDestroy(neon_texture); RwTextureDestroy(m_pNeonTexture);
neon_texture = nullptr; m_pNeonTexture = nullptr;
} }
} }
bool Neon::IsNeonInstalled(CVehicle* pVeh) bool Neon::IsNeonInstalled(CVehicle* pVeh)
{ {
return VehNeon.Get(pVeh).neon_installed; return m_VehNeon.Get(pVeh).m_bNeonInstalled;
} }
bool Neon::IsPulsingEnabled(CVehicle* pVeh) bool Neon::IsPulsingEnabled(CVehicle* pVeh)
{ {
return VehNeon.Get(pVeh).pulsing; return m_VehNeon.Get(pVeh).m_bPulsing;
} }
void Neon::SetPulsing(CVehicle* pVeh, bool state) void Neon::SetPulsing(CVehicle* pVeh, bool state)
{ {
VehNeon.Get(pVeh).pulsing = state; m_VehNeon.Get(pVeh).m_bPulsing = state;
} }
void Neon::InstallNeon(CVehicle* pVeh, int red, int green, int blue) void Neon::InstallNeon(CVehicle* pVeh, int red, int green, int blue)
{ {
CRGBA& color = VehNeon.Get(pVeh).color; CRGBA& color = m_VehNeon.Get(pVeh).m_Color;
color.r = red; color.r = red;
color.g = green; color.g = green;
color.b = blue; color.b = blue;
color.a = 255; color.a = 255;
VehNeon.Get(pVeh).neon_installed = true; m_VehNeon.Get(pVeh).m_bNeonInstalled = true;
} }
void Neon::RemoveNeon(CVehicle* pVeh) void Neon::RemoveNeon(CVehicle* pVeh)
{ {
VehNeon.Get(pVeh).neon_installed = false; m_VehNeon.Get(pVeh).m_bNeonInstalled = false;
} }

View File

@ -1,30 +1,31 @@
#pragma once #pragma once
#include "extender\VehicleExtender.h" #include "extender/VehicleExtender.h"
class Neon class Neon
{ {
private: private:
class NeonData { class NeonData
{
public: public:
CRGBA color; CRGBA m_Color;
bool neon_installed; bool m_bNeonInstalled;
float val; float m_fVal;
uint timer; uint m_nTimer;
bool increment; bool m_bIncrement;
bool pulsing; bool m_bPulsing;
NeonData(CVehicle* pVeh) NeonData(CVehicle* pVeh)
{ {
neon_installed = false; m_bNeonInstalled = false;
val = 0.0; m_fVal = 0.0;
timer = 0; m_nTimer = 0;
increment = true; m_bIncrement = true;
} }
}; };
inline static bool mask_loaded = false; inline static bool m_bMaskLoaded = false;
inline static RwTexture* neon_texture = nullptr; inline static RwTexture* m_pNeonTexture = nullptr;
inline static VehicleExtendedData<NeonData> VehNeon; inline static VehicleExtendedData<NeonData> m_VehNeon;
public: public:
Neon(); Neon();
@ -36,4 +37,3 @@ public:
static void RemoveNeon(CVehicle* veh); static void RemoveNeon(CVehicle* veh);
static void RenderEvent(CVehicle* veh); static void RenderEvent(CVehicle* veh);
}; };

View File

@ -30,7 +30,7 @@
void Paint::RenderEvent(CVehicle* pVeh) void Paint::RenderEvent(CVehicle* pVeh)
{ {
VehData& data = vehdata.Get(pVeh); VehData& data = m_VehData.Get(pVeh);
// reset custom color if color id changed // reset custom color if color id changed
if (pVeh->m_nPrimaryColor != data.primary_color if (pVeh->m_nPrimaryColor != data.primary_color
@ -70,7 +70,7 @@ void Paint::RenderEvent(CVehicle* pVeh)
void Paint::ResetAfterRenderEvent(CVehicle* pVeh) void Paint::ResetAfterRenderEvent(CVehicle* pVeh)
{ {
for (auto& it : vehdata.Get(pVeh).materialProperties) for (auto& it : m_VehData.Get(pVeh).materialProperties)
{ {
if (it.second._recolor) if (it.second._recolor)
{ {
@ -88,17 +88,17 @@ Paint::Paint()
{ {
Events::processScriptsEvent += [this] Events::processScriptsEvent += [this]
{ {
if (!images_loaded) if (!m_bImagesLoaded)
{ {
for (auto& p : fs::recursive_directory_iterator(PLUGIN_PATH((char*)"\\CheatMenu\\vehicles\\paintjobs\\"))) for (auto& p : fs::recursive_directory_iterator(PLUGIN_PATH((char*)"\\CheatMenu\\vehicles\\paintjobs\\")))
{ {
if (p.path().extension() == ".png") if (p.path().extension() == ".png")
{ {
std::string file_name = p.path().stem().string(); std::string file_name = p.path().stem().string();
textures[file_name] = std::make_shared<RwTexture>(*(Util::LoadTextureFromPngFile(p.path()))); m_Textures[file_name] = std::make_shared<RwTexture>(*(Util::LoadTextureFromPngFile(p.path())));
} }
} }
images_loaded = true; m_bImagesLoaded = true;
} }
}; };
@ -143,7 +143,7 @@ void Paint::VehData::resetMaterialColor(RpMaterial* material)
{ {
auto& matProps = materialProperties[material]; auto& matProps = materialProperties[material];
matProps._recolor = false; matProps._recolor = false;
matProps._color = { 0, 0, 0, 0 }; matProps._color = {0, 0, 0, 0};
} }
void Paint::VehData::resetMaterialTexture(RpMaterial* material) void Paint::VehData::resetMaterialTexture(RpMaterial* material)
@ -199,7 +199,8 @@ void Paint::SetNodeColor(CVehicle* pVeh, std::string node_name, CRGBA color, boo
if (node_name == "Default" || node_name == name) if (node_name == "Default" || node_name == name)
{ {
RwFrameForAllObjects(frame, [](RwObject* object, void* data) -> RwObject* { RwFrameForAllObjects(frame, [](RwObject* object, void* data) -> RwObject*
{
if (object->type == rpATOMIC) if (object->type == rpATOMIC)
{ {
RpAtomic* atomic = reinterpret_cast<RpAtomic*>(object); RpAtomic* atomic = reinterpret_cast<RpAtomic*>(object);
@ -208,10 +209,11 @@ void Paint::SetNodeColor(CVehicle* pVeh, std::string node_name, CRGBA color, boo
CRGBA* color = &st->_color; CRGBA* color = &st->_color;
bool filter_mat = st->_filter; bool filter_mat = st->_filter;
VehData& data = vehdata.Get(FindPlayerPed()->m_pVehicle); VehData& data = m_VehData.Get(FindPlayerPed()->m_pVehicle);
for (int i = 0; i < atomic->geometry->matList.numMaterials; ++i) for (int i = 0; i < atomic->geometry->matList.numMaterials; ++i)
data.setMaterialColor(atomic->geometry->matList.materials[i], atomic->geometry, { color->r,color->g,color->b, 255 }, filter_mat); data.setMaterialColor(atomic->geometry->matList.materials[i], atomic->geometry,
{color->r, color->g, color->b, 255}, filter_mat);
} }
return object; return object;
}, &st); }, &st);
@ -234,23 +236,24 @@ void Paint::SetNodeTexture(CVehicle* pVeh, std::string node_name, std::string te
bool _filter; bool _filter;
} st; } st;
st._textures = textures; st._textures = m_Textures;
st._texturename = texturename; st._texturename = texturename;
st._filter = filter_mat; st._filter = filter_mat;
if (node_name == "Default" || node_name == name) if (node_name == "Default" || node_name == name)
{ {
RwFrameForAllObjects(frame, [](RwObject* object, void* data) -> RwObject* { RwFrameForAllObjects(frame, [](RwObject* object, void* data) -> RwObject*
{
if (object->type == rpATOMIC) if (object->type == rpATOMIC)
{ {
RpAtomic* atomic = reinterpret_cast<RpAtomic*>(object); RpAtomic* atomic = reinterpret_cast<RpAtomic*>(object);
ST* st = reinterpret_cast<ST*>(data); ST* st = reinterpret_cast<ST*>(data);
VehData& data = vehdata.Get(FindPlayerPed()->m_pVehicle); VehData& data = m_VehData.Get(FindPlayerPed()->m_pVehicle);
for (int i = 0; i < atomic->geometry->matList.numMaterials; ++i) for (int i = 0; i < atomic->geometry->matList.numMaterials; ++i)
data.setMaterialTexture(atomic->geometry->matList.materials[i], st->_textures[st->_texturename], st->_filter); data.setMaterialTexture(atomic->geometry->matList.materials[i], st->_textures[st->_texturename],
st->_filter);
} }
return object; return object;
}, &st); }, &st);
@ -268,11 +271,12 @@ void Paint::ResetNodeColor(CVehicle* pVeh, std::string node_name)
if (node_name == "Default" || node_name == name) if (node_name == "Default" || node_name == name)
{ {
RwFrameForAllObjects(frame, [](RwObject* object, void* data) -> RwObject* { RwFrameForAllObjects(frame, [](RwObject* object, void* data) -> RwObject*
{
if (object->type == rpATOMIC) if (object->type == rpATOMIC)
{ {
RpAtomic* atomic = reinterpret_cast<RpAtomic*>(object); RpAtomic* atomic = reinterpret_cast<RpAtomic*>(object);
VehData& data = vehdata.Get(FindPlayerPed()->m_pVehicle); VehData& data = m_VehData.Get(FindPlayerPed()->m_pVehicle);
for (int i = 0; i < atomic->geometry->matList.numMaterials; ++i) for (int i = 0; i < atomic->geometry->matList.numMaterials; ++i)
data.resetMaterialColor(atomic->geometry->matList.materials[i]); data.resetMaterialColor(atomic->geometry->matList.materials[i]);
@ -293,13 +297,13 @@ void Paint::ResetNodeTexture(CVehicle* pVeh, std::string node_name)
if (node_name == "Default" || node_name == name) if (node_name == "Default" || node_name == name)
{ {
RwFrameForAllObjects(frame, [](RwObject* object, void* data) -> RwObject* { RwFrameForAllObjects(frame, [](RwObject* object, void* data) -> RwObject*
{
if (object->type == rpATOMIC) if (object->type == rpATOMIC)
{ {
RpAtomic* atomic = reinterpret_cast<RpAtomic*>(object); RpAtomic* atomic = reinterpret_cast<RpAtomic*>(object);
VehData& data = vehdata.Get(FindPlayerPed()->m_pVehicle); VehData& data = m_VehData.Get(FindPlayerPed()->m_pVehicle);
for (int i = 0; i < atomic->geometry->matList.numMaterials; ++i) for (int i = 0; i < atomic->geometry->matList.numMaterials; ++i)
data.resetMaterialTexture(atomic->geometry->matList.materials[i]); data.resetMaterialTexture(atomic->geometry->matList.materials[i]);
@ -308,4 +312,4 @@ void Paint::ResetNodeTexture(CVehicle* pVeh, std::string node_name)
}, nullptr); }, nullptr);
} }
}); });
} }

View File

@ -27,22 +27,20 @@
class Paint class Paint
{ {
private: private:
// store vehicle specific data // store vehicle specific data
struct VehData struct VehData
{ {
struct MaterialProperties struct MaterialProperties
{ {
MaterialProperties() : MaterialProperties() :
_color{ 0, 0, 0, 0 }, _color{0, 0, 0, 0},
_recolor(false), _recolor(false),
_retexture(false), _retexture(false),
_originalColor{ 0, 0, 0, 0 }, _geometry(nullptr),
_originalColor{0, 0, 0, 0},
_originalTexture(nullptr), _originalTexture(nullptr),
_originalGeometryFlags(0), _originalGeometryFlags(0)
_geometry(nullptr)
{ {
} }
@ -73,15 +71,15 @@ private:
void resetMaterialTexture(RpMaterial* material); void resetMaterialTexture(RpMaterial* material);
}; };
inline static bool images_loaded = false; inline static bool m_bImagesLoaded = false;
inline static VehicleExtendedData<VehData> vehdata; inline static VehicleExtendedData<VehData> m_VehData;
protected: protected:
inline static std::map<std::string, std::shared_ptr<RwTexture>> m_Textures;
inline static std::map<std::string, std::shared_ptr<RwTexture>> textures;
struct veh_nodes struct veh_nodes
{ {
inline static std::vector<std::string> names_vec{ "Default" }; inline static std::vector<std::string> names_vec{"Default"};
inline static std::string selected = "Default"; inline static std::string selected = "Default";
}; };
@ -96,4 +94,3 @@ protected:
static void RenderEvent(CVehicle* pVeh); static void RenderEvent(CVehicle* pVeh);
static void ResetAfterRenderEvent(CVehicle* pVeh); static void ResetAfterRenderEvent(CVehicle* pVeh);
}; };

View File

@ -6,22 +6,23 @@
Ped::Ped() Ped::Ped()
{ {
if (GetModuleHandle("ExGangWars.asi")) if (GetModuleHandle("ExGangWars.asi"))
exgangwars_installed = true; m_bExGangWarsInstalled = true;
Events::processScriptsEvent += [] Events::processScriptsEvent += []
{ {
if (!images_loaded) if (!m_bImagesLoaded)
{ {
Util::LoadTexturesInDirRecursive(PLUGIN_PATH((char*)"CheatMenu\\peds\\"), ".jpg", ped_data.categories, ped_data.images); Util::LoadTexturesInDirRecursive(
images_loaded = true; PLUGIN_PATH((char*)"CheatMenu\\peds\\"), ".jpg", m_PedData.m_Categories, m_PedData.m_ImagesList);
m_bImagesLoaded = true;
} }
}; };
} }
Ped::~Ped() Ped::~Ped()
{ {
Util::ReleaseTextures(ped_data.images); Util::ReleaseTextures(m_PedData.m_ImagesList);
for (CPed* ped : spawn_ped::list) for (CPed* ped : m_SpawnPed.m_List)
{ {
CWorld::Remove(ped); CWorld::Remove(ped);
ped->Remove(); ped->Remove();
@ -30,13 +31,13 @@ Ped::~Ped()
void Ped::SpawnPed(std::string& model) void Ped::SpawnPed(std::string& model)
{ {
if (spawn_ped::list.size() == SPAWN_PED_LIMIT) if (m_SpawnPed.m_List.size() == SPAWN_PED_LIMIT)
{ {
CHud::SetHelpMessage("Max limit reached", false, false, false); CHud::SetHelpMessage("Max limit reached", false, false, false);
return; return;
} }
if (Ped::ped_data.json.data.contains(model)) if (m_PedData.m_Json.m_Data.contains(model))
{ {
CPlayerPed* player = FindPlayerPed(); CPlayerPed* player = FindPlayerPed();
CVector pos = player->GetPosition(); CVector pos = player->GetPosition();
@ -45,49 +46,49 @@ void Ped::SpawnPed(std::string& model)
CPed* ped; CPed* ped;
int hplayer; int hplayer;
if (Ped::pedspecial_json.data.contains(model)) if (m_SpecialPedJson.m_Data.contains(model))
{ {
std::string name; std::string name;
if (Ped::pedspecial_json.data.contains(model)) if (m_SpecialPedJson.m_Data.contains(model))
name = Ped::pedspecial_json.data[model].get<std::string>().c_str(); name = m_SpecialPedJson.m_Data[model].get<std::string>().c_str();
else else
name = model; name = model;
CStreaming::RequestSpecialChar(1, name.c_str(), PRIORITY_REQUEST); CStreaming::RequestSpecialChar(1, name.c_str(), PRIORITY_REQUEST);
CStreaming::LoadAllRequestedModels(true); CStreaming::LoadAllRequestedModels(true);
Command <Commands::CREATE_CHAR>(spawn_ped::selected_ped_type + 4, 291, pos.x, pos.y, pos.z + 1, &hplayer); Command<Commands::CREATE_CHAR>(m_SpawnPed.m_nSelectedPedType + 4, 291, pos.x, pos.y, pos.z + 1, &hplayer);
CStreaming::SetSpecialCharIsDeletable(291); CStreaming::SetSpecialCharIsDeletable(291);
} }
else else
{ {
int imodel = std::stoi(model); int iModel = std::stoi(model);
CStreaming::RequestModel(imodel, eStreamingFlags::PRIORITY_REQUEST); CStreaming::RequestModel(iModel, eStreamingFlags::PRIORITY_REQUEST);
CStreaming::LoadAllRequestedModels(false); CStreaming::LoadAllRequestedModels(false);
Command <Commands::CREATE_CHAR>(spawn_ped::selected_ped_type + 4, imodel, pos.x, pos.y, pos.z + 1, &hplayer); Command<Commands::CREATE_CHAR>(m_SpawnPed.m_nSelectedPedType + 4, iModel, pos.x, pos.y, pos.z + 1, &hplayer);
CStreaming::SetModelIsDeletable(imodel); CStreaming::SetModelIsDeletable(iModel);
} }
ped = CPools::GetPed(hplayer); ped = CPools::GetPed(hplayer);
if (spawn_ped::dont_move) if (m_SpawnPed.m_bPedMove)
spawn_ped::list.push_back(ped); m_SpawnPed.m_List.push_back(ped);
else else
{ {
Command<Commands::MARK_CHAR_AS_NO_LONGER_NEEDED>(hplayer); Command<Commands::MARK_CHAR_AS_NO_LONGER_NEEDED>(hplayer);
} }
ped->m_nPedFlags.bPedIsBleeding = spawn_ped::ped_bleed; ped->m_nPedFlags.bPedIsBleeding = m_SpawnPed.m_bPedBleed;
ped->m_nWeaponAccuracy = spawn_ped::accuracy; ped->m_nWeaponAccuracy = m_SpawnPed.m_nAccuracy;
ped->m_fHealth = spawn_ped::health; ped->m_fHealth = m_SpawnPed.m_nPedHealth;
if (spawn_ped::weapon_id != 0) if (m_SpawnPed.m_nWeaponId != 0)
{ {
int model = 0; int model = 0;
Command<Commands::GET_WEAPONTYPE_MODEL>(spawn_ped::weapon_id, &model); Command<Commands::GET_WEAPONTYPE_MODEL>(m_SpawnPed.m_nWeaponId, &model);
CStreaming::RequestModel(model, PRIORITY_REQUEST); CStreaming::RequestModel(model, PRIORITY_REQUEST);
CStreaming::LoadAllRequestedModels(false); CStreaming::LoadAllRequestedModels(false);
Command<Commands::GIVE_WEAPON_TO_CHAR>(hplayer, spawn_ped::weapon_id, 999); Command<Commands::GIVE_WEAPON_TO_CHAR>(hplayer, m_SpawnPed.m_nWeaponId, 999);
} }
} }
} }
@ -151,12 +152,12 @@ void Ped::Draw()
CZone szone = CZone(); CZone szone = CZone();
CZone* pZone = &szone; CZone* pZone = &szone;
CZoneExtraInfo* zone_info = CTheZones::GetZoneInfo(&pos, &pZone); CZoneExtraInfo* zoneInfo = CTheZones::GetZoneInfo(&pos, &pZone);
int density = zone_info->m_nGangDensity[i]; int density = zoneInfo->m_nGangDensity[i];
if (ImGui::SliderInt(Ped::gang_names[i].c_str(), &density, 0, 127)) if (ImGui::SliderInt(m_GangNames[i].c_str(), &density, 0, 127))
{ {
zone_info->m_nGangDensity[i] = static_cast<char>(density); zoneInfo->m_nGangDensity[i] = static_cast<char>(density);
Command<Commands::CLEAR_SPECIFIC_ZONES_TO_TRIGGER_GANG_WAR>(); Command<Commands::CLEAR_SPECIFIC_ZONES_TO_TRIGGER_GANG_WAR>();
CGangWars::bGangWarsActive = true; CGangWars::bGangWarsActive = true;
} }
@ -164,12 +165,13 @@ void Ped::Draw()
ImGui::PopItemWidth(); ImGui::PopItemWidth();
ImGui::Spacing(); ImGui::Spacing();
if (!exgangwars_installed) if (!m_bExGangWarsInstalled)
{ {
ImGui::TextWrapped("You'll need ExGangWars plugin to display some turf colors"); ImGui::TextWrapped("You'll need ExGangWars plugin to display some turf colors");
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::Button("Download ExGangWars", Ui::GetSize(1))) if (ImGui::Button("Download ExGangWars", Ui::GetSize(1)))
ShellExecute(NULL, "open", "https://gtaforums.com/topic/682194-extended-gang-wars/", NULL, NULL, SW_SHOWNORMAL); ShellExecute(NULL, "open", "https://gtaforums.com/topic/682194-extended-gang-wars/", NULL, NULL,
SW_SHOWNORMAL);
} }
ImGui::Spacing(); ImGui::Spacing();
@ -180,22 +182,24 @@ void Ped::Draw()
if (ImGui::CollapsingHeader("Recruit anyone")) if (ImGui::CollapsingHeader("Recruit anyone"))
{ {
static std::vector<Ui::NamedMemory> select_weapon{ {"9mm", 0x96917C}, { "AK47", 0x96917D }, { "Rockets", 0x96917E } }; static std::vector<Ui::NamedMemory> selectWeapon{
Ui::RadioButtonAddress("Select weapon", select_weapon); {"9mm", 0x96917C}, {"AK47", 0x96917D}, {"Rockets", 0x96917E}
};
Ui::RadioButtonAddress("Select weapon", selectWeapon);
ImGui::Spacing(); ImGui::Spacing();
ImGui::Separator(); ImGui::Separator();
} }
if (ImGui::CollapsingHeader("Remove peds in radius")) if (ImGui::CollapsingHeader("Remove peds in radius"))
{ {
ImGui::InputInt("Radius", &ped_remove_radius); ImGui::InputInt("Radius", &m_nPedRemoveRadius);
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::Button("Remove peds", Ui::GetSize(1))) if (ImGui::Button("Remove peds", Ui::GetSize(1)))
{ {
CPlayerPed* player = FindPlayerPed(); CPlayerPed* player = FindPlayerPed();
for (CPed* ped : CPools::ms_pPedPool) for (CPed* ped : CPools::ms_pPedPool)
{ {
if (DistanceBetweenPoints(ped->GetPosition(), player->GetPosition()) < ped_remove_radius if (DistanceBetweenPoints(ped->GetPosition(), player->GetPosition()) < m_nPedRemoveRadius
&& ped->m_pVehicle == nullptr && ped != player) && ped->m_pVehicle == nullptr && ped != player)
Command<Commands::DELETE_CHAR>(CPools::GetPedRef(ped)); Command<Commands::DELETE_CHAR>(CPools::GetPedRef(ped));
} }
} }
@ -210,12 +214,12 @@ void Ped::Draw()
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::Button("Remove frozen peds", Ui::GetSize(1))) if (ImGui::Button("Remove frozen peds", Ui::GetSize(1)))
{ {
for (CPed* ped : spawn_ped::list) for (CPed* ped : m_SpawnPed.m_List)
{ {
CWorld::Remove(ped); CWorld::Remove(ped);
ped->Remove(); ped->Remove();
} }
spawn_ped::list.clear(); m_SpawnPed.m_List.clear();
} }
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::BeginTabBar("SpawnPedBar")) if (ImGui::BeginTabBar("SpawnPedBar"))
@ -226,8 +230,9 @@ void Ped::Draw()
{ {
ImGui::Spacing(); ImGui::Spacing();
Ui::DrawImages(ped_data.images, ImVec2(65, 110), ped_data.categories, ped_data.selected, ped_data.filter, SpawnPed, nullptr, Ui::DrawImages(m_PedData.m_ImagesList, ImVec2(65, 110), m_PedData.m_Categories, m_PedData.m_Selected,
[](std::string str) {return ped_data.json.data[str].get<std::string>(); }); m_PedData.m_Filter, SpawnPed, nullptr,
[](std::string str) { return m_PedData.m_Json.m_Data[str].get<std::string>(); });
ImGui::EndTabItem(); ImGui::EndTabItem();
} }
if (ImGui::BeginTabItem("Config")) if (ImGui::BeginTabItem("Config"))
@ -235,31 +240,36 @@ void Ped::Draw()
ImGui::Spacing(); ImGui::Spacing();
ImGui::BeginChild("PedCOnfig"); ImGui::BeginChild("PedCOnfig");
ImGui::Columns(2, 0, false); ImGui::Columns(2, 0, false);
Ui::CheckboxWithHint("Don't move", &spawn_ped::dont_move); Ui::CheckboxWithHint("Don't move", &m_SpawnPed.m_bPedMove);
ImGui::NextColumn(); ImGui::NextColumn();
Ui::CheckboxWithHint("Ped bleed", &spawn_ped::ped_bleed); Ui::CheckboxWithHint("Ped bleed", &m_SpawnPed.m_bPedBleed);
ImGui::Columns(1); ImGui::Columns(1);
ImGui::Spacing(); ImGui::Spacing();
ImGui::SliderInt("Accuracy", &spawn_ped::accuracy, 0.0, 100.0); ImGui::SliderInt("Accuracy", &m_SpawnPed.m_nAccuracy, 0.0, 100.0);
if (ImGui::InputInt("Health", &spawn_ped::health)) if (ImGui::InputInt("Health", &m_SpawnPed.m_nPedHealth))
{ {
if (spawn_ped::health > 1000) if (m_SpawnPed.m_nPedHealth > 1000)
spawn_ped::health = 1000; m_SpawnPed.m_nPedHealth = 1000;
if (spawn_ped::health < 0) if (m_SpawnPed.m_nPedHealth < 0)
spawn_ped::health = 0; m_SpawnPed.m_nPedHealth = 0;
} }
Ui::ListBox("Ped type", spawn_ped::ped_type, spawn_ped::selected_ped_type); Ui::ListBox("Ped type", m_SpawnPed.m_PedTypeList, m_SpawnPed.m_nSelectedPedType);
ImGui::Spacing(); ImGui::Spacing();
ImGui::Text("Selected weapon: %s", Weapon::weapon_data.json.data[std::to_string(spawn_ped::weapon_id)].get<std::string>()); ImGui::Text("Selected weapon: %s",
Weapon::m_WeaponData.m_Json.m_Data[std::to_string(m_SpawnPed.m_nWeaponId)].get<std::string>());
ImGui::Spacing(); ImGui::Spacing();
Ui::DrawImages(Weapon::weapon_data.images, ImVec2(65, 65), Weapon::weapon_data.categories, Weapon::weapon_data.selected, Weapon::weapon_data.filter, Ui::DrawImages(Weapon::m_WeaponData.m_ImagesList, ImVec2(65, 65), Weapon::m_WeaponData.m_Categories,
[](std::string str) { spawn_ped::weapon_id = std::stoi(str); }, Weapon::m_WeaponData.m_Selected, Weapon::m_WeaponData.m_Filter,
nullptr, [](std::string str) { m_SpawnPed.m_nWeaponId = std::stoi(str); },
[](std::string str) {return Weapon::weapon_data.json.data[str].get<std::string>(); }, nullptr,
[](std::string str) {return str != "-1"; /*Jetpack*/ } [](std::string str)
{
return Weapon::m_WeaponData.m_Json.m_Data[str].get<std::string>();
},
[](std::string str) { return str != "-1"; /*Jetpack*/ }
); );
ImGui::Spacing(); ImGui::Spacing();
@ -273,4 +283,3 @@ void Ped::Draw()
ImGui::EndTabBar(); ImGui::EndTabBar();
} }
} }

View File

@ -5,33 +5,31 @@
class Ped class Ped
{ {
private: private:
inline static SearchData ped_data{ "ped" }; inline static SSearchData m_PedData{"ped"};
inline static CJson pedspecial_json = CJson("ped special"); inline static CJson m_SpecialPedJson = CJson("ped special");
inline static bool images_loaded = false; inline static bool m_bImagesLoaded;
inline static bool m_bExGangWarsInstalled;
inline static std::vector<std::string> gang_names = inline static int m_nPedRemoveRadius = 5;
static struct
{
inline static std::vector<CPed*> m_List;
inline static int m_nAccuracy = 50;
inline static int m_nPedHealth = 100;
inline static bool m_bPedMove;
inline static bool m_bPedBleed;
inline static int m_nSelectedPedType;
inline static int m_nWeaponId;
inline static std::vector<std::string> m_PedTypeList =
{
"Civ male", "Civ female", "Cop", "Ballas", "Grove Street Families", "Los Santos Vagos",
"San Fierro Rifa", "Da Nang Boys", "Mafia", "Mountain Cloud Triads", "Varrio Los Aztecas",
"Gang 9", "Medic", "Dealer", "Criminal", "Fireman", "Prostitute"
};
} m_SpawnPed;
inline static std::vector<std::string> m_GangNames =
{ {
"Ballas", "Grove street families", "Los santos vagos", "San fierro rifa", "Ballas", "Grove street families", "Los santos vagos", "San fierro rifa",
"Da nang boys", "Mafia", "Mountain cloud triad", "Varrio los aztecas", "Gang9", "Gang10" "Da nang boys", "Mafia", "Mountain cloud triad", "Varrio los aztecas", "Gang9", "Gang10"
};
inline static bool exgangwars_installed = false;
inline static int ped_remove_radius = 5;
struct spawn_ped
{
inline static std::vector<CPed*> list;
inline static int accuracy = 50;
inline static int health = 100;
inline static bool dont_move = false;
inline static bool ped_bleed = false;
inline static std::vector<std::string> ped_type =
{
"Civ male","Civ female","Cop","Ballas","Grove Street Families","Los Santos Vagos",
"San Fierro Rifa","Da Nang Boys","Mafia","Mountain Cloud Triads","Varrio Los Aztecas",
"Gang 9","Medic","Dealer","Criminal","Fireman","Prostitute"
};
inline static int selected_ped_type;
inline static int weapon_id = 0;
}; };
friend class Player; friend class Player;
@ -42,4 +40,3 @@ public:
static void Draw(); static void Draw();
static void SpawnPed(std::string& model); static void SpawnPed(std::string& model);
}; };

View File

@ -7,10 +7,10 @@
inline static void PlayerModelBrokenFix() inline static void PlayerModelBrokenFix()
{ {
CPlayerPed* player = FindPlayerPed(); CPlayerPed* pPlayer = FindPlayerPed();
if (player->m_nModelIndex == 0) if (pPlayer->m_nModelIndex == 0)
Call<0x5A81E0>(0, player->m_pPlayerData->m_pPedClothesDesc, 0xBC1C78, false); Call<0x5A81E0>(0, pPlayer->m_pPlayerData->m_pPedClothesDesc, 0xBC1C78, false);
} }
Player::Player() Player::Player()
@ -18,29 +18,29 @@ Player::Player()
// Fix player model being broken after rebuild // Fix player model being broken after rebuild
patch::RedirectCall(0x5A834D, &PlayerModelBrokenFix); patch::RedirectCall(0x5A834D, &PlayerModelBrokenFix);
aim_skin_changer = config.GetValue("aim_skin_changer", false); m_bAimSkinChanger = config.GetValue("aim_skin_changer", false);
// Custom skins setup // Custom skins setup
if (GetModuleHandle("modloader.asi")) if (GetModuleHandle("modloader.asi"))
{ {
if (fs::is_directory(custom_skins::dir)) if (fs::is_directory(m_CustomSkins.m_Path))
{ {
for (auto& p : fs::recursive_directory_iterator(custom_skins::dir)) for (auto& p : fs::recursive_directory_iterator(m_CustomSkins.m_Path))
{ {
if (p.path().extension() == ".dff") if (p.path().extension() == ".dff")
{ {
std::string file_name = p.path().stem().string(); std::string file_name = p.path().stem().string();
if (file_name.size() < 9) if (file_name.size() < 9)
custom_skins::store_vec.push_back(file_name); m_CustomSkins.m_List.push_back(file_name);
else else
flog << "Custom Skin longer than 8 characters " << file_name << std::endl; flog << "Custom Skin longer than 8 characters " << file_name << std::endl;
} }
} }
} }
else fs::create_directory(custom_skins::dir); else fs::create_directory(m_CustomSkins.m_Path);
modloader_installed = true; m_bModloaderInstalled = true;
} }
Events::processScriptsEvent += [] Events::processScriptsEvent += []
@ -48,32 +48,33 @@ Player::Player()
uint timer = CTimer::m_snTimeInMilliseconds; uint timer = CTimer::m_snTimeInMilliseconds;
static CPlayerPed* player = FindPlayerPed(); static CPlayerPed* player = FindPlayerPed();
if (!images_loaded) if (!m_bImagesLoaded)
{ {
Util::LoadTexturesInDirRecursive(PLUGIN_PATH((char*)"CheatMenu\\clothes\\"), ".jpg", cloth_data.categories, cloth_data.images); Util::LoadTexturesInDirRecursive(
images_loaded = true; PLUGIN_PATH((char*)"CheatMenu\\clothes\\"), ".jpg", m_ClothData.m_Categories, m_ClothData.m_ImagesList);
m_bImagesLoaded = true;
} }
if (keep_position::state) if (m_KeepPosition.m_bEnabled)
{ {
if (!player->IsAlive()) if (!player->IsAlive())
{ {
keep_position::pos = player->GetPosition(); m_KeepPosition.m_fPos = player->GetPosition();
} }
else else
{ {
CVector cur_pos = player->GetPosition(); CVector cur_pos = player->GetPosition();
if (keep_position::pos.x != 0 && keep_position::pos.x != cur_pos.x if (m_KeepPosition.m_fPos.x != 0 && m_KeepPosition.m_fPos.x != cur_pos.x
&& keep_position::pos.y != 0 && keep_position::pos.y != cur_pos.y) && m_KeepPosition.m_fPos.y != 0 && m_KeepPosition.m_fPos.y != cur_pos.y)
{ {
player->Teleport(keep_position::pos, false); player->Teleport(m_KeepPosition.m_fPos, false);
keep_position::pos = CVector(0, 0, 0); m_KeepPosition.m_fPos = CVector(0, 0, 0);
} }
} }
} }
if (god_mode) if (m_bGodMode)
{ {
patch::Set<bool>(0x96916D, 1, false); patch::Set<bool>(0x96916D, 1, false);
player->m_nPhysicalFlags.bBulletProof = 1; player->m_nPhysicalFlags.bBulletProof = 1;
@ -83,7 +84,7 @@ Player::Player()
player->m_nPhysicalFlags.bMeeleProof = 1; player->m_nPhysicalFlags.bMeeleProof = 1;
} }
if (aim_skin_changer && Ui::HotKeyPressed(Menu::hotkeys::aim_skin_changer)) if (m_bAimSkinChanger && Ui::HotKeyPressed(Menu::m_HotKeys.aimSkinChanger))
{ {
CPed* target_ped = player->m_pPlayerTargettedPed; CPed* target_ped = player->m_pPlayerTargettedPed;
if (target_ped) if (target_ped)
@ -93,24 +94,24 @@ Player::Player()
} }
} }
if (Ui::HotKeyPressed(Menu::hotkeys::god_mode)) if (Ui::HotKeyPressed(Menu::m_HotKeys.godMode))
{ {
if (god_mode) if (m_bGodMode)
{ {
CHud::SetHelpMessage("God mode disabled", false, false, false); CHud::SetHelpMessage("God mode disabled", false, false, false);
patch::Set<bool>(0x96916D, god_mode, false); patch::Set<bool>(0x96916D, m_bGodMode, false);
player->m_nPhysicalFlags.bBulletProof = false; player->m_nPhysicalFlags.bBulletProof = false;
player->m_nPhysicalFlags.bCollisionProof = false; player->m_nPhysicalFlags.bCollisionProof = false;
player->m_nPhysicalFlags.bExplosionProof = false; player->m_nPhysicalFlags.bExplosionProof = false;
player->m_nPhysicalFlags.bFireProof = false; player->m_nPhysicalFlags.bFireProof = false;
player->m_nPhysicalFlags.bMeeleProof = false; player->m_nPhysicalFlags.bMeeleProof = false;
god_mode = false; m_bGodMode = false;
} }
else else
{ {
CHud::SetHelpMessage("God mode enabled", false, false, false); CHud::SetHelpMessage("God mode enabled", false, false, false);
god_mode = true; m_bGodMode = true;
} }
} }
}; };
@ -118,7 +119,7 @@ Player::Player()
Player::~Player() Player::~Player()
{ {
Util::ReleaseTextures(cloth_data.images); Util::ReleaseTextures(m_ClothData.m_ImagesList);
} }
void Player::ChangePlayerCloth(std::string& name) void Player::ChangePlayerCloth(std::string& name)
@ -152,7 +153,8 @@ void Player::ChangePlayerCloth(std::string& name)
if (texture9 == "12myfac") if (texture9 == "12myfac")
player->m_pPlayerData->m_pPedClothesDesc->SetTextureAndModel(-1750049245, 1393983095, body_part); player->m_pPlayerData->m_pPedClothesDesc->SetTextureAndModel(-1750049245, 1393983095, body_part);
else else
player->m_pPlayerData->m_pPedClothesDesc->SetTextureAndModel(texture9.c_str(), model.c_str(), body_part); player->m_pPlayerData->m_pPedClothesDesc->
SetTextureAndModel(texture9.c_str(), model.c_str(), body_part);
} }
} }
CClothes::RebuildPlayer(player, false); CClothes::RebuildPlayer(player, false);
@ -160,15 +162,16 @@ void Player::ChangePlayerCloth(std::string& name)
void Player::ChangePlayerModel(std::string& model) void Player::ChangePlayerModel(std::string& model)
{ {
bool custom_skin = std::find(custom_skins::store_vec.begin(), custom_skins::store_vec.end(), model) != custom_skins::store_vec.end(); bool custom_skin = std::find(m_CustomSkins.m_List.begin(), m_CustomSkins.m_List.end(), model) !=
if (Ped::ped_data.json.data.contains(model) || custom_skin) m_CustomSkins.m_List.end();
if (Ped::m_PedData.m_Json.m_Data.contains(model) || custom_skin)
{ {
CPlayerPed* player = FindPlayerPed(); CPlayerPed* player = FindPlayerPed();
if (Ped::pedspecial_json.data.contains(model) || custom_skin) if (Ped::m_SpecialPedJson.m_Data.contains(model) || custom_skin)
{ {
std::string name; std::string name;
if (Ped::pedspecial_json.data.contains(model)) if (Ped::m_SpecialPedJson.m_Data.contains(model))
name = Ped::pedspecial_json.data[model].get<std::string>().c_str(); name = Ped::m_SpecialPedJson.m_Data[model].get<std::string>().c_str();
else else
name = model; name = model;
@ -193,13 +196,13 @@ void Player::ChangePlayerModel(std::string& model)
void Player::Draw() void Player::Draw()
{ {
CPlayerPed* player = FindPlayerPed(); CPlayerPed* pPlayer = FindPlayerPed();
int hplayer = CPools::GetPedRef(player); int hplayer = CPools::GetPedRef(pPlayer);
CPad* pad = player->GetPadFromPlayer(); CPad* pad = pPlayer->GetPadFromPlayer();
if (ImGui::Button("Copy coordinates", ImVec2(Ui::GetSize(2)))) if (ImGui::Button("Copy coordinates", ImVec2(Ui::GetSize(2))))
{ {
CVector pos = player->GetPosition(); CVector pos = pPlayer->GetPosition();
std::string text = std::to_string(pos.x) + ", " + std::to_string(pos.y) + ", " + std::to_string(pos.z); std::string text = std::to_string(pos.x) + ", " + std::to_string(pos.y) + ", " + std::to_string(pos.z);
ImGui::SetClipboardText(text.c_str()); ImGui::SetClipboardText(text.c_str());
@ -207,7 +210,7 @@ void Player::Draw()
} }
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Suicide", ImVec2(Ui::GetSize(2)))) if (ImGui::Button("Suicide", ImVec2(Ui::GetSize(2))))
player->m_fHealth = 0.0; pPlayer->m_fHealth = 0.0;
ImGui::Spacing(); ImGui::Spacing();
@ -222,25 +225,25 @@ void Player::Draw()
ImGui::Columns(2, 0, false); ImGui::Columns(2, 0, false);
Ui::CheckboxAddress("Bounty on yourself", 0x96913F); Ui::CheckboxAddress("Bounty on yourself", 0x96913F);
if (Ui::CheckboxWithHint("God mode", &god_mode)) if (Ui::CheckboxWithHint("God mode", &m_bGodMode))
{ {
patch::Set<bool>(0x96916D, god_mode, false); patch::Set<bool>(0x96916D, m_bGodMode, false);
player->m_nPhysicalFlags.bBulletProof = god_mode; pPlayer->m_nPhysicalFlags.bBulletProof = m_bGodMode;
player->m_nPhysicalFlags.bCollisionProof = god_mode; pPlayer->m_nPhysicalFlags.bCollisionProof = m_bGodMode;
player->m_nPhysicalFlags.bExplosionProof = god_mode; pPlayer->m_nPhysicalFlags.bExplosionProof = m_bGodMode;
player->m_nPhysicalFlags.bFireProof = god_mode; pPlayer->m_nPhysicalFlags.bFireProof = m_bGodMode;
player->m_nPhysicalFlags.bMeeleProof = god_mode; pPlayer->m_nPhysicalFlags.bMeeleProof = m_bGodMode;
} }
Ui::CheckboxAddress("Higher cycle jumps", 0x969161); Ui::CheckboxAddress("Higher cycle jumps", 0x969161);
Ui::CheckboxAddress("Infinite oxygen", 0x96916E); Ui::CheckboxAddress("Infinite oxygen", 0x96916E);
Ui::CheckboxAddress("Infinite run", 0xB7CEE4); Ui::CheckboxAddress("Infinite run", 0xB7CEE4);
if (Ui::CheckboxBitFlag("Invisible player", player->m_nPedFlags.bDontRender)) if (Ui::CheckboxBitFlag("Invisible player", pPlayer->m_nPedFlags.bDontRender))
player->m_nPedFlags.bDontRender = (player->m_nPedFlags.bDontRender == 1) ? 0 : 1; pPlayer->m_nPedFlags.bDontRender = (pPlayer->m_nPedFlags.bDontRender == 1) ? 0 : 1;
ImGui::NextColumn(); ImGui::NextColumn();
Ui::CheckboxWithHint("Keep position", &keep_position::state, "Teleport to the position you died from"); Ui::CheckboxWithHint("Keep position", &m_KeepPosition.m_bEnabled, "Teleport to the position you died from");
if (Ui::CheckboxBitFlag("Lock control", pad->bPlayerSafe)) if (Ui::CheckboxBitFlag("Lock control", pad->bPlayerSafe))
pad->bPlayerSafe = (pad->bPlayerSafe == 1) ? 0 : 1; pad->bPlayerSafe = (pad->bPlayerSafe == 1) ? 0 : 1;
@ -262,23 +265,23 @@ void Player::Draw()
{ {
ImGui::BeginChild("PlayerMenus"); ImGui::BeginChild("PlayerMenus");
Ui::EditReference("Armour", player->m_fArmour, 0, 100, 150); Ui::EditReference("Armour", pPlayer->m_fArmour, 0, 100, 150);
if (ImGui::CollapsingHeader("Body")) if (ImGui::CollapsingHeader("Body"))
{ {
if (player->m_nModelIndex == 0) if (pPlayer->m_nModelIndex == 0)
{ {
ImGui::Columns(3, 0, false); ImGui::Columns(3, 0, false);
if (ImGui::RadioButton("Fat", &body, 2)) if (ImGui::RadioButton("Fat", &m_nUiBodyState, 2))
CCheat::FatCheat(); CCheat::FatCheat();
ImGui::NextColumn(); ImGui::NextColumn();
if (ImGui::RadioButton("Muscle", &body, 1)) if (ImGui::RadioButton("Muscle", &m_nUiBodyState, 1))
CCheat::MuscleCheat(); CCheat::MuscleCheat();
ImGui::NextColumn(); ImGui::NextColumn();
if (ImGui::RadioButton("Skinny", &body, 0)) if (ImGui::RadioButton("Skinny", &m_nUiBodyState, 0))
CCheat::SkinnyCheat(); CCheat::SkinnyCheat();
ImGui::Columns(1); ImGui::Columns(1);
@ -290,8 +293,8 @@ void Player::Draw()
if (ImGui::Button("Change to CJ skin", ImVec2(Ui::GetSize(1)))) if (ImGui::Button("Change to CJ skin", ImVec2(Ui::GetSize(1))))
{ {
player->SetModelIndex(0); pPlayer->SetModelIndex(0);
Util::ClearCharTasksVehCheck(player); Util::ClearCharTasksVehCheck(pPlayer);
} }
} }
ImGui::Spacing(); ImGui::Spacing();
@ -300,7 +303,7 @@ void Player::Draw()
Ui::EditStat("Energy", STAT_ENERGY); Ui::EditStat("Energy", STAT_ENERGY);
Ui::EditStat("Fat", STAT_FAT); Ui::EditStat("Fat", STAT_FAT);
Ui::EditReference("Health", player->m_fHealth, 0, 100, static_cast<int>(player->m_fMaxHealth)); Ui::EditReference("Health", pPlayer->m_fHealth, 0, 100, static_cast<int>(pPlayer->m_fMaxHealth));
Ui::EditStat("Lung capacity", STAT_LUNG_CAPACITY); Ui::EditStat("Lung capacity", STAT_LUNG_CAPACITY);
Ui::EditStat("Max health", STAT_MAX_HEALTH, 0, 569, 1450); Ui::EditStat("Max health", STAT_MAX_HEALTH, 0, 569, 1450);
Ui::EditAddress<int>("Money", 0xB7CE50, -99999999, 0, 99999999); Ui::EditAddress<int>("Money", 0xB7CE50, -99999999, 0, 99999999);
@ -309,8 +312,8 @@ void Player::Draw()
Ui::EditStat("Stamina", STAT_STAMINA); Ui::EditStat("Stamina", STAT_STAMINA);
if (ImGui::CollapsingHeader("Wanted level")) if (ImGui::CollapsingHeader("Wanted level"))
{ {
int val = player->m_pPlayerData->m_pWanted->m_nWantedLevel; int val = pPlayer->m_pPlayerData->m_pWanted->m_nWantedLevel;
int max_wl = player->m_pPlayerData->m_pWanted->MaximumWantedLevel; int max_wl = pPlayer->m_pPlayerData->m_pWanted->MaximumWantedLevel;
ImGui::Columns(3, 0, false); ImGui::Columns(3, 0, false);
ImGui::Text("Min: 0"); ImGui::Text("Min: 0");
@ -323,21 +326,21 @@ void Player::Draw()
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::InputInt("Set value##Wanted level", &val)) if (ImGui::InputInt("Set value##Wanted level", &val))
player->CheatWantedLevel(val); pPlayer->CheatWantedLevel(val);
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::Button("Minimum##Wanted level", Ui::GetSize(3))) if (ImGui::Button("Minimum##Wanted level", Ui::GetSize(3)))
player->CheatWantedLevel(0); pPlayer->CheatWantedLevel(0);
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Default##Wanted level", Ui::GetSize(3))) if (ImGui::Button("Default##Wanted level", Ui::GetSize(3)))
player->CheatWantedLevel(0); pPlayer->CheatWantedLevel(0);
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Maximum##Wanted level", Ui::GetSize(3))) if (ImGui::Button("Maximum##Wanted level", Ui::GetSize(3)))
player->CheatWantedLevel(max_wl); pPlayer->CheatWantedLevel(max_wl);
ImGui::Spacing(); ImGui::Spacing();
ImGui::Separator(); ImGui::Separator();
@ -350,8 +353,10 @@ void Player::Draw()
if (ImGui::BeginTabItem("Appearance")) if (ImGui::BeginTabItem("Appearance"))
{ {
ImGui::Spacing(); ImGui::Spacing();
if (Ui::CheckboxWithHint("Aim skin changer", &aim_skin_changer, (("Activate using Aim ped + ") + Ui::GetHotKeyNameString(Menu::hotkeys::aim_skin_changer)).c_str())) if (Ui::CheckboxWithHint("Aim skin changer", &m_bAimSkinChanger,
config.SetValue("aim_skin_changer", aim_skin_changer); (("Activate using Aim ped + ") + Ui::GetHotKeyNameString(
Menu::m_HotKeys.aimSkinChanger)).c_str()))
config.SetValue("aim_skin_changer", m_bAimSkinChanger);
if (ImGui::BeginTabBar("AppearanceTabBar")) if (ImGui::BeginTabBar("AppearanceTabBar"))
{ {
@ -359,7 +364,7 @@ void Player::Draw()
{ {
ImGui::Spacing(); ImGui::Spacing();
if (player->m_nModelIndex == 0) if (pPlayer->m_nModelIndex == 0)
{ {
if (ImGui::Button("Remove clothes", ImVec2(Ui::GetSize()))) if (ImGui::Button("Remove clothes", ImVec2(Ui::GetSize())))
{ {
@ -373,17 +378,18 @@ void Player::Draw()
} }
ImGui::Spacing(); ImGui::Spacing();
Ui::DrawImages(cloth_data.images, ImVec2(70, 100), cloth_data.categories, cloth_data.selected, cloth_data.filter, ChangePlayerCloth, nullptr, Ui::DrawImages(m_ClothData.m_ImagesList, ImVec2(70, 100), m_ClothData.m_Categories, m_ClothData.m_Selected,
[](std::string str) m_ClothData.m_Filter, ChangePlayerCloth, nullptr,
{ [](std::string str)
std::stringstream ss(str); {
std::string temp; std::stringstream ss(str);
std::string temp;
getline(ss, temp, '$'); getline(ss, temp, '$');
getline(ss, temp, '$'); getline(ss, temp, '$');
return temp; return temp;
}); });
} }
else else
{ {
@ -392,32 +398,36 @@ void Player::Draw()
if (ImGui::Button("Change to CJ skin", ImVec2(Ui::GetSize(1)))) if (ImGui::Button("Change to CJ skin", ImVec2(Ui::GetSize(1))))
{ {
player->SetModelIndex(0); pPlayer->SetModelIndex(0);
Util::ClearCharTasksVehCheck(player); Util::ClearCharTasksVehCheck(pPlayer);
} }
} }
ImGui::EndTabItem(); ImGui::EndTabItem();
} }
if (ImGui::BeginTabItem("Ped skins")) if (ImGui::BeginTabItem("Ped skins"))
{ {
Ui::DrawImages(Ped::ped_data.images, ImVec2(65, 110), Ped::ped_data.categories, Ped::ped_data.selected, Ped::ped_data.filter, ChangePlayerModel, nullptr, Ui::DrawImages(Ped::m_PedData.m_ImagesList, ImVec2(65, 110), Ped::m_PedData.m_Categories,
[](std::string str) {return Ped::ped_data.json.data[str].get<std::string>(); }); Ped::m_PedData.m_Selected, Ped::m_PedData.m_Filter, ChangePlayerModel, nullptr,
[](std::string str) { return Ped::m_PedData.m_Json.m_Data[str].get<std::string>(); });
ImGui::EndTabItem(); ImGui::EndTabItem();
} }
if (ImGui::BeginTabItem("Custom skins")) if (ImGui::BeginTabItem("Custom skins"))
{ {
ImGui::Spacing(); ImGui::Spacing();
if (modloader_installed) if (m_bModloaderInstalled)
{ {
Ui::FilterWithHint("Search", cloth_data.filter, std::string("Total skins: " + std::to_string(custom_skins::store_vec.size())).c_str()); Ui::FilterWithHint("Search", m_ClothData.m_Filter,
std::string("Total skins: " + std::to_string(m_CustomSkins.m_List.size()))
.c_str());
Ui::ShowTooltip("Place your dff & txd files inside 'modloader/Custom Skins'"); Ui::ShowTooltip("Place your dff & txd files inside 'modloader/Custom Skins'");
ImGui::Spacing(); ImGui::Spacing();
ImGui::TextWrapped("Note: Your txd & dff names can't exceed 8 characters. Don't change names while the game is running."); ImGui::TextWrapped(
"Note: Your txd & dff names can't exceed 8 characters. Don't change names while the game is running.");
ImGui::Spacing(); ImGui::Spacing();
for (std::string name : custom_skins::store_vec) for (std::string name : m_CustomSkins.m_List)
{ {
if (custom_skins::filter.PassFilter(name.c_str())) if (m_CustomSkins.m_Filter.PassFilter(name.c_str()))
{ {
if (ImGui::MenuItem(name.c_str())) if (ImGui::MenuItem(name.c_str()))
{ {
@ -428,7 +438,8 @@ void Player::Draw()
} }
else else
{ {
ImGui::TextWrapped("Custom skin allows to change player skins without replacing any existing game ped skins.\n\ ImGui::TextWrapped(
"Custom skin allows to change player skins without replacing any existing game ped skins.\n\
Steps to enable 'Custom Skins',\n\n\ Steps to enable 'Custom Skins',\n\n\
1. Download & install modloader\n\ 1. Download & install modloader\n\
2. Create a folder inside 'modloader' folder with the name 'Custom Skins'\n\ 2. Create a folder inside 'modloader' folder with the name 'Custom Skins'\n\
@ -440,7 +451,8 @@ Limitations:\n\
\nDoing so will crash your game."); \nDoing so will crash your game.");
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::Button("Download Modloader", ImVec2(Ui::GetSize(1)))) if (ImGui::Button("Download Modloader", ImVec2(Ui::GetSize(1))))
ShellExecute(NULL, "open", "https://gtaforums.com/topic/669520-mod-loader/", NULL, NULL, SW_SHOWNORMAL); ShellExecute(NULL, "open", "https://gtaforums.com/topic/669520-mod-loader/", NULL, NULL,
SW_SHOWNORMAL);
} }
ImGui::EndTabItem(); ImGui::EndTabItem();
} }

View File

@ -2,24 +2,23 @@
class Player class Player
{ {
private: private:
struct keep_position inline static bool m_bGodMode;
inline static int m_nUiBodyState;
inline static bool m_bAimSkinChanger;
inline static SSearchData m_ClothData;
inline static bool m_bImagesLoaded;
inline static bool m_bModloaderInstalled;
static struct
{ {
inline static bool state = false; inline static bool m_bEnabled = false;
inline static CVector pos; inline static CVector m_fPos;
}; } m_KeepPosition;
inline static bool god_mode = false; static struct
inline static int body = 0;
inline static bool aim_skin_changer = false;
inline static SearchData cloth_data;
inline static bool images_loaded = false;
struct custom_skins
{ {
inline static std::string dir = paths::GetGameDirPathA() + std::string("\\modloader\\Custom Skins\\");; inline static std::string m_Path = paths::GetGameDirPathA() + std::string("\\modloader\\Custom Skins\\");;
inline static ImGuiTextFilter filter = ""; inline static ImGuiTextFilter m_Filter;
inline static std::vector<std::string> store_vec; inline static std::vector<std::string> m_List;
}; } m_CustomSkins;
inline static bool modloader_installed = false;
public: public:
Player(); Player();
@ -28,4 +27,3 @@ public:
static void ChangePlayerModel(std::string& model); static void ChangePlayerModel(std::string& model);
static void Draw(); static void Draw();
}; };

View File

@ -5,7 +5,7 @@
#include "Util.h" #include "Util.h"
// FlA // FlA
tRadarTrace* CRadar::ms_RadarTrace = reinterpret_cast<tRadarTrace *>(patch::GetPointer(0x5838B0 + 2)); tRadarTrace* CRadar::ms_RadarTrace = reinterpret_cast<tRadarTrace*>(patch::GetPointer(0x5838B0 + 2));
void Teleport::FetchRadarSpriteData() void Teleport::FetchRadarSpriteData()
{ {
@ -16,17 +16,18 @@ void Teleport::FetchRadarSpriteData()
if (cur_timer - timer < 5000) if (cur_timer - timer < 5000)
return; return;
tp_data.json.data.erase("Radar"); tp_data.m_Json.m_Data.erase("Radar");
// 175 is the max number of sprites, FLA can increase this limit, might need to update this // 175 is the max number of sprites, FLA can increase this limit, might need to update this
for (int i = 0; i != 175; ++i) for (int i = 0; i != 175; ++i)
{ {
CVector pos = CRadar::ms_RadarTrace[i].m_vPosition; CVector pos = CRadar::ms_RadarTrace[i].m_vPosition;
uchar sprite = CRadar::ms_RadarTrace[i].m_nBlipSprite; uchar sprite = CRadar::ms_RadarTrace[i].m_nBlipSprite;
std::string sprite_name = sprite_name_json.data[std::to_string(sprite)].get<std::string>(); auto sprite_name = m_SpriteJson.m_Data[std::to_string(sprite)].get<std::string>();
std::string key_name = sprite_name + ", " + Util::GetLocationName(&pos); std::string key_name = sprite_name + ", " + Util::GetLocationName(&pos);
tp_data.json.data["Radar"][key_name] = "0, " + std::to_string(pos.x) + ", " + std::to_string(pos.y) + ", " + std::to_string(pos.z); tp_data.m_Json.m_Data["Radar"][key_name] = "0, " + std::to_string(pos.x) + ", " + std::to_string(pos.y) + ", " +
std::to_string(pos.z);
/* /*
"Radar" : { "Radar" : {
@ -38,36 +39,37 @@ void Teleport::FetchRadarSpriteData()
Teleport::Teleport() Teleport::Teleport()
{ {
tp_data.json.LoadData(tp_data.categories, tp_data.selected); tp_data.m_Json.LoadData(tp_data.m_Categories, tp_data.m_Selected);
quick_teleport = config.GetValue("quick_teleport", false); m_bQuickTeleport = config.GetValue("quick_teleport", false);
Events::processScriptsEvent += [] Events::processScriptsEvent += []
{ {
if ((STeleport::_bool == true) && ((CTimer::m_snTimeInMilliseconds - STeleport::timer) > 500)) if ((m_Teleport.m_bEnabled == true) && ((CTimer::m_snTimeInMilliseconds - m_Teleport.m_nTimer) > 500))
{ {
CPlayerPed *player = FindPlayerPed(); CPlayerPed* player = FindPlayerPed();
CEntity* player_entity = FindPlayerEntity(-1); CEntity* player_entity = FindPlayerEntity(-1);
STeleport::pos.z = CWorld::FindGroundZFor3DCoord(Teleport::STeleport::pos.x, Teleport::STeleport::pos.y, STeleport::pos.z + 100.0f, 0, &player_entity) + 1.0f; m_Teleport.m_fPos.z = CWorld::FindGroundZFor3DCoord(m_Teleport.m_fPos.x, m_Teleport.m_fPos.y,
CVehicle *pVeh = player->m_pVehicle; m_Teleport.m_fPos.z + 100.0f, nullptr, &player_entity) + 1.0f;
CVehicle* pVeh = player->m_pVehicle;
if (pVeh && player->m_nPedFlags.bInVehicle) if (pVeh && player->m_nPedFlags.bInVehicle)
pVeh->Teleport(STeleport::pos, false); pVeh->Teleport(m_Teleport.m_fPos, false);
else else
player->Teleport(STeleport::pos, false); player->Teleport(m_Teleport.m_fPos, false);
STeleport::_bool = false; m_Teleport.m_bEnabled = false;
Command<Commands::FREEZE_CHAR_POSITION_AND_DONT_LOAD_COLLISION>(CPools::GetPedRef(player), false); Command<Commands::FREEZE_CHAR_POSITION_AND_DONT_LOAD_COLLISION>(CPools::GetPedRef(player), false);
Command<Commands::RESTORE_CAMERA_JUMPCUT>(); Command<Commands::RESTORE_CAMERA_JUMPCUT>();
TheCamera.Fade(0,1); TheCamera.Fade(0, 1);
} }
if (quick_teleport) if (m_bQuickTeleport)
{ {
if (Ui::HotKeyPressed(Menu::hotkeys::quick_tp) if (Ui::HotKeyPressed(Menu::m_HotKeys.quickTeleport)
&& ((CTimer::m_snTimeInMilliseconds - quick_teleport_timer) > 500)) && ((CTimer::m_snTimeInMilliseconds - m_nQuickTeleportTimer) > 500))
{ {
quick_teleport_timer = CTimer::m_snTimeInMilliseconds; m_nQuickTeleportTimer = CTimer::m_snTimeInMilliseconds;
TeleportPlayer(true); TeleportPlayer(true);
} }
} }
@ -76,35 +78,34 @@ Teleport::Teleport()
void Teleport::TeleportPlayer(bool get_marker, CVector pos, short interior_id) void Teleport::TeleportPlayer(bool get_marker, CVector pos, short interior_id)
{ {
CPlayerPed *player = FindPlayerPed(); CPlayerPed* pPlayer = FindPlayerPed();
CVehicle *pVeh = player->m_pVehicle; CVehicle* pVeh = pPlayer->m_pVehicle;
if (get_marker) if (get_marker)
{ {
auto target_blip = CRadar::ms_RadarTrace[LOWORD(FrontEndMenuManager.m_nTargetBlipIndex)]; tRadarTrace targetBlip = CRadar::ms_RadarTrace[LOWORD(FrontEndMenuManager.m_nTargetBlipIndex)];
if (targetBlip.m_nBlipSprite != RADAR_SPRITE_WAYPOINT)
if (target_blip.m_nBlipSprite != RADAR_SPRITE_WAYPOINT)
{ {
CHud::SetHelpMessage("No blip found", false, false, false); CHud::SetHelpMessage("No blip found", false, false, false);
return; return;
} }
CEntity* player_entity = FindPlayerEntity(-1); CEntity* pPlayerEntity = FindPlayerEntity(-1);
pos = target_blip.m_vPosition; pos = targetBlip.m_vPosition;
pos.z = CWorld::FindGroundZFor3DCoord(pos.x, pos.y, 1000, 0, &player_entity) + 50.f; pos.z = CWorld::FindGroundZFor3DCoord(pos.x, pos.y, 1000, nullptr, &pPlayerEntity) + 50.f;
Teleport::STeleport::pos = pos; m_Teleport.m_fPos = pos;
Teleport::STeleport::timer = CTimer::m_snTimeInMilliseconds; m_Teleport.m_nTimer = CTimer::m_snTimeInMilliseconds;
Teleport::STeleport::_bool = true; m_Teleport.m_bEnabled = true;
TheCamera.Fade(0,0); TheCamera.Fade(0, 0);
Command<Commands::FREEZE_CHAR_POSITION_AND_DONT_LOAD_COLLISION>(CPools::GetPedRef(player), true); Command<Commands::FREEZE_CHAR_POSITION_AND_DONT_LOAD_COLLISION>(CPools::GetPedRef(pPlayer), true);
} }
CStreaming::LoadScene(&pos); CStreaming::LoadScene(&pos);
CStreaming::LoadSceneCollision(&pos); CStreaming::LoadSceneCollision(&pos);
CStreaming::LoadAllRequestedModels(false); CStreaming::LoadAllRequestedModels(false);
if (pVeh && player->m_nPedFlags.bInVehicle) if (pVeh && pPlayer->m_nPedFlags.bInVehicle)
{ {
pVeh->Teleport(pos, false); pVeh->Teleport(pos, false);
@ -112,19 +113,20 @@ void Teleport::TeleportPlayer(bool get_marker, CVector pos, short interior_id)
reinterpret_cast<CBike*>(pVeh)->PlaceOnRoadProperly(); reinterpret_cast<CBike*>(pVeh)->PlaceOnRoadProperly();
else if (pVeh->m_nVehicleClass != VEHICLE_BOAT) else if (pVeh->m_nVehicleClass != VEHICLE_BOAT)
reinterpret_cast<CAutomobile*>(pVeh)->PlaceOnRoadProperly(); reinterpret_cast<CAutomobile*>(pVeh)->PlaceOnRoadProperly();
pVeh->m_nAreaCode = interior_id; pVeh->m_nAreaCode = interior_id;
} }
else else
player->Teleport(pos, false); pPlayer->Teleport(pos, false);
player->m_nAreaCode = interior_id; pPlayer->m_nAreaCode = interior_id;
Command<Commands::SET_AREA_VISIBLE>(interior_id); Command<Commands::SET_AREA_VISIBLE>(interior_id);
} }
void Teleport::TeleportToLocation(std::string& rootkey, std::string& bLocName,std::string& loc) void Teleport::TeleportToLocation(std::string& rootkey, std::string& bLocName, std::string& loc)
{ {
try { try
{
int interior = 0; int interior = 0;
CVector pos; CVector pos;
std::stringstream ss(loc); std::stringstream ss(loc);
@ -142,9 +144,10 @@ void Teleport::TeleportToLocation(std::string& rootkey, std::string& bLocName,st
std::getline(ss, temp, ','); std::getline(ss, temp, ',');
pos.z = std::stof(temp); pos.z = std::stof(temp);
Teleport::TeleportPlayer(false, pos, static_cast<short>(interior)); TeleportPlayer(false, pos, static_cast<short>(interior));
} }
catch (...) { catch (...)
{
CHud::SetHelpMessage("Invalid location", false, false, false); CHud::SetHelpMessage("Invalid location", false, false, false);
} }
} }
@ -153,16 +156,16 @@ void Teleport::RemoveTeleportEntry(std::string& category, std::string& key, std:
{ {
if (category == "Custom") if (category == "Custom")
{ {
tp_data.json.data["Custom"].erase(key); tp_data.m_Json.m_Data["Custom"].erase(key);
CHud::SetHelpMessage("Location removed", false, false, false); CHud::SetHelpMessage("Location removed", false, false, false);
tp_data.json.WriteToDisk(); tp_data.m_Json.WriteToDisk();
} }
else CHud::SetHelpMessage("You can only remove custom location", false, false, false); else CHud::SetHelpMessage("You can only remove custom location", false, false, false);
} }
void Teleport::Draw() void Teleport::Draw()
{ {
if (ImGui::BeginTabBar("Teleport",ImGuiTabBarFlags_NoTooltip+ImGuiTabBarFlags_FittingPolicyScroll)) if (ImGui::BeginTabBar("Teleport", ImGuiTabBarFlags_NoTooltip + ImGuiTabBarFlags_FittingPolicyScroll))
{ {
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::BeginTabItem("Teleport")) if (ImGui::BeginTabItem("Teleport"))
@ -170,36 +173,40 @@ void Teleport::Draw()
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::BeginChild("Teleport Child")) if (ImGui::BeginChild("Teleport Child"))
{ {
ImGui::Columns(2, 0, false); ImGui::Columns(2, nullptr, false);
ImGui::Checkbox("Insert coordinates", &insert_coord); ImGui::Checkbox("Insert coordinates", &m_bInsertCoord);
ImGui::NextColumn(); ImGui::NextColumn();
if (Ui::CheckboxWithHint("Quick teleport", &quick_teleport, if (Ui::CheckboxWithHint("Quick teleport", &m_bQuickTeleport,
(std::string("Teleport to marker using ") + Ui::GetHotKeyNameString(Menu::hotkeys::quick_tp)).c_str())) (std::string("Teleport to marker using ") + Ui::GetHotKeyNameString(
Menu::m_HotKeys.quickTeleport)).c_str()))
{ {
config.SetValue("quick_teleport", quick_teleport); config.SetValue("quick_teleport", m_bQuickTeleport);
} }
ImGui::Columns(1); ImGui::Columns(1);
ImGui::Spacing(); ImGui::Spacing();
if (insert_coord) if (m_bInsertCoord)
{ {
CVector pos = FindPlayerPed()->GetPosition(); CVector pos = FindPlayerPed()->GetPosition();
strcpy(input_buffer,(std::to_string(int(pos.x)) + ", " + std::to_string(int(pos.y)) + ", " + std::to_string(int(pos.z))).c_str()); strcpy(m_nInputBuffer,
(std::to_string(static_cast<int>(pos.x)) + ", " + std::to_string(static_cast<int>(pos.y)) +
", " + std::to_string(static_cast<int>(pos.z))).c_str());
} }
ImGui::InputTextWithHint("Coordinates", "x, y, z", input_buffer, IM_ARRAYSIZE(input_buffer)); ImGui::InputTextWithHint("Coordinates", "x, y, z", m_nInputBuffer, IM_ARRAYSIZE(m_nInputBuffer));
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::Button("Teleport to bCoord", Ui::GetSize(2))) if (ImGui::Button("Teleport to bCoord", Ui::GetSize(2)))
{ {
std::stringstream ss(input_buffer); std::stringstream ss(m_nInputBuffer);
std::string temp; std::string temp;
CVector pos(0,0,0); CVector pos(0, 0, 0);
try { try
{
getline(ss, temp, ','); getline(ss, temp, ',');
pos.x = std::stof(temp); pos.x = std::stof(temp);
@ -209,15 +216,16 @@ void Teleport::Draw()
getline(ss, temp, ','); getline(ss, temp, ',');
pos.z = std::stof(temp) + 1.0f; pos.z = std::stof(temp) + 1.0f;
Teleport::TeleportPlayer(false,pos); TeleportPlayer(false, pos);
} }
catch (...) { catch (...)
{
CHud::SetHelpMessage("Invalid coordinate", false, false, false); CHud::SetHelpMessage("Invalid coordinate", false, false, false);
} }
} }
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Teleport to marker", Ui::GetSize(2))) if (ImGui::Button("Teleport to marker", Ui::GetSize(2)))
Teleport::TeleportPlayer(true); TeleportPlayer(true);
ImGui::EndChild(); ImGui::EndChild();
} }
@ -228,28 +236,29 @@ void Teleport::Draw()
{ {
FetchRadarSpriteData(); FetchRadarSpriteData();
ImGui::Spacing(); ImGui::Spacing();
Ui::DrawJSON(tp_data.json, tp_data.categories, tp_data.selected, tp_data.filter, &TeleportToLocation, &RemoveTeleportEntry); Ui::DrawJSON(tp_data.m_Json, tp_data.m_Categories, tp_data.m_Selected, tp_data.m_Filter, &TeleportToLocation,
&RemoveTeleportEntry);
ImGui::EndTabItem(); ImGui::EndTabItem();
} }
if (ImGui::BeginTabItem("Custom")) if (ImGui::BeginTabItem("Custom"))
{ {
ImGui::Spacing(); ImGui::Spacing();
ImGui::InputTextWithHint("Location", "Groove Street", location_buffer, IM_ARRAYSIZE(input_buffer)); ImGui::InputTextWithHint("Location", "Groove Street", m_nLocationBuffer, IM_ARRAYSIZE(m_nInputBuffer));
ImGui::InputTextWithHint("Coordinates", "x, y, z", input_buffer, IM_ARRAYSIZE(input_buffer)); ImGui::InputTextWithHint("Coordinates", "x, y, z", m_nInputBuffer, IM_ARRAYSIZE(m_nInputBuffer));
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::Button("Add location", Ui::GetSize())) if (ImGui::Button("Add location", Ui::GetSize()))
{ {
tp_data.json.data["Custom"][location_buffer] = ("0, " + std::string(input_buffer)); tp_data.m_Json.m_Data["Custom"][m_nLocationBuffer] = ("0, " + std::string(m_nInputBuffer));
// Clear the Radar coordinates // Clear the Radar coordinates
tp_data.json.data.erase("Radar"); tp_data.m_Json.m_Data.erase("Radar");
tp_data.json.data["Radar"] = {}; tp_data.m_Json.m_Data["Radar"] = {};
tp_data.json.WriteToDisk(); tp_data.m_Json.WriteToDisk();
} }
ImGui::EndTabItem(); ImGui::EndTabItem();
} }
ImGui::EndTabBar(); ImGui::EndTabBar();
} }
} }

View File

@ -5,21 +5,20 @@
class Teleport class Teleport
{ {
private: private:
inline static bool insert_coord = false; inline static bool m_bInsertCoord;
inline static bool quick_teleport = false; inline static bool m_bQuickTeleport;
inline static char input_buffer[INPUT_BUFFER_SIZE] = ""; inline static char m_nInputBuffer[INPUT_BUFFER_SIZE];
inline static SearchData tp_data{ "teleport" }; inline static SSearchData tp_data{"teleport"};
inline static char location_buffer[INPUT_BUFFER_SIZE] = ""; inline static char m_nLocationBuffer[INPUT_BUFFER_SIZE];
inline static uint quick_teleport_timer = 0; inline static uint m_nQuickTeleportTimer;
inline static CJson m_SpriteJson = CJson("radar sprite");
struct STeleport static struct
{ {
inline static bool _bool = false; inline static bool m_bEnabled;
inline static CVector pos = { -1, -1, -1 }; inline static CVector m_fPos = {-1, -1, -1};
inline static uint timer = 0; inline static uint m_nTimer;
}; } m_Teleport;
inline static CJson sprite_name_json = CJson("radar sprite");
/* /*
Generates radar sprite coordinates on the fly. Generates radar sprite coordinates on the fly.
@ -30,10 +29,8 @@ private:
protected: protected:
Teleport(); Teleport();
public: public:
static void Draw(); static void Draw();
static void TeleportPlayer(bool get_marker = false, CVector pos = CVector(0, 0, 0), short interior_id = 0); static void TeleportPlayer(bool get_marker = false, CVector pos = CVector(0, 0, 0), short interior_id = 0);
static void TeleportToLocation(std::string& rootkey, std::string& bLocName, std::string& loc); static void TeleportToLocation(std::string& rootkey, std::string& bLocName, std::string& loc);
static void RemoveTeleportEntry(std::string& rootkey, std::string& key, std::string& val); static void RemoveTeleportEntry(std::string& rootkey, std::string& key, std::string& val);
};
};

View File

@ -1,97 +1,97 @@
uchar* m_nDirectionalMult = (uchar*)0x55F7C7; //m_nDirectionalMult[184] uchar* m_nDirectionalMult = (uchar*)0x55F7C7; //m_nDirectionalMult[184]
uchar* m_nWaterFogAlpha = (uchar*)0x55F7B8; //m_nWaterFogAlpha[184] uchar* m_nWaterFogAlpha = (uchar*)0x55F7B8; //m_nWaterFogAlpha[184]
uchar* m_nHighLightMinIntensity = (uchar*)0x55F7A9; //m_nHighLightMinIntensity[184] uchar* m_nHighLightMinIntensity = (uchar*)0x55F7A9; //m_nHighLightMinIntensity[184]
uchar* m_fCloudAlpha = (uchar*)0x55F793; //m_fCloudAlpha[184] uchar* m_fCloudAlpha = (uchar*)0x55F793; //m_fCloudAlpha[184]
uchar* m_fPostFx2Alpha = (uchar*)0x55F77D; //m_fPostFx2Alpha[184] uchar* m_fPostFx2Alpha = (uchar*)0x55F77D; //m_fPostFx2Alpha[184]
uchar* m_fPostFx2Blue = (uchar*)0x55F767; //m_fPostFx2Blue[184] uchar* m_fPostFx2Blue = (uchar*)0x55F767; //m_fPostFx2Blue[184]
uchar* m_fPostFx2Green = (uchar*)0x55F751; //m_fPostFx2Green[184] uchar* m_fPostFx2Green = (uchar*)0x55F751; //m_fPostFx2Green[184]
uchar* m_fPostFx2Red = (uchar*)0x55F73B; //m_fPostFx2Red[184] uchar* m_fPostFx2Red = (uchar*)0x55F73B; //m_fPostFx2Red[184]
uchar* m_fPostFx1Alpha = (uchar*)0x55F725; //m_fPostFx1Alpha[184] uchar* m_fPostFx1Alpha = (uchar*)0x55F725; //m_fPostFx1Alpha[184]
uchar* m_fPostFx1Blue = (uchar*)0x55F70F; //m_fPostFx1Blue[184] uchar* m_fPostFx1Blue = (uchar*)0x55F70F; //m_fPostFx1Blue[184]
uchar* m_fPostFx1Green = (uchar*)0x55F6FC; //m_fPostFx1Green[184] uchar* m_fPostFx1Green = (uchar*)0x55F6FC; //m_fPostFx1Green[184]
uchar* m_fPostFx1Red = (uchar*)0x55F6E9; //m_fPostFx1Red[184] uchar* m_fPostFx1Red = (uchar*)0x55F6E9; //m_fPostFx1Red[184]
uchar* m_fWaterAlpha = (uchar*)0x55F6D6; //m_fWaterAlpha[184] uchar* m_fWaterAlpha = (uchar*)0x55F6D6; //m_fWaterAlpha[184]
uchar* m_fWaterBlue = (uchar*)0x55F6C3; //m_fWaterBlue[184] uchar* m_fWaterBlue = (uchar*)0x55F6C3; //m_fWaterBlue[184]
uchar* m_fWaterGreen = (uchar*)0x55F6B0; //m_fWaterGreen[184] uchar* m_fWaterGreen = (uchar*)0x55F6B0; //m_fWaterGreen[184]
uchar* m_fWaterRed = (uchar*)0x55F69C; //m_fWaterRed[184] uchar* m_fWaterRed = (uchar*)0x55F69C; //m_fWaterRed[184]
uchar* m_nFluffyCloudsBottomBlue = (uchar*)0x55F690; //m_nFluffyCloudsBottomBlue[184] uchar* m_nFluffyCloudsBottomBlue = (uchar*)0x55F690; //m_nFluffyCloudsBottomBlue[184]
uchar* m_nFluffyCloudsBottomGreen = (uchar*)0x55F683;//m_nFluffyCloudsBottomGreen[184] uchar* m_nFluffyCloudsBottomGreen = (uchar*)0x55F683; //m_nFluffyCloudsBottomGreen[184]
uchar* m_nFluffyCloudsBottomRed = (uchar*)0x55F677; //m_nFluffyCloudsBottomRed[184] uchar* m_nFluffyCloudsBottomRed = (uchar*)0x55F677; //m_nFluffyCloudsBottomRed[184]
uchar* m_nLowCloudsBlue = (uchar*)0x55F66B; //m_nLowCloudsBlue[184] uchar* m_nLowCloudsBlue = (uchar*)0x55F66B; //m_nLowCloudsBlue[184]
uchar* m_nLowCloudsGreen = (uchar*)0x55F65F; //m_nLowCloudsGreen[184] uchar* m_nLowCloudsGreen = (uchar*)0x55F65F; //m_nLowCloudsGreen[184]
uchar* m_nLowCloudsRed = (uchar*)0x55F653; //m_nLowCloudsRed[184] uchar* m_nLowCloudsRed = (uchar*)0x55F653; //m_nLowCloudsRed[184]
uchar* m_fLightsOnGroundBrightness = (uchar*)0x55F640;//m_fLightsOnGroundBrightness[184] uchar* m_fLightsOnGroundBrightness = (uchar*)0x55F640; //m_fLightsOnGroundBrightness[184]
short* m_fFogStart = (short*)0x55F62E; //m_fFogStart[184] short* m_fFogStart = (short*)0x55F62E; //m_fFogStart[184]
short* m_fFarClip = (short*)0x55F61B; //m_fFarClip[184] short* m_fFarClip = (short*)0x55F61B; //m_fFarClip[184]
uchar* m_nPoleShadowStrength = (uchar*)0x55F60F; //m_nPoleShadowStrength[184] uchar* m_nPoleShadowStrength = (uchar*)0x55F60F; //m_nPoleShadowStrength[184]
uchar* m_nLightShadowStrength = (uchar*)0x55F603; //m_nLightShadowStrength[184] uchar* m_nLightShadowStrength = (uchar*)0x55F603; //m_nLightShadowStrength[184]
uchar* m_nShadowStrength = (uchar*)0x55F5F7; //m_nShadowStrength[184] uchar* m_nShadowStrength = (uchar*)0x55F5F7; //m_nShadowStrength[184]
uchar* m_fSpriteBrightness = (uchar*)0x55F5E4; //m_fSpriteBrightness[184] uchar* m_fSpriteBrightness = (uchar*)0x55F5E4; //m_fSpriteBrightness[184]
uchar* m_fSpriteSize = (uchar*)0x55F5D2; //m_fSpriteSize[184] uchar* m_fSpriteSize = (uchar*)0x55F5D2; //m_fSpriteSize[184]
uchar* m_fSunSize = (uchar*)0x55F5C0; //m_fSunSize[184] uchar* m_fSunSize = (uchar*)0x55F5C0; //m_fSunSize[184]
uchar* m_nSunCoronaBlue = (uchar*)0x55F5B5; //m_nSunCoronaBlue[184] uchar* m_nSunCoronaBlue = (uchar*)0x55F5B5; //m_nSunCoronaBlue[184]
uchar* m_nSunCoronaGreen = (uchar*)0x55F5A9; //m_nSunCoronaGreen[184] uchar* m_nSunCoronaGreen = (uchar*)0x55F5A9; //m_nSunCoronaGreen[184]
uchar* m_nSunCoronaRed = (uchar*)0x55F59D; //m_nSunCoronaRed[184] uchar* m_nSunCoronaRed = (uchar*)0x55F59D; //m_nSunCoronaRed[184]
uchar* m_nSunCoreBlue = (uchar*)0x55F591; //m_nSunCoreBlue[184] uchar* m_nSunCoreBlue = (uchar*)0x55F591; //m_nSunCoreBlue[184]
uchar* m_nSunCoreGreen = (uchar*)0x55F585; //m_nSunCoreGreen[184] uchar* m_nSunCoreGreen = (uchar*)0x55F585; //m_nSunCoreGreen[184]
uchar* m_nSunCoreRed = (uchar*)0x55F579; //m_nSunCoreRed[184] uchar* m_nSunCoreRed = (uchar*)0x55F579; //m_nSunCoreRed[184]
uchar* m_nSkyBottomBlue = (uchar*)0x55F56D; //m_nSkyBottomBlue[184] uchar* m_nSkyBottomBlue = (uchar*)0x55F56D; //m_nSkyBottomBlue[184]
uchar* m_nSkyBottomGreen = (uchar*)0x55F561; //m_nSkyBottomGreen[184] uchar* m_nSkyBottomGreen = (uchar*)0x55F561; //m_nSkyBottomGreen[184]
uchar* m_nSkyBottomRed = (uchar*)0x55F555; //m_nSkyBottomRed[184] uchar* m_nSkyBottomRed = (uchar*)0x55F555; //m_nSkyBottomRed[184]
uchar* m_nSkyTopBlue = (uchar*)0x55F549; //m_nSkyTopBlue[45] uchar* m_nSkyTopBlue = (uchar*)0x55F549; //m_nSkyTopBlue[45]
uchar* m_nSkyTopGreen = (uchar*)0x55F53D; //m_nSkyTopGreen[45] uchar* m_nSkyTopGreen = (uchar*)0x55F53D; //m_nSkyTopGreen[45]
uchar* m_nSkyTopRed = (uchar*)0x55F531; //m_nSkyTopRed[45] uchar* m_nSkyTopRed = (uchar*)0x55F531; //m_nSkyTopRed[45]
uchar* m_nAmbientBlue_Obj = (uchar*)0x55F51E; //m_nAmbientBlue_Obj[184] uchar* m_nAmbientBlue_Obj = (uchar*)0x55F51E; //m_nAmbientBlue_Obj[184]
uchar* m_nAmbientGreen_Obj = (uchar*)0x55F50C; //m_nAmbientGreen_Obj[184] uchar* m_nAmbientGreen_Obj = (uchar*)0x55F50C; //m_nAmbientGreen_Obj[184]
uchar* m_nAmbientRed_Obj = (uchar*)0x55F4FA; //m_nAmbientRed_Obj[184] uchar* m_nAmbientRed_Obj = (uchar*)0x55F4FA; //m_nAmbientRed_Obj[184]
uchar* m_nAmbientBlue = (uchar*)0x55F4E8; //m_nAmbientBlue[184] uchar* m_nAmbientBlue = (uchar*)0x55F4E8; //m_nAmbientBlue[184]
uchar* m_nAmbientGreen = (uchar*)0x55F4D6; //m_nAmbientGreen[184] uchar* m_nAmbientGreen = (uchar*)0x55F4D6; //m_nAmbientGreen[184]
uchar* m_nAmbientRed = (uchar*)0x560C61; //m_nAmbientRed[184] uchar* m_nAmbientRed = (uchar*)0x560C61; //m_nAmbientRed[184]

View File

@ -73,7 +73,6 @@ void Ui::CenterdText(const std::string& text)
void Ui::DrawHeaders(CallbackTable& data) void Ui::DrawHeaders(CallbackTable& data)
{ {
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0));
short i = 1; short i = 1;
@ -84,7 +83,7 @@ void Ui::DrawHeaders(CallbackTable& data)
{ {
const char* btn_text = it->first.c_str(); const char* btn_text = it->first.c_str();
if (btn_text == Globals::header_id) if (btn_text == Globals::m_HeaderId)
{ {
colors[ImGuiCol_Button] = colors[ImGuiCol_ButtonActive]; colors[ImGuiCol_Button] = colors[ImGuiCol_ButtonActive];
func = it->second; func = it->second;
@ -93,8 +92,8 @@ void Ui::DrawHeaders(CallbackTable& data)
if (ImGui::Button(btn_text, GetSize(3, false))) if (ImGui::Button(btn_text, GetSize(3, false)))
{ {
Globals::header_id = btn_text; Globals::m_HeaderId = btn_text;
config.SetValue("window.id", Globals::header_id); config.SetValue("window.id", Globals::m_HeaderId);
func = it->second; func = it->second;
} }
@ -107,35 +106,35 @@ void Ui::DrawHeaders(CallbackTable& data)
ImGui::PopStyleVar(); ImGui::PopStyleVar();
ImGui::Dummy(ImVec2(0, 10)); ImGui::Dummy(ImVec2(0, 10));
if (Globals::header_id == "") if (Globals::m_HeaderId == "")
{ {
// Show Welcome page // Show Welcome page
ImGui::NewLine(); ImGui::NewLine();
Ui::CenterdText("Welcome to Cheat Menu"); CenterdText("Welcome to Cheat Menu");
Ui::CenterdText("Author: Grinch_"); CenterdText("Author: Grinch_");
ImGui::NewLine(); ImGui::NewLine();
ImGui::TextWrapped("Please ensure you have the latest version from GitHub."); ImGui::TextWrapped("Please ensure you have the latest version from GitHub.");
ImGui::NewLine(); ImGui::NewLine();
if (ImGui::Button("Discord server", ImVec2(Ui::GetSize(2)))) if (ImGui::Button("Discord server", ImVec2(GetSize(2))))
ShellExecute(NULL, "open", DISCORD_INVITE, NULL, NULL, SW_SHOWNORMAL); ShellExecute(nullptr, "open", DISCORD_INVITE, nullptr, nullptr, SW_SHOWNORMAL);
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("GitHub repo", ImVec2(Ui::GetSize(2)))) if (ImGui::Button("GitHub repo", ImVec2(GetSize(2))))
ShellExecute(NULL, "open", GITHUB_LINK, NULL, NULL, SW_SHOWNORMAL); ShellExecute(nullptr, "open", GITHUB_LINK, nullptr, nullptr, SW_SHOWNORMAL);
ImGui::NewLine(); ImGui::NewLine();
ImGui::TextWrapped("If you find bugs or have suggestions, you can let me know on discord :)"); ImGui::TextWrapped("If you find bugs or have suggestions, you can let me know on discord :)");
ImGui::NewLine(); ImGui::NewLine();
Ui::CenterdText("Copyright GPLv3 2019-2021"); CenterdText("Copyright GPLv3 2019-2021");
} }
else else
{ {
if (func != nullptr && ImGui::BeginChild("TABSBAR")) if (func != nullptr && ImGui::BeginChild("TABSBAR"))
{ {
((void(*)(void))func)(); static_cast<void(*)()>(func)();
ImGui::EndChild(); ImGui::EndChild();
} }
} }
@ -159,7 +158,7 @@ bool Ui::CheckboxWithHint(const char* label, bool* v, const char* hint, bool is_
// set things up // set things up
bool pressed = false; bool pressed = false;
const ImGuiStyle& style = ImGui::GetStyle(); const ImGuiStyle& style = ImGui::GetStyle();
const ImVec2 text_size = ImGui::CalcTextSize(label, NULL, true); const ImVec2 text_size = ImGui::CalcTextSize(label, nullptr, true);
float square_sz = ImGui::GetFrameHeight(); float square_sz = ImGui::GetFrameHeight();
ImDrawList* drawlist = ImGui::GetWindowDrawList(); ImDrawList* drawlist = ImGui::GetWindowDrawList();
ImU32 color = ImGui::GetColorU32(ImGuiCol_FrameBg); ImU32 color = ImGui::GetColorU32(ImGuiCol_FrameBg);
@ -183,17 +182,18 @@ bool Ui::CheckboxWithHint(const char* label, bool* v, const char* hint, bool is_
ImVec2 max = ImGui::GetItemRectMax(); ImVec2 max = ImGui::GetItemRectMax();
drawlist->AddRectFilled(min, max, color); drawlist->AddRectFilled(min, max, color);
int pad = int(square_sz / 6.0); int pad = static_cast<int>(square_sz / 6.0);
pad = (pad < 1) ? 1 : pad; pad = (pad < 1) ? 1 : pad;
if (*v) if (*v)
{ // draw the checkmark {
// draw the checkmark
float sz = (square_sz - pad * 2.0); float sz = (square_sz - pad * 2.0);
float thickness = sz / 5.0; float thickness = sz / 5.0;
thickness = (thickness < 1.0) ? 1.0 : thickness; thickness = (thickness < 1.0) ? 1.0 : thickness;
sz = sz - thickness * 0.5; sz = sz - thickness * 0.5;
ImVec2 pos = ImVec2(min.x + pad, min.y + pad); auto pos = ImVec2(min.x + pad, min.y + pad);
pos.x = pos.x + thickness * 0.25; pos.x = pos.x + thickness * 0.25;
pos.y = pos.y + thickness * 0.25; pos.y = pos.y + thickness * 0.25;
@ -209,7 +209,7 @@ bool Ui::CheckboxWithHint(const char* label, bool* v, const char* hint, bool is_
// draw label // draw label
ImGui::SameLine(0, style.ItemInnerSpacing.x); ImGui::SameLine(0, style.ItemInnerSpacing.x);
if (ImGui::InvisibleButton(label, ImVec2(ImGui::CalcTextSize(label, NULL, true).x, square_sz)) && !is_disabled) if (ImGui::InvisibleButton(label, ImVec2(ImGui::CalcTextSize(label, nullptr, true).x, square_sz)) && !is_disabled)
{ {
pressed = true; pressed = true;
*v = !*v; *v = !*v;
@ -221,9 +221,10 @@ bool Ui::CheckboxWithHint(const char* label, bool* v, const char* hint, bool is_
if (hint != nullptr) if (hint != nullptr)
{ {
ImGui::SameLine(0, style.ItemInnerSpacing.x); ImGui::SameLine(0, style.ItemInnerSpacing.x);
ImGui::InvisibleButton("?", ImGui::CalcTextSize("?", NULL, true)); ImGui::InvisibleButton("?", ImGui::CalcTextSize("?", nullptr, true));
min = ImGui::GetItemRectMin(); min = ImGui::GetItemRectMin();
drawlist->AddText(ImVec2(min.x, min.y + style.ItemInnerSpacing.y), ImGui::GetColorU32(ImGuiCol_TextDisabled), "?"); drawlist->AddText(ImVec2(min.x, min.y + style.ItemInnerSpacing.y), ImGui::GetColorU32(ImGuiCol_TextDisabled),
"?");
if (ImGui::IsItemHovered() && !is_disabled) if (ImGui::IsItemHovered() && !is_disabled)
{ {
@ -290,7 +291,8 @@ bool Ui::CheckboxAddressVar(const char* label, bool val, int addr, const char* h
return rtn; return rtn;
} }
bool Ui::CheckboxAddressVarEx(const char* label, bool val, int addr, int enabled_val, int disabled_val, const char* hint) bool Ui::CheckboxAddressVarEx(const char* label, bool val, int addr, int enabled_val, int disabled_val,
const char* hint)
{ {
bool rtn = false; bool rtn = false;
bool state = val; bool state = val;
@ -320,7 +322,10 @@ bool Ui::CheckboxBitFlag(const char* label, uint flag, const char* hint)
return rtn; return rtn;
} }
void Ui::DrawJSON(CJson& json, std::vector<std::string>& combo_items, std::string& selected_item, ImGuiTextFilter& filter, std::function<void(std::string&, std::string&, std::string&)> func_left_click, std::function<void(std::string&, std::string&, std::string&)> func_right_click) void Ui::DrawJSON(CJson& json, std::vector<std::string>& combo_items, std::string& selected_item,
ImGuiTextFilter& filter,
std::function<void(std::string&, std::string&, std::string&)> func_left_click,
std::function<void(std::string&, std::string&, std::string&)> func_right_click)
{ {
ImGui::PushItemWidth(ImGui::GetContentRegionAvailWidth() / 2 - 5); ImGui::PushItemWidth(ImGui::GetContentRegionAvailWidth() / 2 - 5);
ListBoxStr("##Categories", combo_items, selected_item); ListBoxStr("##Categories", combo_items, selected_item);
@ -343,17 +348,16 @@ void Ui::DrawJSON(CJson& json, std::vector<std::string>& combo_items, std::strin
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::IsMouseClicked(1)) if (ImGui::IsMouseClicked(1))
json_popup.function = nullptr; jsonPopup.function = nullptr;
ImGui::BeginChild(1); ImGui::BeginChild(1);
for (auto root : json.data.items()) for (auto root : json.m_Data.items())
{ {
if (root.key() == selected_item || selected_item == "All") if (root.key() == selected_item || selected_item == "All")
{ {
for (auto _data : root.value().items()) for (auto _data : root.value().items())
{ {
std::string name = _data.key(); std::string name = _data.key();
if (filter.PassFilter(name.c_str())) if (filter.PassFilter(name.c_str()))
{ {
@ -368,28 +372,28 @@ void Ui::DrawJSON(CJson& json, std::vector<std::string>& combo_items, std::strin
if (ImGui::IsItemClicked(1) && func_right_click != nullptr) if (ImGui::IsItemClicked(1) && func_right_click != nullptr)
{ {
json_popup.function = func_right_click; jsonPopup.function = func_right_click;
json_popup.root_key = root.key(); jsonPopup.rootKey = root.key();
json_popup.key = name; jsonPopup.key = name;
json_popup.value = _data.value(); jsonPopup.value = _data.value();
} }
} }
} }
} }
} }
if (json_popup.function != nullptr) if (jsonPopup.function != nullptr)
{ {
if (ImGui::BeginPopupContextWindow()) if (ImGui::BeginPopupContextWindow())
{ {
ImGui::Text(json_popup.key.c_str()); ImGui::Text(jsonPopup.key.c_str());
ImGui::Separator(); ImGui::Separator();
if (ImGui::MenuItem("Remove")) if (ImGui::MenuItem("Remove"))
json_popup.function(json_popup.root_key, json_popup.key, json_popup.value); jsonPopup.function(jsonPopup.rootKey, jsonPopup.key, jsonPopup.value);
if (ImGui::MenuItem("Close")) if (ImGui::MenuItem("Close"))
json_popup.function = nullptr; jsonPopup.function = nullptr;
ImGui::EndPopup(); ImGui::EndPopup();
} }
@ -404,7 +408,7 @@ void Ui::EditStat(const char* label, const int stat_id, const int min, const int
{ {
int val = static_cast<int>(CStats::GetStatValue(stat_id)); int val = static_cast<int>(CStats::GetStatValue(stat_id));
ImGui::Columns(3, 0, false); ImGui::Columns(3, nullptr, false);
ImGui::Text("Min: %d", min); ImGui::Text("Min: %d", min);
ImGui::NextColumn(); ImGui::NextColumn();
ImGui::Text("Def: %d", def); ImGui::Text("Def: %d", def);
@ -419,17 +423,17 @@ void Ui::EditStat(const char* label, const int stat_id, const int min, const int
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::Button(("Minimum##" + std::string(label)).c_str(), Ui::GetSize(3))) if (ImGui::Button(("Minimum##" + std::string(label)).c_str(), GetSize(3)))
CStats::SetStatValue(stat_id, static_cast<float>(min)); CStats::SetStatValue(stat_id, static_cast<float>(min));
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button(("Default##" + std::string(label)).c_str(), Ui::GetSize(3))) if (ImGui::Button(("Default##" + std::string(label)).c_str(), GetSize(3)))
CStats::SetStatValue(stat_id, static_cast<float>(def)); CStats::SetStatValue(stat_id, static_cast<float>(def));
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button(("Maximum##" + std::string(label)).c_str(), Ui::GetSize(3))) if (ImGui::Button(("Maximum##" + std::string(label)).c_str(), GetSize(3)))
CStats::SetStatValue(stat_id, static_cast<float>(max)); CStats::SetStatValue(stat_id, static_cast<float>(max));
ImGui::Spacing(); ImGui::Spacing();
@ -454,25 +458,26 @@ void Ui::FilterWithHint(const char* label, ImGuiTextFilter& filter, const char*
} }
// clean up the code someday // clean up the code someday
void Ui::DrawImages(std::vector<std::unique_ptr<TextureStructure>>& img_vec, ImVec2 image_size, void Ui::DrawImages(std::vector<std::unique_ptr<STextureStructure>>& img_vec, ImVec2 image_size,
std::vector<std::string>& category_vec, std::string& selected_item, ImGuiTextFilter& filter, std::vector<std::string>& category_vec, std::string& selected_item, ImGuiTextFilter& filter,
std::function<void(std::string&)> on_left_click, std::function<void(std::string&)> on_right_click, std::function<void(std::string&)> on_left_click, std::function<void(std::string&)> on_right_click,
std::function<std::string(std::string&)> get_name_func, std::function<bool(std::string&)> verify_func) std::function<std::string(std::string&)> get_name_func,
std::function<bool(std::string&)> verify_func)
{ {
// scale image size // scale image size
image_size.x *= screen::GetScreenWidth() / 1366.0f; image_size.x *= screen::GetScreenWidth() / 1366.0f;
image_size.y *= screen::GetScreenHeight() / 768.0f; image_size.y *= screen::GetScreenHeight() / 768.0f;
int images_in_row = static_cast<int>(ImGui::GetWindowContentRegionWidth() / image_size.x); int images_in_row = static_cast<int>(ImGui::GetWindowContentRegionWidth() / image_size.x);
image_size.x = ImGui::GetWindowContentRegionWidth() / images_in_row - int(ImGuiStyleVar_ItemSpacing) * 0.65f; image_size.x = ImGui::GetWindowContentRegionWidth() / images_in_row - static_cast<int>(ImGuiStyleVar_ItemSpacing) *
0.65f;
int images_count = 1; int images_count = 1;
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::IsMouseClicked(1)) if (ImGui::IsMouseClicked(1))
img_popup.function = nullptr; imgPopup.function = nullptr;
ImGui::PushItemWidth(ImGui::GetContentRegionAvailWidth() / 2 - 5); ImGui::PushItemWidth(ImGui::GetContentRegionAvailWidth() / 2 - 5);
ListBoxStr("##Categories", category_vec, selected_item); ListBoxStr("##Categories", category_vec, selected_item);
@ -484,21 +489,22 @@ void Ui::DrawImages(std::vector<std::unique_ptr<TextureStructure>>& img_vec, ImV
ImGui::BeginChild("DrawImages"); ImGui::BeginChild("DrawImages");
for (uint i = 0; i < img_vec.size(); i++) for (uint i = 0; i < img_vec.size(); i++)
{ {
std::string text = img_vec[i]->file_name; std::string text = img_vec[i]->m_FileName;
std::string model_name = get_name_func(text); std::string model_name = get_name_func(text);
if (filter.PassFilter(model_name.c_str()) if (filter.PassFilter(model_name.c_str())
&& (img_vec[i]->category_name == selected_item || selected_item == "All") && (img_vec[i]->m_CategoryName == selected_item || selected_item == "All")
&& (verify_func == nullptr || verify_func(text)) && (verify_func == nullptr || verify_func(text))
) )
{ {
if (ImGui::ImageButton(img_vec[i]->texture, image_size, ImVec2(0, 0), ImVec2(1, 1), 1, ImVec4(1, 1, 1, 1), ImVec4(1, 1, 1, 1))) if (ImGui::ImageButton(img_vec[i]->m_pTexture, image_size, ImVec2(0, 0), ImVec2(1, 1), 1, ImVec4(1, 1, 1, 1),
ImVec4(1, 1, 1, 1)))
on_left_click(text); on_left_click(text);
if (ImGui::IsItemClicked(1) && on_right_click != nullptr) if (ImGui::IsItemClicked(1) && on_right_click != nullptr)
{ {
img_popup.function = on_right_click; imgPopup.function = on_right_click;
img_popup.value = model_name; imgPopup.value = model_name;
} }
if (ImGui::IsItemHovered()) if (ImGui::IsItemHovered())
@ -514,7 +520,8 @@ void Ui::DrawImages(std::vector<std::unique_ptr<TextureStructure>>& img_vec, ImV
if (text_size.x < image_size.x) if (text_size.x < image_size.x)
{ {
float offsetX = (ImGui::GetItemRectSize().x - text_size.x) / 2; float offsetX = (ImGui::GetItemRectSize().x - text_size.x) / 2;
drawlist->AddText(ImVec2(btn_min.x + offsetX, btn_min.y + 10), ImGui::GetColorU32(ImGuiCol_Text), model_name.c_str()); drawlist->AddText(ImVec2(btn_min.x + offsetX, btn_min.y + 10), ImGui::GetColorU32(ImGuiCol_Text),
model_name.c_str());
} }
else else
{ {
@ -527,10 +534,10 @@ void Ui::DrawImages(std::vector<std::unique_ptr<TextureStructure>>& img_vec, ImV
{ {
text_size = ImGui::CalcTextSize(buff.c_str()); text_size = ImGui::CalcTextSize(buff.c_str());
float offsetX = (ImGui::GetItemRectSize().x - text_size.x) / 2; float offsetX = (ImGui::GetItemRectSize().x - text_size.x) / 2;
drawlist->AddText(ImVec2(btn_min.x + offsetX, btn_min.y + 10 * count), ImGui::GetColorU32(ImGuiCol_Text), buff.c_str()); drawlist->AddText(ImVec2(btn_min.x + offsetX, btn_min.y + 10 * count),
ImGui::GetColorU32(ImGuiCol_Text), buff.c_str());
++count; ++count;
} }
} }
} }
@ -541,18 +548,18 @@ void Ui::DrawImages(std::vector<std::unique_ptr<TextureStructure>>& img_vec, ImV
} }
} }
if (img_popup.function != nullptr) if (imgPopup.function != nullptr)
{ {
if (ImGui::BeginPopupContextWindow()) if (ImGui::BeginPopupContextWindow())
{ {
ImGui::Text(img_popup.value.c_str()); ImGui::Text(imgPopup.value.c_str());
ImGui::Separator(); ImGui::Separator();
if (ImGui::MenuItem("Remove")) if (ImGui::MenuItem("Remove"))
img_popup.function(img_popup.value); imgPopup.function(imgPopup.value);
if (ImGui::MenuItem("Close")) if (ImGui::MenuItem("Close"))
img_popup.function = nullptr; imgPopup.function = nullptr;
ImGui::EndPopup(); ImGui::EndPopup();
} }
@ -565,7 +572,7 @@ void Ui::RadioButtonAddress(const char* label, std::vector<NamedMemory>& named_m
size_t btn_in_column = named_mem.size() / 2 - 1; size_t btn_in_column = named_mem.size() / 2 - 1;
ImGui::Text(label); ImGui::Text(label);
ImGui::Columns(2, 0, false); ImGui::Columns(2, nullptr, false);
bool state = true; bool state = true;
@ -604,7 +611,7 @@ void Ui::RadioButtonAddressEx(const char* label, int addr, std::vector<NamedValu
size_t btn_in_column = named_val.size() / 2; size_t btn_in_column = named_val.size() / 2;
ImGui::Text(label); ImGui::Text(label);
ImGui::Columns(2, 0, false); ImGui::Columns(2, nullptr, false);
int mem_val = 0; int mem_val = 0;
patch::GetRaw(addr, &mem_val, 1, false); patch::GetRaw(addr, &mem_val, 1, false);
@ -671,7 +678,7 @@ void Ui::ColorPickerAddress(const char* label, int base_addr, ImVec4&& default_c
} }
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::Button("Reset to default", Ui::GetSize())) if (ImGui::Button("Reset to default", GetSize()))
{ {
patch::Set<BYTE>(base_addr, default_color.x, false); patch::Set<BYTE>(base_addr, default_color.x, false);
patch::Set<BYTE>(base_addr + 1, default_color.y, false); patch::Set<BYTE>(base_addr + 1, default_color.y, false);
@ -686,16 +693,16 @@ void Ui::ColorPickerAddress(const char* label, int base_addr, ImVec4&& default_c
void Ui::EditBits(const char* label, const int address, const std::vector<std::string>& names) void Ui::EditBits(const char* label, const int address, const std::vector<std::string>& names)
{ {
int* mem_val = (int*)address; auto mem_val = (int*)address;
if (ImGui::CollapsingHeader(label)) if (ImGui::CollapsingHeader(label))
{ {
ImGui::Columns(2, NULL, false); ImGui::Columns(2, nullptr, false);
for (int i = 0; i < 32; ++i) for (int i = 0; i < 32; ++i)
{ {
int mask = 1 << i; int mask = 1 << i;
bool state = static_cast<bool>(*mem_val & mask); bool state = *mem_val & mask;
if (ImGui::Checkbox(names[i].c_str(), &state)) if (ImGui::Checkbox(names[i].c_str(), &state))
*mem_val ^= mask; *mem_val ^= mask;
@ -710,7 +717,8 @@ void Ui::EditBits(const char* label, const int address, const std::vector<std::s
} }
} }
void Ui::EditFloat(const char* label, const int address, const float min, const float def, const float max, const float mul) void Ui::EditFloat(const char* label, const int address, const float min, const float def, const float max,
const float mul)
{ {
if (ImGui::CollapsingHeader(label)) if (ImGui::CollapsingHeader(label))
{ {
@ -721,7 +729,7 @@ void Ui::EditFloat(const char* label, const int address, const float min, const
if (min == def) if (min == def)
items = 2; items = 2;
ImGui::Columns(items, 0, false); ImGui::Columns(items, nullptr, false);
ImGui::Text("Min: %f", min); ImGui::Text("Min: %f", min);
@ -760,20 +768,20 @@ void Ui::EditFloat(const char* label, const int address, const float min, const
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::Button(("Minimum##" + std::string(label)).c_str(), Ui::GetSize(items))) if (ImGui::Button(("Minimum##" + std::string(label)).c_str(), GetSize(items)))
patch::Set<float>(address, min / mul, false); patch::Set<float>(address, min / mul, false);
if (items == 3) if (items == 3)
{ {
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button(("Default##" + std::string(label)).c_str(), Ui::GetSize(items))) if (ImGui::Button(("Default##" + std::string(label)).c_str(), GetSize(items)))
patch::Set<float>(address, def / mul, false); patch::Set<float>(address, def / mul, false);
} }
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button(("Maximum##" + std::string(label)).c_str(), Ui::GetSize(items))) if (ImGui::Button(("Maximum##" + std::string(label)).c_str(), GetSize(items)))
patch::Set<float>(address, max / mul, false); patch::Set<float>(address, max / mul, false);
ImGui::Spacing(); ImGui::Spacing();
@ -783,7 +791,7 @@ void Ui::EditFloat(const char* label, const int address, const float min, const
bool Ui::HotKey(const char* label, HotKeyData& key_data) bool Ui::HotKey(const char* label, HotKeyData& key_data)
{ {
bool active = current_hotkey == label; bool active = m_CurrentHotkey == label;
bool state = false; bool state = false;
if (active) if (active)
@ -795,7 +803,7 @@ bool Ui::HotKey(const char* label, HotKeyData& key_data)
{ {
if (KeyPressed(key)) if (KeyPressed(key))
{ {
key_data.key1 = key; key_data.m_key1 = key;
break; break;
} }
} }
@ -804,7 +812,7 @@ bool Ui::HotKey(const char* label, HotKeyData& key_data)
{ {
if (KeyPressed(key)) if (KeyPressed(key))
{ {
key_data.key2 = key; key_data.m_key2 = key;
break; break;
} }
} }
@ -813,21 +821,22 @@ bool Ui::HotKey(const char* label, HotKeyData& key_data)
std::string text; std::string text;
if (key_data.key1 != VK_NONE) if (key_data.m_key1 != VK_NONE)
text = key_names[key_data.key1 - 1]; text = key_names[key_data.m_key1 - 1];
else else
text = "None"; text = "None";
if (key_data.key1 != key_data.key2) if (key_data.m_key1 != key_data.m_key2)
text += (" + " + key_names[key_data.key2 - 1]); text += (" + " + key_names[key_data.m_key2 - 1]);
if (ImGui::Button((text + std::string("##") + std::string(label)).c_str(), ImVec2(ImGui::GetWindowContentRegionWidth() / 3.5, ImGui::GetFrameHeight()))) if (ImGui::Button((text + std::string("##") + std::string(label)).c_str(),
ImVec2(ImGui::GetWindowContentRegionWidth() / 3.5, ImGui::GetFrameHeight())))
if (!active) if (!active)
current_hotkey = label; m_CurrentHotkey = label;
if (active && ImGui::IsMouseClicked(ImGuiMouseButton_Left)) if (active && ImGui::IsMouseClicked(ImGuiMouseButton_Left))
{ {
current_hotkey = ""; m_CurrentHotkey = "";
state = true; state = true;
} }
@ -835,11 +844,11 @@ bool Ui::HotKey(const char* label, HotKeyData& key_data)
{ {
if (ImGui::IsItemHovered()) if (ImGui::IsItemHovered())
{ {
key_data.key1 = VK_NONE; key_data.m_key1 = VK_NONE;
key_data.key2 = VK_NONE; key_data.m_key2 = VK_NONE;
} }
else else
current_hotkey = ""; m_CurrentHotkey = "";
state = true; state = true;
} }
@ -855,14 +864,14 @@ bool Ui::HotKey(const char* label, HotKeyData& key_data)
bool Ui::HotKeyPressed(HotKeyData& hotkey) bool Ui::HotKeyPressed(HotKeyData& hotkey)
{ {
if (KeyPressed(hotkey.key1) && KeyPressed(hotkey.key2)) if (KeyPressed(hotkey.m_key1) && KeyPressed(hotkey.m_key2))
hotkey.is_down = true; hotkey.m_bPressed = true;
else else
{ {
if (hotkey.is_down) if (hotkey.m_bPressed)
{ {
hotkey.is_down = false; hotkey.m_bPressed = false;
return current_hotkey == ""; return m_CurrentHotkey == "";
} }
} }
return false; return false;
@ -872,13 +881,13 @@ std::string Ui::GetHotKeyNameString(HotKeyData& hotkey)
{ {
std::string text; std::string text;
if (hotkey.key1 != VK_NONE) if (hotkey.m_key1 != VK_NONE)
text = key_names[hotkey.key1 - 1]; text = key_names[hotkey.m_key1 - 1];
else else
text = "None"; text = "None";
if (hotkey.key1 != hotkey.key2) if (hotkey.m_key1 != hotkey.m_key2)
text += (" + " + key_names[hotkey.key2 - 1]); text += (" + " + key_names[hotkey.m_key2 - 1]);
return text; return text;
} }
@ -894,7 +903,8 @@ bool Ui::ColorButton(int color_id, std::vector<float>& color, ImVec2 size)
if (ImGui::IsItemHovered()) if (ImGui::IsItemHovered())
{ {
ImDrawList* drawlist = ImGui::GetWindowDrawList(); ImDrawList* drawlist = ImGui::GetWindowDrawList();
drawlist->AddRectFilled(ImGui::GetItemRectMin(), ImGui::GetItemRectMax(), ImGui::GetColorU32(ImGuiCol_ModalWindowDimBg)); drawlist->AddRectFilled(ImGui::GetItemRectMin(), ImGui::GetItemRectMax(),
ImGui::GetColorU32(ImGuiCol_ModalWindowDimBg));
} }
return rtn; return rtn;

View File

@ -3,17 +3,18 @@
class Ui class Ui
{ {
private: private:
inline static std::string current_hotkey = ""; inline static std::string m_CurrentHotkey;
public: public:
struct NamedMemory { struct NamedMemory
{
std::string name; std::string name;
int addr; int addr;
}; };
struct NamedValue { struct NamedValue
{
std::string name; std::string name;
int value; int value;
}; };
@ -22,7 +23,7 @@ public:
{ {
std::function<void(std::string&, std::string&, std::string&)> function; std::function<void(std::string&, std::string&, std::string&)> function;
std::string key; std::string key;
std::string root_key; std::string rootKey;
std::string value; std::string value;
}; };
@ -31,35 +32,42 @@ public:
std::function<void(std::string&)> function; std::function<void(std::string&)> function;
std::string value; std::string value;
}; };
inline static JsonPopUpData json_popup;
inline static ImgPopUpData img_popup; inline static JsonPopUpData jsonPopup;
inline static ImgPopUpData imgPopup;
static void CenterdText(const std::string& text); static void CenterdText(const std::string& text);
static bool ColorButton(int color_id, std::vector<float>& color, ImVec2 size); static bool ColorButton(int color_id, std::vector<float>& color, ImVec2 size);
static bool CheckboxAddress(const char* label, const int addr = NULL, const char* hint = nullptr); static bool CheckboxAddress(const char* label, int addr = NULL, const char* hint = nullptr);
static bool CheckboxAddressEx(const char* label, const int addr = NULL, int enabled_val = 1, int disabled_val = 0, const char* hint = nullptr); static bool CheckboxAddressEx(const char* label, int addr = NULL, int enabled_val = 1, int disabled_val = 0,
const char* hint = nullptr);
static bool CheckboxAddressVar(const char* label, bool val, int addr, const char* hint = nullptr); static bool CheckboxAddressVar(const char* label, bool val, int addr, const char* hint = nullptr);
static bool CheckboxAddressVarEx(const char* label, bool val, int addr, int enabled_val, int disabled_val, const char* hint = nullptr); static bool CheckboxAddressVarEx(const char* label, bool val, int addr, int enabled_val, int disabled_val,
const char* hint = nullptr);
static bool CheckboxBitFlag(const char* label, uint flag, const char* hint = nullptr); static bool CheckboxBitFlag(const char* label, uint flag, const char* hint = nullptr);
static bool CheckboxWithHint(const char* label, bool* state, const char* hint = nullptr, const bool is_disabled = false); static bool CheckboxWithHint(const char* label, bool* state, const char* hint = nullptr, bool is_disabled = false);
static void DrawHeaders(CallbackTable& data); static void DrawHeaders(CallbackTable& data);
static void DrawJSON(CJson& json, std::vector<std::string>& combo_items, std::string& selected_item, ImGuiTextFilter& filter, static void DrawJSON(CJson& json, std::vector<std::string>& combo_items, std::string& selected_item,
std::function<void(std::string&, std::string&, std::string&)> func_left_click, std::function<void(std::string&, std::string&, std::string&)> func_right_click); ImGuiTextFilter& filter,
static void DrawImages(std::vector<std::unique_ptr<TextureStructure>>& img_vec, ImVec2 image_size, std::function<void(std::string&, std::string&, std::string&)> func_left_click,
std::vector<std::string>& category_vec, std::string& selected_item, ImGuiTextFilter& filter, std::function<void(std::string&, std::string&, std::string&)> func_right_click);
std::function<void(std::string&)> on_left_click, std::function<void(std::string&)> on_right_click, static void DrawImages(std::vector<std::unique_ptr<STextureStructure>>& img_vec, ImVec2 image_size,
std::function<std::string(std::string&)> get_name_func, std::function<bool(std::string&)> verify_func = nullptr); std::vector<std::string>& category_vec, std::string& selected_item, ImGuiTextFilter& filter,
std::function<void(std::string&)> on_left_click,
std::function<void(std::string&)> on_right_click,
std::function<std::string(std::string&)> get_name_func,
std::function<bool(std::string&)> verify_func = nullptr);
template <typename T> template <typename T>
static void EditAddress(const char* label, const int address, const int min = 0, const int def = 0, const int max = 100); static void EditAddress(const char* label, int address, int min = 0, int def = 0, int max = 100);
static void EditBits(const char* label, const int address, const std::vector<std::string>& names); static void EditBits(const char* label, int address, const std::vector<std::string>& names);
static void EditFloat(const char* label, const int address, const float min, const float def, const float max, const float mul = 1); static void EditFloat(const char* label, int address, float min, float def, float max, float mul = 1);
template <typename T> template <typename T>
static void EditReference(const char* label, T& address, const int min = 0, const int def = 0, const int max = 100); static void EditReference(const char* label, T& address, int min = 0, int def = 0, int max = 100);
static void EditRadioButtonAddress(const char* label, std::vector<NamedMemory>& named_mem); static void EditRadioButtonAddress(const char* label, std::vector<NamedMemory>& named_mem);
static void EditRadioButtonAddressEx(const char* label, int addr, std::vector<NamedValue>& named_val); static void EditRadioButtonAddressEx(const char* label, int addr, std::vector<NamedValue>& named_val);
static void EditStat(const char* label, const int stat_id, const int min = 0, const int def = 0, const int max = 1000); static void EditStat(const char* label, int stat_id, int min = 0, int def = 0, int max = 1000);
static void FilterWithHint(const char* label, ImGuiTextFilter& filter, const char* hint); static void FilterWithHint(const char* label, ImGuiTextFilter& filter, const char* hint);
@ -84,14 +92,14 @@ void Ui::EditAddress(const char* label, const int address, const int min, const
{ {
if (ImGui::CollapsingHeader(label)) if (ImGui::CollapsingHeader(label))
{ {
int val = patch::Get<T>(address, false);; int val = patch::Get<T>(address, false);
int items = 3; int items = 3;
if (min == def) if (min == def)
items = 2; items = 2;
ImGui::Columns(items, 0, false); ImGui::Columns(items, nullptr, false);
ImGui::Text(("Min: " + std::to_string(min)).c_str()); ImGui::Text(("Min: " + std::to_string(min)).c_str());
if (items == 3) if (items == 3)
@ -117,20 +125,20 @@ void Ui::EditAddress(const char* label, const int address, const int min, const
if (val > max) if (val > max)
val = max; val = max;
if (ImGui::Button(("Minimum##" + std::string(label)).c_str(), Ui::GetSize(items))) if (ImGui::Button(("Minimum##" + std::string(label)).c_str(), GetSize(items)))
patch::Set<T>(address, min, false); patch::Set<T>(address, min, false);
if (items == 3) if (items == 3)
{ {
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button(("Default##" + std::string(label)).c_str(), Ui::GetSize(3))) if (ImGui::Button(("Default##" + std::string(label)).c_str(), GetSize(3)))
patch::Set<T>(address, def, false); patch::Set<T>(address, def, false);
} }
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button(("Maximum##" + std::string(label)).c_str(), Ui::GetSize(items))) if (ImGui::Button(("Maximum##" + std::string(label)).c_str(), GetSize(items)))
patch::Set<T>(address, max, false); patch::Set<T>(address, max, false);
ImGui::Spacing(); ImGui::Spacing();
@ -145,7 +153,7 @@ void Ui::EditReference(const char* label, T& address, const int min, const int d
{ {
int val = static_cast<int>(address); int val = static_cast<int>(address);
ImGui::Columns(3, 0, false); ImGui::Columns(3, nullptr, false);
ImGui::Text(("Min: " + std::to_string(min)).c_str()); ImGui::Text(("Min: " + std::to_string(min)).c_str());
ImGui::NextColumn(); ImGui::NextColumn();
ImGui::Text(("Def: " + std::to_string(def)).c_str()); ImGui::Text(("Def: " + std::to_string(def)).c_str());
@ -160,20 +168,20 @@ void Ui::EditReference(const char* label, T& address, const int min, const int d
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::Button(("Minimum##" + std::string(label)).c_str(), Ui::GetSize(3))) if (ImGui::Button(("Minimum##" + std::string(label)).c_str(), GetSize(3)))
address = static_cast<float>(min); address = static_cast<float>(min);
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button(("Default##" + std::string(label)).c_str(), Ui::GetSize(3))) if (ImGui::Button(("Default##" + std::string(label)).c_str(), GetSize(3)))
address = static_cast<float>(def); address = static_cast<float>(def);
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button(("Maximum##" + std::string(label)).c_str(), Ui::GetSize(3))) if (ImGui::Button(("Maximum##" + std::string(label)).c_str(), GetSize(3)))
address = static_cast<float>(max); address = static_cast<float>(max);
ImGui::Spacing(); ImGui::Spacing();
ImGui::Separator(); ImGui::Separator();
} }
} }

View File

@ -5,52 +5,65 @@
void Updater::CheckForUpdate() void Updater::CheckForUpdate()
{ {
const char* link = "https://api.github.com/repos/user-grinch/Cheat-Menu/tags"; const char* link = "https://api.github.com/repos/user-grinch/Cheat-Menu/tags";
char* path = PLUGIN_PATH((char*)"CheatMenu/json/versioninfo.json"); char* path = PLUGIN_PATH((char*)"CheatMenu/json/versioninfo.json");
HRESULT res = URLDownloadToFile(NULL, link, path, 0, NULL); HRESULT res = URLDownloadToFile(NULL, link, path, 0, NULL);
if (res == E_OUTOFMEMORY || res == INET_E_DOWNLOAD_FAILURE) if (res == E_OUTOFMEMORY || res == INET_E_DOWNLOAD_FAILURE)
{ {
CHud::SetHelpMessage("Failed to check for updates",false,false,false); CHud::SetHelpMessage("Failed to check for updates", false, false, false);
return; return;
} }
CJson verinfo = CJson("versioninfo"); CJson verinfo = CJson("versioninfo");
// fetch the version number // fetch the version number
latest_version = verinfo.data.items().begin().value()["name"].get<std::string>(); m_LatestVersion = verinfo.m_Data.items().begin().value()["name"].get<std::string>();
if (latest_version > MENU_VERSION_NUMBER) if (m_LatestVersion > MENU_VERSION_NUMBER)
{ {
CHud::SetHelpMessage("Update found",false,false,false); CHud::SetHelpMessage("Update found", false, false, false);
state = UPDATER_UPDATE_FOUND; m_State = UPDATER_UPDATE_FOUND;
} }
else else
{ {
CHud::SetHelpMessage("No update found.",false,false,false); CHud::SetHelpMessage("No update found.", false, false, false);
Updater::state = UPDATER_IDLE; Updater::m_State = UPDATER_IDLE;
} }
} }
void Updater::ShowUpdateScreen() void Updater::ShowUpdateScreen()
{ {
ImGui::Dummy(ImVec2(0,20)); ImGui::Dummy(ImVec2(0, 20));
Ui::CenterdText("A new version of the mod is available."); Ui::CenterdText("A new version of the mod is available.");
Ui::CenterdText(std::string("Current version: ") + MENU_VERSION); Ui::CenterdText(std::string("Current version: ") + MENU_VERSION);
Ui::CenterdText("Latest version: " + Updater::latest_version); Ui::CenterdText("Latest version: " + Updater::m_LatestVersion);
ImGui::Dummy(ImVec2(0,10)); ImGui::Dummy(ImVec2(0, 10));
ImGui::TextWrapped("In order to keep using the menu, you need to update to the latest version." ImGui::TextWrapped("In order to keep using the menu, you need to update to the latest version."
" This is to ensure everything is using the most up-to-date version."); " This is to ensure everything is using the most up-to-date version.");
ImGui::Dummy(ImVec2(0,10)); ImGui::Dummy(ImVec2(0, 10));
ImGui::TextWrapped("To know what changes are made or to download, click on the \"Download page\" button." ImGui::TextWrapped("To know what changes are made or to download, click on the \"Download page\" button."
" Follow the instructions there. If you're still having issues, let me know on discord."); " Follow the instructions there. If you're still having issues, let me know on discord.");
ImGui::Dummy(ImVec2(0,5)); ImGui::Dummy(ImVec2(0, 5));
if (ImGui::Button("Discord server", ImVec2(Ui::GetSize(2)))) if (ImGui::Button("Discord server", ImVec2(Ui::GetSize(3))))
{
ShellExecute(NULL, "open", DISCORD_INVITE, NULL, NULL, SW_SHOWNORMAL); ShellExecute(NULL, "open", DISCORD_INVITE, NULL, NULL, SW_SHOWNORMAL);
}
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Download page",Ui::GetSize(2))) if (ImGui::Button("Download page", Ui::GetSize(3)))
ShellExecute(NULL, "open", std::string("https://github.com/user-grinch/Cheat-Menu/releases/tag/" + {
Updater::latest_version).c_str(), NULL, NULL, SW_SHOWNORMAL); ShellExecute(NULL, "open", std::string("https://github.com/user-grinch/Cheat-Menu/releases/tag/" +
} Updater::m_LatestVersion).c_str(), NULL, NULL, SW_SHOWNORMAL);
}
ImGui::SameLine();
if (ImGui::Button("Hide page", Ui::GetSize(3)))
{
Updater::m_State = UPDATER_IDLE;
}
}

View File

@ -3,17 +3,17 @@
enum UPDATER_STATE enum UPDATER_STATE
{ {
UPDATER_IDLE, UPDATER_IDLE,
UPDATER_CHECKING, UPDATER_CHECKING,
UPDATER_UPDATE_FOUND UPDATER_UPDATE_FOUND
}; };
class Updater class Updater
{ {
public: public:
inline static UPDATER_STATE state = UPDATER_IDLE; inline static UPDATER_STATE m_State = UPDATER_IDLE;
inline static std::string latest_version = ""; inline static std::string m_LatestVersion;
static void CheckForUpdate(); static void CheckForUpdate();
static void ShowUpdateScreen(); static void ShowUpdateScreen();
}; };

View File

@ -25,8 +25,8 @@ void Util::ClearCharTasksVehCheck(CPed* ped)
} }
} }
void Util::ReleaseTextures(std::vector<std::unique_ptr<TextureStructure>> &store_vec) void Util::ReleaseTextures(std::vector<std::unique_ptr<STextureStructure>>& store_vec)
{ {
// for (auto &it : store_vec) // for (auto &it : store_vec)
// { // {
// if (Globals::renderer == Render_DirectX9) // if (Globals::renderer == Render_DirectX9)
@ -39,28 +39,32 @@ void Util::ReleaseTextures(std::vector<std::unique_ptr<TextureStructure>> &store
// } // }
} }
void Util::LoadTexturesInDirRecursive(const char* path, const char* file_ext, std::vector<std::string>& category_vec, std::vector<std::unique_ptr<TextureStructure>>& store_vec) void Util::LoadTexturesInDirRecursive(const char* path, const char* file_ext, std::vector<std::string>& category_vec,
std::vector<std::unique_ptr<STextureStructure>>& store_vec)
{ {
std::string folder = ""; std::string folder = "";
for (auto& p : fs::recursive_directory_iterator(path)) for (auto& p : fs::recursive_directory_iterator(path))
{ {
if (p.path().extension() == file_ext) if (p.path().extension() == file_ext)
{ {
store_vec.push_back(std::make_unique<TextureStructure>()); store_vec.push_back(std::make_unique<STextureStructure>());
HRESULT hr = -1; HRESULT hr = -1;
if (Globals::renderer == Render_DirectX9) if (Globals::renderer == Render_DirectX9)
hr = D3DXCreateTextureFromFileA(GetD3DDevice(), p.path().string().c_str(), reinterpret_cast<PDIRECT3DTEXTURE9*>(&store_vec.back().get()->texture)); hr = D3DXCreateTextureFromFileA(GetD3DDevice(), p.path().string().c_str(),
reinterpret_cast<PDIRECT3DTEXTURE9*>(&store_vec.back().get()->m_pTexture));
else else
{ {
if (LoadTextureFromFileDx11(p.path().string().c_str(), reinterpret_cast<ID3D11ShaderResourceView**>(&store_vec.back().get()->texture))) if (LoadTextureFromFileDx11(p.path().string().c_str(),
reinterpret_cast<ID3D11ShaderResourceView**>(&store_vec.back().get()->
m_pTexture)))
hr = S_OK; hr = S_OK;
} }
if (hr == S_OK) if (hr == S_OK)
{ {
store_vec.back().get()->file_name = p.path().stem().string(); store_vec.back().get()->m_FileName = p.path().stem().string();
store_vec.back().get()->category_name = folder; store_vec.back().get()->m_CategoryName = folder;
} }
else else
{ {
@ -81,8 +85,8 @@ bool Util::LoadTextureFromFileDx11(const char* filename, ID3D11ShaderResourceVie
// Load from disk into a raw RGBA buffer // Load from disk into a raw RGBA buffer
int image_width = 0; int image_width = 0;
int image_height = 0; int image_height = 0;
unsigned char* image_data = stbi_load(filename, &image_width, &image_height, NULL, 4); unsigned char* image_data = stbi_load(filename, &image_width, &image_height, nullptr, 4);
if (image_data == NULL) if (image_data == nullptr)
return false; return false;
// Create texture // Create texture
@ -98,7 +102,7 @@ bool Util::LoadTextureFromFileDx11(const char* filename, ID3D11ShaderResourceVie
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
desc.CPUAccessFlags = 0; desc.CPUAccessFlags = 0;
ID3D11Texture2D* pTexture = NULL; ID3D11Texture2D* pTexture = nullptr;
D3D11_SUBRESOURCE_DATA subResource; D3D11_SUBRESOURCE_DATA subResource;
subResource.pSysMem = image_data; subResource.pSysMem = image_data;
subResource.SysMemPitch = desc.Width * 4; subResource.SysMemPitch = desc.Width * 4;
@ -123,7 +127,8 @@ bool Util::LoadTextureFromFileDx11(const char* filename, ID3D11ShaderResourceVie
bool Util::IsOnMission() bool Util::IsOnMission()
{ {
return FindPlayerPed()->CanPlayerStartMission() && !*(patch::Get<char*>(0x5D5380, false) + CTheScripts::OnAMissionFlag); return FindPlayerPed()->CanPlayerStartMission() && !*(patch::Get<char*>(0x5D5380, false) +
CTheScripts::OnAMissionFlag);
} }
bool Util::IsOnCutscene() bool Util::IsOnCutscene()
@ -143,25 +148,23 @@ std::string Util::GetLocationName(CVector* pos)
switch (city) switch (city)
{ {
case 0: case 0:
town = "CS"; town = "CS";
break; break;
case 1: case 1:
town = "LS"; town = "LS";
break; break;
case 2: case 2:
town = "SF"; town = "SF";
break; break;
case 3: case 3:
town = "LV"; town = "LV";
break; break;
} }
if (interior == 0) if (interior == 0)
return CTheZones::FindSmallestZoneForPosition(*pos, true)->GetTranslatedName() + std::string(", ") + town; return CTheZones::FindSmallestZoneForPosition(*pos, true)->GetTranslatedName() + std::string(", ") + town;
else return std::string("Interior ") + std::to_string(interior) + ", " + town;
return std::string("Interior ") + std::to_string(interior) + ", " + town;
} }
int Util::GetLargestGangInZone() int Util::GetLargestGangInZone()
@ -171,7 +174,7 @@ int Util::GetLargestGangInZone()
for (int i = 0; i != 10; ++i) for (int i = 0; i != 10; ++i)
{ {
CVector pos = FindPlayerPed()->GetPosition(); CVector pos = FindPlayerPed()->GetPosition();
CZone* zone = new CZone(); auto zone = new CZone();
CZoneExtraInfo* zone_info = CTheZones::GetZoneInfo(&pos, &zone); CZoneExtraInfo* zone_info = CTheZones::GetZoneInfo(&pos, &zone);
int density = zone_info->m_nGangDensity[i]; int density = zone_info->m_nGangDensity[i];
@ -198,7 +201,7 @@ CVehicle* Util::GetClosestVehicle()
CVehicle* veh = nullptr; CVehicle* veh = nullptr;
for (int i = 0; i < 16; i++) for (int i = 0; i < 16; i++)
{ {
veh = (CVehicle*)pedintel->m_vehicleScanner.m_apEntities[i]; veh = static_cast<CVehicle*>(pedintel->m_vehicleScanner.m_apEntities[i]);
if (veh && !veh->m_nVehicleFlags.bFadeOut) if (veh && !veh->m_nVehicleFlags.bFadeOut)
break; break;
veh = nullptr; veh = nullptr;
@ -219,7 +222,7 @@ CPed* Util::GetClosestPed()
for (int i = 0; i < 16; i++) for (int i = 0; i < 16; i++)
{ {
ped = (CPed*)pedintel->m_pedScanner.m_apEntities[i]; ped = static_cast<CPed*>(pedintel->m_pedScanner.m_apEntities[i]);
if (ped && ped != player && (ped->m_nCreatedBy & 0xFF) == 1 && !ped->m_nPedFlags.bFadeOut) if (ped && ped != player && (ped->m_nCreatedBy & 0xFF) == 1 && !ped->m_nPedFlags.bFadeOut)
break; break;
ped = nullptr; ped = nullptr;
@ -261,7 +264,7 @@ RwTexture* Util::LoadTextureFromPngFile(fs::path path)
void Util::GetCPUUsageInit() void Util::GetCPUUsageInit()
{ {
PdhOpenQuery(NULL, NULL, &cpuQuery); PdhOpenQuery(nullptr, NULL, &cpuQuery);
PdhAddEnglishCounter(cpuQuery, "\\Processor(_Total)\\% Processor Time", NULL, &cpuTotal); PdhAddEnglishCounter(cpuQuery, "\\Processor(_Total)\\% Processor Time", NULL, &cpuTotal);
PdhCollectQueryData(cpuQuery); PdhCollectQueryData(cpuQuery);
} }
@ -271,6 +274,6 @@ double Util::GetCurrentCPUUsage()
PDH_FMT_COUNTERVALUE counterVal; PDH_FMT_COUNTERVALUE counterVal;
PdhCollectQueryData(cpuQuery); PdhCollectQueryData(cpuQuery);
PdhGetFormattedCounterValue(cpuTotal, PDH_FMT_DOUBLE, NULL, &counterVal); PdhGetFormattedCounterValue(cpuTotal, PDH_FMT_DOUBLE, nullptr, &counterVal);
return counterVal.doubleValue; return counterVal.doubleValue;
} }

View File

@ -15,17 +15,18 @@ private:
public: public:
static void ClearCharTasksVehCheck(CPed* ped); static void ClearCharTasksVehCheck(CPed* ped);
static CPed *GetClosestPed(); static CPed* GetClosestPed();
static CVehicle *GetClosestVehicle(); static CVehicle* GetClosestVehicle();
static int GetLargestGangInZone(); static int GetLargestGangInZone();
static void LoadTexturesInDirRecursive(const char * path, const char * file_ext, std::vector<std::string>& category_vec, std::vector<std::unique_ptr<TextureStructure>> &store_vec); static void LoadTexturesInDirRecursive(const char* path, const char* file_ext,
static void ReleaseTextures(std::vector<std::unique_ptr<TextureStructure>> &store_vec); std::vector<std::string>& category_vec,
std::vector<std::unique_ptr<STextureStructure>>& store_vec);
static void ReleaseTextures(std::vector<std::unique_ptr<STextureStructure>>& store_vec);
static bool IsOnCutscene(); static bool IsOnCutscene();
static bool IsOnMission(); static bool IsOnMission();
static std::string GetLocationName(CVector *pos); static std::string GetLocationName(CVector* pos);
static void RainbowValues(int &r, int&g, int &b, float speed); static void RainbowValues(int& r, int& g, int& b, float speed);
static RwTexture* LoadTextureFromPngFile(fs::path path); static RwTexture* LoadTextureFromPngFile(fs::path path);
static void GetCPUUsageInit(); static void GetCPUUsageInit();
static double GetCurrentCPUUsage(); static double GetCurrentCPUUsage();
}; };

View File

@ -1,41 +1,41 @@
#pragma once #pragma once
#define VK_NONE -1 #define VK_NONE -1
#define VK_KEY_0 0x30 #define VK_KEY_0 0x30
#define VK_KEY_1 0x31 #define VK_KEY_1 0x31
#define VK_KEY_2 0x32 #define VK_KEY_2 0x32
#define VK_KEY_3 0x33 #define VK_KEY_3 0x33
#define VK_KEY_4 0x34 #define VK_KEY_4 0x34
#define VK_KEY_5 0x35 #define VK_KEY_5 0x35
#define VK_KEY_6 0x36 #define VK_KEY_6 0x36
#define VK_KEY_7 0x37 #define VK_KEY_7 0x37
#define VK_KEY_8 0x38 #define VK_KEY_8 0x38
#define VK_KEY_9 0x39 #define VK_KEY_9 0x39
#define VK_KEY_A 0x41 #define VK_KEY_A 0x41
#define VK_KEY_B 0x42 #define VK_KEY_B 0x42
#define VK_KEY_C 0x43 #define VK_KEY_C 0x43
#define VK_KEY_D 0x44 #define VK_KEY_D 0x44
#define VK_KEY_E 0x45 #define VK_KEY_E 0x45
#define VK_KEY_F 0x46 #define VK_KEY_F 0x46
#define VK_KEY_G 0x47 #define VK_KEY_G 0x47
#define VK_KEY_H 0x48 #define VK_KEY_H 0x48
#define VK_KEY_I 0x49 #define VK_KEY_I 0x49
#define VK_KEY_J 0x4A #define VK_KEY_J 0x4A
#define VK_KEY_K 0x4B #define VK_KEY_K 0x4B
#define VK_KEY_L 0x4C #define VK_KEY_L 0x4C
#define VK_KEY_M 0x4D #define VK_KEY_M 0x4D
#define VK_KEY_N 0x4E #define VK_KEY_N 0x4E
#define VK_KEY_O 0x4F #define VK_KEY_O 0x4F
#define VK_KEY_P 0x50 #define VK_KEY_P 0x50
#define VK_KEY_Q 0x51 #define VK_KEY_Q 0x51
#define VK_KEY_R 0x52 #define VK_KEY_R 0x52
#define VK_KEY_S 0x53 #define VK_KEY_S 0x53
#define VK_KEY_T 0x54 #define VK_KEY_T 0x54
#define VK_KEY_U 0x55 #define VK_KEY_U 0x55
#define VK_KEY_V 0x56 #define VK_KEY_V 0x56
#define VK_KEY_W 0x57 #define VK_KEY_W 0x57
#define VK_KEY_X 0x58 #define VK_KEY_X 0x58
#define VK_KEY_Y 0x59 #define VK_KEY_Y 0x59
#define VK_KEY_Z 0x5A #define VK_KEY_Z 0x5A
@ -207,4 +207,4 @@ static std::string key_names[]
"RCtrl", "RCtrl",
"LMenu", "LMenu",
"RMenu" "RMenu"
}; };

View File

@ -10,13 +10,19 @@ Vehicle::Vehicle()
ParseCarcolsDAT(); ParseCarcolsDAT();
Events::processScriptsEvent += [this] Events::processScriptsEvent += [this]
{ {
if (!images_loaded) if (!m_bImagesLoaded)
{ {
Util::LoadTexturesInDirRecursive(PLUGIN_PATH((char*)"CheatMenu\\vehicles\\images\\"), ".jpg", spawner::veh_data.categories, spawner::veh_data.images); Util::LoadTexturesInDirRecursive(
Util::LoadTexturesInDirRecursive(PLUGIN_PATH((char*)"CheatMenu\\vehicles\\components\\"), ".jpg", tune_data.categories, tune_data.images); PLUGIN_PATH((char*)"CheatMenu\\vehicles\\images\\"), ".jpg", m_Spawner.m_VehData.m_Categories,
Util::LoadTexturesInDirRecursive(PLUGIN_PATH((char*)"CheatMenu\\vehicles\\paintjobs\\"), ".png", texture_data.categories, texture_data.images); m_Spawner.m_VehData.m_ImagesList);
Util::LoadTexturesInDirRecursive(
PLUGIN_PATH((char*)"CheatMenu\\vehicles\\components\\"), ".jpg", m_TuneData.m_Categories,
m_TuneData.m_ImagesList);
Util::LoadTexturesInDirRecursive(
PLUGIN_PATH((char*)"CheatMenu\\vehicles\\paintjobs\\"), ".png", m_TextureData.m_Categories,
m_TextureData.m_ImagesList);
images_loaded = true; m_bImagesLoaded = true;
} }
uint timer = CTimer::m_snTimeInMilliseconds; uint timer = CTimer::m_snTimeInMilliseconds;
@ -27,7 +33,7 @@ Vehicle::Vehicle()
{ {
int hveh = CPools::GetVehicleRef(veh); int hveh = CPools::GetVehicleRef(veh);
if (Ui::HotKeyPressed(Menu::hotkeys::flip_veh)) if (Ui::HotKeyPressed(Menu::m_HotKeys.flipVeh))
{ {
float roll; float roll;
Command<Commands::GET_CAR_ROLL>(hveh, &roll); Command<Commands::GET_CAR_ROLL>(hveh, &roll);
@ -36,14 +42,14 @@ Vehicle::Vehicle()
Command<Commands::SET_CAR_ROLL>(hveh, roll); // z rot fix Command<Commands::SET_CAR_ROLL>(hveh, roll); // z rot fix
} }
if (Ui::HotKeyPressed(Menu::hotkeys::fix_veh)) if (Ui::HotKeyPressed(Menu::m_HotKeys.fixVeh))
{ {
player->m_pVehicle->Fix(); player->m_pVehicle->Fix();
player->m_pVehicle->m_fHealth = 1000.0f; player->m_pVehicle->m_fHealth = 1000.0f;
CHud::SetHelpMessage("Vehicle fixed", false, false, false); CHud::SetHelpMessage("Vehicle fixed", false, false, false);
} }
if (Ui::HotKeyPressed(Menu::hotkeys::veh_engine)) if (Ui::HotKeyPressed(Menu::m_HotKeys.vehEngine))
{ {
bool state = !veh->m_nVehicleFlags.bEngineBroken || veh->m_nVehicleFlags.bEngineOn; bool state = !veh->m_nVehicleFlags.bEngineBroken || veh->m_nVehicleFlags.bEngineOn;
@ -56,13 +62,13 @@ Vehicle::Vehicle()
veh->m_nVehicleFlags.bEngineOn = !state; veh->m_nVehicleFlags.bEngineOn = !state;
} }
if (Ui::HotKeyPressed(Menu::hotkeys::veh_instant_start)) if (Ui::HotKeyPressed(Menu::m_HotKeys.vehInstantStart))
Command<Commands::SET_CAR_FORWARD_SPEED>(hveh, 40.0f); Command<Commands::SET_CAR_FORWARD_SPEED>(hveh, 40.0f);
if (Ui::HotKeyPressed(Menu::hotkeys::veh_instant_stop)) if (Ui::HotKeyPressed(Menu::m_HotKeys.vehInstantStop))
Command<Commands::SET_CAR_FORWARD_SPEED>(hveh, 0); Command<Commands::SET_CAR_FORWARD_SPEED>(hveh, 0);
if (veh_nodmg) if (m_bNoDamage)
{ {
veh->m_nPhysicalFlags.bBulletProof = true; veh->m_nPhysicalFlags.bBulletProof = true;
veh->m_nPhysicalFlags.bExplosionProof = true; veh->m_nPhysicalFlags.bExplosionProof = true;
@ -72,48 +78,48 @@ Vehicle::Vehicle()
veh->m_nVehicleFlags.bCanBeDamaged = true; veh->m_nVehicleFlags.bCanBeDamaged = true;
} }
player->m_nPedFlags.CantBeKnockedOffBike = dont_fall_bike ? 1 : 2; player->m_nPedFlags.CantBeKnockedOffBike = m_bDontFallBike ? 1 : 2;
Command<Commands::SET_CAR_HEAVY>(hveh, veh_heavy); Command<Commands::SET_CAR_HEAVY>(hveh, m_bVehHeavy);
Command<Commands::SET_CAR_WATERTIGHT>(hveh, veh_watertight); Command<Commands::SET_CAR_WATERTIGHT>(hveh, m_bVehWatertight);
if (unlimited_nitro::enabled && player->m_pVehicle->m_nVehicleSubClass == VEHICLE_AUTOMOBILE) if (m_UnlimitedNitro.m_bEnabled && player->m_pVehicle->m_nVehicleSubClass == VEHICLE_AUTOMOBILE)
{ {
patch::Set<BYTE>(0x969165, 0, true); // All cars have nitro patch::Set<BYTE>(0x969165, 0, true); // All cars have nitro
patch::Set<BYTE>(0x96918B, 0, true); // All taxis have nitro patch::Set<BYTE>(0x96918B, 0, true); // All taxis have nitro
if (KeyPressed(VK_LBUTTON)) if (KeyPressed(VK_LBUTTON))
{ {
if (!unlimited_nitro::comp_added) if (!m_UnlimitedNitro.m_bCompAdded)
{ {
AddComponent("1010", false); AddComponent("1010", false);
unlimited_nitro::comp_added = true; m_UnlimitedNitro.m_bCompAdded = true;
} }
} }
else else
{ {
if (unlimited_nitro::comp_added) if (m_UnlimitedNitro.m_bCompAdded)
{ {
RemoveComponent("1010", false); RemoveComponent("1010", false);
unlimited_nitro::comp_added = false; m_UnlimitedNitro.m_bCompAdded = false;
} }
} }
} }
if (lock_speed) if (m_bLockSpeed)
Command<Commands::SET_CAR_FORWARD_SPEED>(hveh, lock_speed_val); Command<Commands::SET_CAR_FORWARD_SPEED>(hveh, m_fLockSpeed);
if (neon::rainbow && timer - neon::rainbow_timer > 50) if (m_Neon.m_bRainbowEffect && timer - m_Neon.m_nRainbowTimer > 50)
{ {
int red, green, blue; int red, green, blue;
Util::RainbowValues(red, green, blue, 0.25); Util::RainbowValues(red, green, blue, 0.25);
InstallNeon(veh, red, green, blue); InstallNeon(veh, red, green, blue);
neon::rainbow_timer = timer; m_Neon.m_nRainbowTimer = timer;
} }
} }
// Traffic neons // Traffic neons
if (neon::traffic && timer - neon::traffic_timer > 1000) if (m_Neon.m_bApplyOnTraffic && timer - m_Neon.m_bTrafficTimer > 1000)
{ {
for (CVehicle* veh : CPools::ms_pVehiclePool) for (CVehicle* veh : CPools::ms_pVehiclePool)
{ {
@ -131,18 +137,18 @@ Vehicle::Vehicle()
if (chance == 1 && !IsNeonInstalled(veh) && veh->m_pDriver != player) if (chance == 1 && !IsNeonInstalled(veh) && veh->m_pDriver != player)
InstallNeon(veh, Random(0, 255), Random(0, 255), Random(0, 255)); InstallNeon(veh, Random(0, 255), Random(0, 255), Random(0, 255));
} }
neon::traffic_timer = timer; m_Neon.m_bTrafficTimer = timer;
} }
if (bike_fly && veh && veh->IsDriver(player)) if (m_bBikeFly && veh && veh->IsDriver(player))
{ {
if (veh->m_nVehicleSubClass == VEHICLE_BIKE || veh->m_nVehicleSubClass == VEHICLE_BMX) if (veh->m_nVehicleSubClass == VEHICLE_BIKE || veh->m_nVehicleSubClass == VEHICLE_BMX)
{ {
if (sqrt(veh->m_vecMoveSpeed.x * veh->m_vecMoveSpeed.x if (sqrt(veh->m_vecMoveSpeed.x * veh->m_vecMoveSpeed.x
+ veh->m_vecMoveSpeed.y * veh->m_vecMoveSpeed.y + veh->m_vecMoveSpeed.y * veh->m_vecMoveSpeed.y
+ veh->m_vecMoveSpeed.z * veh->m_vecMoveSpeed.z + veh->m_vecMoveSpeed.z * veh->m_vecMoveSpeed.z
) > 0.0 ) > 0.0
&& CTimer::ms_fTimeStep > 0.0) && CTimer::ms_fTimeStep > 0.0)
{ {
veh->FlyingControl(3, -9999.9902f, -9999.9902f, -9999.9902f, -9999.9902f); veh->FlyingControl(3, -9999.9902f, -9999.9902f, -9999.9902f, -9999.9902f);
} }
@ -153,14 +159,15 @@ Vehicle::Vehicle()
Vehicle::~Vehicle() Vehicle::~Vehicle()
{ {
Util::ReleaseTextures(spawner::veh_data.images); Util::ReleaseTextures(m_Spawner.m_VehData.m_ImagesList);
Util::ReleaseTextures(tune_data.images); Util::ReleaseTextures(m_TuneData.m_ImagesList);
Util::ReleaseTextures(texture_data.images); Util::ReleaseTextures(m_TextureData.m_ImagesList);
} }
void Vehicle::AddComponent(const std::string& component, const bool display_message) void Vehicle::AddComponent(const std::string& component, const bool display_message)
{ {
try { try
{
CPlayerPed* player = FindPlayerPed(); CPlayerPed* player = FindPlayerPed();
int icomp = std::stoi(component); int icomp = std::stoi(component);
int hveh = CPools::GetVehicleRef(player->m_pVehicle); int hveh = CPools::GetVehicleRef(player->m_pVehicle);
@ -182,7 +189,8 @@ void Vehicle::AddComponent(const std::string& component, const bool display_mess
void Vehicle::RemoveComponent(const std::string& component, const bool display_message) void Vehicle::RemoveComponent(const std::string& component, const bool display_message)
{ {
try { try
{
CPlayerPed* player = FindPlayerPed(); CPlayerPed* player = FindPlayerPed();
int icomp = std::stoi(component); int icomp = std::stoi(component);
int hveh = CPools::GetVehicleRef(player->m_pVehicle); int hveh = CPools::GetVehicleRef(player->m_pVehicle);
@ -202,29 +210,29 @@ void Vehicle::RemoveComponent(const std::string& component, const bool display_m
int Vehicle::GetRandomTrainIdForModel(int model) int Vehicle::GetRandomTrainIdForModel(int model)
{ {
static int train_ids[] = { static int train_ids[] = {
8,9, // model 449 8, 9, // model 449
0,3,6,10,12,13, // model 537 0, 3, 6, 10, 12, 13, // model 537
1,5,15 // model 538 1, 5, 15 // model 538
}; };
int _start = 0, _end = 0; int _start = 0, _end = 0;
switch (model) switch (model)
{ {
case 449: case 449:
_start = 0; _start = 0;
_end = 1; _end = 1;
break; break;
case 537: case 537:
_start = 2; _start = 2;
_end = 7; _end = 7;
break; break;
case 538: case 538:
_start = 8; _start = 8;
_end = 10; _end = 10;
break; break;
default: default:
CHud::SetHelpMessage("Invalid train model", false, false, false); CHud::SetHelpMessage("Invalid train model", false, false, false);
return -1; return -1;
} }
int id = Random(_start, _end); int id = Random(_start, _end);
return train_ids[id]; return train_ids[id];
@ -233,11 +241,11 @@ int Vehicle::GetRandomTrainIdForModel(int model)
// Get vehicle HandlingId // Get vehicle HandlingId
void Vehicle::ParseVehiclesIDE() void Vehicle::ParseVehiclesIDE()
{ {
std::string file_path = std::string(paths::GetGameDirPathA()) + "/data/vehicles.ide"; std::string m_FilePath = std::string(paths::GetGameDirPathA()) + "/data/vehicles.ide";
if (fs::exists(file_path)) if (fs::exists(m_FilePath))
{ {
std::ifstream file(file_path); std::ifstream file(m_FilePath);
std::string line; std::string line;
while (getline(file, line)) while (getline(file, line))
@ -263,7 +271,7 @@ void Vehicle::ParseVehiclesIDE()
temp.erase(std::remove_if(temp.begin(), temp.end(), ::isspace), temp.end()); temp.erase(std::remove_if(temp.begin(), temp.end(), ::isspace), temp.end());
vehicle_ide[model] = temp; m_VehicleIDE[model] = temp;
} }
catch (...) catch (...)
{ {
@ -278,11 +286,11 @@ void Vehicle::ParseVehiclesIDE()
void Vehicle::ParseCarcolsDAT() void Vehicle::ParseCarcolsDAT()
{ {
std::string file_path = std::string(paths::GetGameDirPathA()) + "/data/carcols.dat"; std::string m_FilePath = std::string(paths::GetGameDirPathA()) + "/data/carcols.dat";
if (fs::exists(file_path)) if (fs::exists(m_FilePath))
{ {
std::ifstream file(file_path); std::ifstream file(m_FilePath);
std::string line; std::string line;
bool car_section = false; bool car_section = false;
@ -331,8 +339,8 @@ void Vehicle::ParseCarcolsDAT()
getline(ss, temp, ','); getline(ss, temp, ',');
int blue = std::stoi(temp); int blue = std::stoi(temp);
std::vector<float> color = { red / 255.0f,green / 255.0f,blue / 255.0f }; std::vector<float> color = {red / 255.0f, green / 255.0f, blue / 255.0f};
carcols_color_values.push_back(color); m_CarcolsColorData.push_back(color);
++count; ++count;
} }
@ -353,13 +361,15 @@ void Vehicle::ParseCarcolsDAT()
{ {
try try
{ {
std::for_each(name.begin(), name.end(), [](char& c) { std::for_each(name.begin(), name.end(), [](char& c)
{
c = ::toupper(c); c = ::toupper(c);
}); });
int val = std::stoi(temp); int val = std::stoi(temp);
if (!(std::find(carcols_car_data[name].begin(), carcols_car_data[name].end(), val) != carcols_car_data[name].end())) if (!(std::find(m_CarcolsCarData[name].begin(), m_CarcolsCarData[name].end(), val) !=
carcols_car_data[name].push_back(val); m_CarcolsCarData[name].end()))
m_CarcolsCarData[name].push_back(val);
} }
catch (...) catch (...)
{ {
@ -389,7 +399,7 @@ void Vehicle::SpawnVehicle(std::string& smodel)
CVector pos = player->GetPosition(); CVector pos = player->GetPosition();
int speed = 0; int speed = 0;
if (player->m_nPedFlags.bInVehicle && spawner::spawn_inside) if (player->m_nPedFlags.bInVehicle && m_Spawner.m_bSpawnInside)
{ {
int hveh = 0; int hveh = 0;
Command<Commands::GET_CAR_CHAR_IS_USING>(hplayer, &hveh); Command<Commands::GET_CAR_CHAR_IS_USING>(hplayer, &hveh);
@ -407,7 +417,7 @@ void Vehicle::SpawnVehicle(std::string& smodel)
} }
if (interior == 0) if (interior == 0)
if (spawner::spawn_in_air && (CModelInfo::IsHeliModel(imodel) || CModelInfo::IsPlaneModel(imodel))) if (m_Spawner.m_bSpawnInAir && (CModelInfo::IsHeliModel(imodel) || CModelInfo::IsPlaneModel(imodel)))
pos.z = 400; pos.z = 400;
else else
pos.z -= 5; pos.z -= 5;
@ -436,14 +446,15 @@ void Vehicle::SpawnVehicle(std::string& smodel)
CTrain* carraige = nullptr; CTrain* carraige = nullptr;
int track = Random(0, 1); int track = Random(0, 1);
int node = CTrain::FindClosestTrackNode(pos, &track); int node = CTrain::FindClosestTrackNode(pos, &track);
CTrain::CreateMissionTrain(pos, (Random(0, 1)) == 1 ? true : false, train_id, &train, &carraige, node, track, false); CTrain::CreateMissionTrain(pos, (Random(0, 1)) == 1 ? true : false, train_id, &train, &carraige, node,
track, false);
veh = (CVehicle*)train; veh = (CVehicle*)train;
hveh = CPools::GetVehicleRef(veh); hveh = CPools::GetVehicleRef(veh);
if (veh->m_pDriver) if (veh->m_pDriver)
Command<Commands::DELETE_CHAR>(CPools::GetPedRef(veh->m_pDriver)); Command<Commands::DELETE_CHAR>(CPools::GetPedRef(veh->m_pDriver));
if (spawner::spawn_inside) if (m_Spawner.m_bSpawnInside)
{ {
Command<Commands::WARP_CHAR_INTO_CAR>(hplayer, hveh); Command<Commands::WARP_CHAR_INTO_CAR>(hplayer, hveh);
Command<Commands::SET_CAR_FORWARD_SPEED>(hveh, speed); Command<Commands::SET_CAR_FORWARD_SPEED>(hveh, speed);
@ -462,11 +473,11 @@ void Vehicle::SpawnVehicle(std::string& smodel)
CStreaming::RequestModel(imodel, PRIORITY_REQUEST); CStreaming::RequestModel(imodel, PRIORITY_REQUEST);
CStreaming::LoadAllRequestedModels(false); CStreaming::LoadAllRequestedModels(false);
if (spawner::license_text[0] != '\0') if (m_Spawner.m_nLicenseText[0] != '\0')
Command<Commands::CUSTOM_PLATE_FOR_NEXT_CAR>(imodel, spawner::license_text); Command<Commands::CUSTOM_PLATE_FOR_NEXT_CAR>(imodel, m_Spawner.m_nLicenseText);
int hveh = 0; int hveh = 0;
if (spawner::spawn_inside) if (m_Spawner.m_bSpawnInside)
{ {
Command<Commands::CREATE_CAR>(imodel, pos.x, pos.y, pos.z + 4.0f, &hveh); Command<Commands::CREATE_CAR>(imodel, pos.x, pos.y, pos.z + 4.0f, &hveh);
veh = CPools::GetVehicle(hveh); veh = CPools::GetVehicle(hveh);
@ -513,7 +524,7 @@ void Vehicle::GenerateHandlingDataFile(int phandling)
{ {
FILE* fp = fopen("handling.txt", "w"); FILE* fp = fopen("handling.txt", "w");
std::string handlingId = vehicle_ide[FindPlayerPed()->m_pVehicle->m_nModelIndex]; std::string handlingId = m_VehicleIDE[FindPlayerPed()->m_pVehicle->m_nModelIndex];
float fMass = patch::Get<float>(phandling + 0x4); float fMass = patch::Get<float>(phandling + 0x4);
float fTurnMass = patch::Get<float>(phandling + 0xC); float fTurnMass = patch::Get<float>(phandling + 0xC);
float fDragMult = patch::Get<float>(phandling + 0x10); float fDragMult = patch::Get<float>(phandling + 0x10);
@ -554,11 +565,17 @@ void Vehicle::GenerateHandlingDataFile(int phandling)
int nNumberOfGears = patch::Get<BYTE>(phandling + 0x76); int nNumberOfGears = patch::Get<BYTE>(phandling + 0x76);
float fSeatOffsetDistance = patch::Get<float>(phandling + 0xD4); float fSeatOffsetDistance = patch::Get<float>(phandling + 0xD4);
fprintf(fp, "\n%s\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%d\t%.5g\t%.5g\t%.5g\t%d\t%d\t%.5g\t%.5g\t%c\t%c\t%.5g\t%.5g\t%d\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%d\t%d\t%d\t%d\t%d\t%d", fprintf(
handlingId.c_str(), fMass, fTurnMass, fDragMult, CentreOfMassX, CentreOfMassY, CentreOfMassZ, nPercentSubmerged, fTractionMultiplier, fTractionLoss, TractionBias, nNumberOfGears, fp,
MaxVelocity, fEngineAcceleration, fEngineInertia, nDriveType, nEngineType, BrakeDeceleration, BrakeBias, ABS, SteeringLock, SuspensionForceLevel, SuspensionDampingLevel, "\n%s\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%d\t%.5g\t%.5g\t%.5g\t%d\t%d\t%.5g\t%.5g\t%c\t%c\t%.5g\t%.5g\t%d\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%.5g\t%d\t%d\t%d\t%d\t%d\t%d",
SuspensionHighSpdComDamp, Suspension_upper_limit, Suspension_lower_limit, Suspension_bias, Suspension_anti_dive_multiplier, fSeatOffsetDistance, handlingId.c_str(), fMass, fTurnMass, fDragMult, CentreOfMassX, CentreOfMassY, CentreOfMassZ, nPercentSubmerged,
fCollisionDamageMultiplier, nMonetaryValue, modelFlags, handlingFlags, front_lights, rear_lights, vehicle_anim_group); fTractionMultiplier, fTractionLoss, TractionBias, nNumberOfGears,
MaxVelocity, fEngineAcceleration, fEngineInertia, nDriveType, nEngineType, BrakeDeceleration, BrakeBias, ABS,
SteeringLock, SuspensionForceLevel, SuspensionDampingLevel,
SuspensionHighSpdComDamp, Suspension_upper_limit, Suspension_lower_limit, Suspension_bias,
Suspension_anti_dive_multiplier, fSeatOffsetDistance,
fCollisionDamageMultiplier, nMonetaryValue, modelFlags, handlingFlags, front_lights, rear_lights,
vehicle_anim_group);
fclose(fp); fclose(fp);
} }
@ -582,7 +599,6 @@ void Vehicle::Draw()
player->m_pVehicle->Fix(); player->m_pVehicle->Fix();
player->m_pVehicle->m_fHealth = 1000.0f; player->m_pVehicle->m_fHealth = 1000.0f;
} }
} }
ImGui::SameLine(); ImGui::SameLine();
@ -620,13 +636,14 @@ void Vehicle::Draw()
Ui::CheckboxAddress("Aim while driving", 0x969179); Ui::CheckboxAddress("Aim while driving", 0x969179);
Ui::CheckboxAddress("All cars have nitro", 0x969165); Ui::CheckboxAddress("All cars have nitro", 0x969165);
Ui::CheckboxAddress("All taxis have nitro", 0x96918B); Ui::CheckboxAddress("All taxis have nitro", 0x96918B);
Ui::CheckboxWithHint("Bikes fly", &bike_fly); Ui::CheckboxWithHint("Bikes fly", &m_bBikeFly);
Ui::CheckboxAddress("Boats fly", 0x969153); Ui::CheckboxAddress("Boats fly", 0x969153);
Ui::CheckboxAddress("Cars fly", 0x969160); Ui::CheckboxAddress("Cars fly", 0x969160);
Ui::CheckboxWithHint("Cars heavy", &veh_heavy); Ui::CheckboxWithHint("Cars heavy", &m_bVehHeavy);
if (Ui::CheckboxWithHint("Damage proof", &veh_nodmg, "Every vehicle entered will be damage proof\nBullet, Collision, Explosion, Fire, Meele etc")) if (Ui::CheckboxWithHint("Damage proof", &m_bNoDamage,
"Every vehicle entered will be damage proof\nBullet, Collision, Explosion, Fire, Meele etc"))
{ {
if (pVeh && !veh_nodmg) if (pVeh && !m_bNoDamage)
{ {
pVeh->m_nVehicleFlags.bCanBeDamaged = true; pVeh->m_nVehicleFlags.bCanBeDamaged = true;
pVeh->m_nPhysicalFlags.bBulletProof = false; pVeh->m_nPhysicalFlags.bBulletProof = false;
@ -640,16 +657,16 @@ void Vehicle::Draw()
ImGui::NextColumn(); ImGui::NextColumn();
Ui::CheckboxWithHint("Don't fall off bike", &dont_fall_bike); Ui::CheckboxWithHint("Don't fall off bike", &m_bDontFallBike);
Ui::CheckboxAddress("Drive on water", 0x969152); Ui::CheckboxAddress("Drive on water", 0x969152);
Ui::CheckboxAddressEx("Lock train camera", 0x52A52F, 171, 6); Ui::CheckboxAddressEx("Lock train camera", 0x52A52F, 171, 6);
Ui::CheckboxAddress("Float away when hit", 0x969166); Ui::CheckboxAddress("Float away when hit", 0x969166);
Ui::CheckboxAddress("Green traffic lights", 0x96914E); Ui::CheckboxAddress("Green traffic lights", 0x96914E);
Ui::CheckboxAddress("Perfect handling", 0x96914C); Ui::CheckboxAddress("Perfect handling", 0x96914C);
Ui::CheckboxAddress("Tank mode", 0x969164); Ui::CheckboxAddress("Tank mode", 0x969164);
Ui::CheckboxWithHint("Unlimited nitro", &unlimited_nitro::enabled, "Nitro will activate when left clicked\n\ Ui::CheckboxWithHint("Unlimited nitro", &m_UnlimitedNitro.m_bEnabled, "Nitro will activate when left clicked\n\
\nEnabling this would disable\nAll cars have nitro\nAll taxis have nitro"); \nEnabling this would disable\nAll cars have nitro\nAll taxis have nitro");
Ui::CheckboxWithHint("Watertight car", &veh_watertight); Ui::CheckboxWithHint("Watertight car", &m_bVehWatertight);
Ui::CheckboxAddress("Wheels only", 0x96914B); Ui::CheckboxAddress("Wheels only", 0x96914B);
ImGui::Columns(1); ImGui::Columns(1);
@ -665,11 +682,11 @@ void Vehicle::Draw()
pVeh->m_nVehicleFlags.bAlwaysSkidMarks = state; pVeh->m_nVehicleFlags.bAlwaysSkidMarks = state;
state = pVeh->m_nPhysicalFlags.bBulletProof; state = pVeh->m_nPhysicalFlags.bBulletProof;
if (Ui::CheckboxWithHint("Bullet proof", &state, nullptr, veh_nodmg)) if (Ui::CheckboxWithHint("Bullet proof", &state, nullptr, m_bNoDamage))
pVeh->m_nPhysicalFlags.bBulletProof = state; pVeh->m_nPhysicalFlags.bBulletProof = state;
state = pVeh->m_nPhysicalFlags.bCollisionProof; state = pVeh->m_nPhysicalFlags.bCollisionProof;
if (Ui::CheckboxWithHint("Collision proof", &state, nullptr, veh_nodmg)) if (Ui::CheckboxWithHint("Collision proof", &state, nullptr, m_bNoDamage))
pVeh->m_nPhysicalFlags.bCollisionProof = state; pVeh->m_nPhysicalFlags.bCollisionProof = state;
state = pVeh->m_nVehicleFlags.bDisableParticles; state = pVeh->m_nVehicleFlags.bDisableParticles;
@ -687,11 +704,11 @@ void Vehicle::Draw()
pVeh->m_nVehicleFlags.bEngineOn = state; pVeh->m_nVehicleFlags.bEngineOn = state;
} }
state = pVeh->m_nPhysicalFlags.bExplosionProof; state = pVeh->m_nPhysicalFlags.bExplosionProof;
if (Ui::CheckboxWithHint("Explosion proof", &state, nullptr, veh_nodmg)) if (Ui::CheckboxWithHint("Explosion proof", &state, nullptr, m_bNoDamage))
pVeh->m_nPhysicalFlags.bExplosionProof = state; pVeh->m_nPhysicalFlags.bExplosionProof = state;
state = pVeh->m_nPhysicalFlags.bFireProof; state = pVeh->m_nPhysicalFlags.bFireProof;
if (Ui::CheckboxWithHint("Fire proof", &state, nullptr, veh_nodmg)) if (Ui::CheckboxWithHint("Fire proof", &state, nullptr, m_bNoDamage))
pVeh->m_nPhysicalFlags.bFireProof = state; pVeh->m_nPhysicalFlags.bFireProof = state;
ImGui::NextColumn(); ImGui::NextColumn();
@ -718,7 +735,7 @@ void Vehicle::Draw()
} }
state = pVeh->m_nPhysicalFlags.bMeeleProof; state = pVeh->m_nPhysicalFlags.bMeeleProof;
if (Ui::CheckboxWithHint("Melee proof", &state, nullptr, veh_nodmg)) if (Ui::CheckboxWithHint("Melee proof", &state, nullptr, m_bNoDamage))
pVeh->m_nPhysicalFlags.bMeeleProof = state; pVeh->m_nPhysicalFlags.bMeeleProof = state;
state = pVeh->m_nVehicleFlags.bPetrolTankIsWeakPoint; state = pVeh->m_nVehicleFlags.bPetrolTankIsWeakPoint;
@ -771,7 +788,8 @@ void Vehicle::Draw()
if (i % 2 != 1) if (i % 2 != 1)
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button((std::string("Passenger ") + std::to_string(i + 1)).c_str(), ImVec2(Ui::GetSize(2)))) if (ImGui::Button((std::string("Passenger ") + std::to_string(i + 1)).c_str(),
ImVec2(Ui::GetSize(2))))
Command<Commands::WARP_CHAR_INTO_CAR_AS_PASSENGER>(hplayer, veh, i); Command<Commands::WARP_CHAR_INTO_CAR_AS_PASSENGER>(hplayer, veh, i);
} }
} }
@ -783,15 +801,15 @@ void Vehicle::Draw()
} }
if (ImGui::CollapsingHeader("Remove vehicles in radius")) if (ImGui::CollapsingHeader("Remove vehicles in radius"))
{ {
ImGui::InputInt("Radius", &veh_remove_radius); ImGui::InputInt("Radius", &m_nVehRemoveRadius);
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::Button("Remove vehicles", Ui::GetSize(1))) if (ImGui::Button("Remove vehicles", Ui::GetSize(1)))
{ {
CPlayerPed* player = FindPlayerPed(); CPlayerPed* player = FindPlayerPed();
for (CVehicle* veh : CPools::ms_pVehiclePool) for (CVehicle* veh : CPools::ms_pVehiclePool)
{ {
if (DistanceBetweenPoints(veh->GetPosition(), player->GetPosition()) < veh_remove_radius if (DistanceBetweenPoints(veh->GetPosition(), player->GetPosition()) < m_nVehRemoveRadius
&& player->m_pVehicle != veh) && player->m_pVehicle != veh)
Command<Commands::DELETE_CAR>(CPools::GetVehicleRef(veh)); Command<Commands::DELETE_CAR>(CPools::GetVehicleRef(veh));
} }
} }
@ -800,8 +818,10 @@ void Vehicle::Draw()
} }
if (ImGui::CollapsingHeader("Traffic options")) if (ImGui::CollapsingHeader("Traffic options"))
{ {
static std::vector<Ui::NamedMemory> color{ {"Black", 0x969151}, { "Pink",0x969150 } }; static std::vector<Ui::NamedMemory> color{{"Black", 0x969151}, {"Pink", 0x969150}};
static std::vector<Ui::NamedMemory> type{ {"Cheap", 0x96915E}, { "Country",0x96917B }, { "Fast",0x96915F } }; static std::vector<Ui::NamedMemory> type{
{"Cheap", 0x96915E}, {"Country", 0x96917B}, {"Fast", 0x96915F}
};
Ui::RadioButtonAddress("Color", color); Ui::RadioButtonAddress("Color", color);
ImGui::Spacing(); ImGui::Spacing();
@ -812,69 +832,69 @@ void Vehicle::Draw()
if (player && player->m_pVehicle) if (player && player->m_pVehicle)
{ {
CVehicle* veh = player->m_pVehicle; CVehicle* pVeh = player->m_pVehicle;
int hveh = CPools::GetVehicleRef(veh); int hVeh = CPools::GetVehicleRef(pVeh);
Ui::EditFloat("Dirt level", (int)veh + 0x4B0, 0, 7.5, 15); Ui::EditFloat("Dirt level", (int)pVeh + 0x4B0, 0, 7.5, 15);
if (veh->m_nVehicleClass == VEHICLE_AUTOMOBILE && ImGui::CollapsingHeader("Doors")) if (pVeh->m_nVehicleClass == VEHICLE_AUTOMOBILE && ImGui::CollapsingHeader("Doors"))
{ {
ImGui::Columns(2, 0, false); ImGui::Columns(2, 0, false);
ImGui::RadioButton("Damage", &door_menu_button, 0); ImGui::RadioButton("Damage", &m_nDoorMenuButton, 0);
ImGui::RadioButton("Fix", &door_menu_button, 1); ImGui::RadioButton("Fix", &m_nDoorMenuButton, 1);
ImGui::NextColumn(); ImGui::NextColumn();
ImGui::RadioButton("Open", &door_menu_button, 2); ImGui::RadioButton("Open", &m_nDoorMenuButton, 2);
ImGui::RadioButton("Pop", &door_menu_button, 3); ImGui::RadioButton("Pop", &m_nDoorMenuButton, 3);
ImGui::Columns(1); ImGui::Columns(1);
ImGui::Spacing(); ImGui::Spacing();
int seats = veh->m_nMaxPassengers + 1; // passenger + driver int seats = pVeh->m_nMaxPassengers + 1; // passenger + driver
int doors = seats == 4 ? 6 : 4; int doors = seats == 4 ? 6 : 4;
int hveh = CPools::GetVehicleRef(veh); int hveh = CPools::GetVehicleRef(pVeh);
if (ImGui::Button("All", ImVec2(Ui::GetSize()))) if (ImGui::Button("All", ImVec2(Ui::GetSize())))
{ {
for (int i = 0; i < doors; ++i) for (int i = 0; i < doors; ++i)
{ {
switch (door_menu_button) switch (m_nDoorMenuButton)
{ {
case 0: case 0:
Command<Commands::DAMAGE_CAR_DOOR>(hveh, i); Command<Commands::DAMAGE_CAR_DOOR>(hveh, i);
break; break;
case 1: case 1:
Command<Commands::FIX_CAR_DOOR>(hveh, i); Command<Commands::FIX_CAR_DOOR>(hveh, i);
break; break;
case 2: case 2:
Command<Commands::OPEN_CAR_DOOR>(hveh, i); Command<Commands::OPEN_CAR_DOOR>(hveh, i);
break; break;
case 3: case 3:
Command<Commands::POP_CAR_DOOR>(hveh, i); Command<Commands::POP_CAR_DOOR>(hveh, i);
break; break;
default: default:
break; break;
} }
} }
} }
for (int i = 0; i != doors; ++i) for (int i = 0; i != doors; ++i)
{ {
if (ImGui::Button(door_names[i].c_str(), ImVec2(Ui::GetSize(2)))) if (ImGui::Button(m_DoorNames[i].c_str(), ImVec2(Ui::GetSize(2))))
{ {
switch (door_menu_button) switch (m_nDoorMenuButton)
{ {
case 0: case 0:
Command<Commands::DAMAGE_CAR_DOOR>(hveh, i); Command<Commands::DAMAGE_CAR_DOOR>(hveh, i);
break; break;
case 1: case 1:
Command<Commands::FIX_CAR_DOOR>(hveh, i); Command<Commands::FIX_CAR_DOOR>(hveh, i);
break; break;
case 2: case 2:
Command<Commands::OPEN_CAR_DOOR>(hveh, i); Command<Commands::OPEN_CAR_DOOR>(hveh, i);
break; break;
case 3: case 3:
Command<Commands::POP_CAR_DOOR>(hveh, i); Command<Commands::POP_CAR_DOOR>(hveh, i);
break; break;
default: default:
break; break;
} }
} }
@ -888,21 +908,21 @@ void Vehicle::Draw()
if (ImGui::CollapsingHeader("Set speed")) if (ImGui::CollapsingHeader("Set speed"))
{ {
Ui::CheckboxWithHint("Lock speed", &lock_speed); Ui::CheckboxWithHint("Lock speed", &m_bLockSpeed);
ImGui::Spacing(); ImGui::Spacing();
ImGui::InputFloat("Set", &lock_speed_val); ImGui::InputFloat("Set", &m_fLockSpeed);
ImGui::Spacing(); ImGui::Spacing();
lock_speed_val = lock_speed_val > 100 ? 100 : lock_speed_val; m_fLockSpeed = m_fLockSpeed > 100 ? 100 : m_fLockSpeed;
lock_speed_val = lock_speed_val < 0 ? 0 : lock_speed_val; m_fLockSpeed = m_fLockSpeed < 0 ? 0 : m_fLockSpeed;
if (ImGui::Button("Set speed##brn", ImVec2(Ui::GetSize(2)))) if (ImGui::Button("Set speed##brn", ImVec2(Ui::GetSize(2))))
Command<Commands::SET_CAR_FORWARD_SPEED>(hveh, lock_speed_val); Command<Commands::SET_CAR_FORWARD_SPEED>(hVeh, m_fLockSpeed);
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Instant stop##brn", ImVec2(Ui::GetSize(2)))) if (ImGui::Button("Instant stop##brn", ImVec2(Ui::GetSize(2))))
Command<Commands::SET_CAR_FORWARD_SPEED>(hveh, 0); Command<Commands::SET_CAR_FORWARD_SPEED>(hVeh, 0);
} }
} }
ImGui::EndChild(); ImGui::EndChild();
@ -912,21 +932,22 @@ void Vehicle::Draw()
{ {
ImGui::Spacing(); ImGui::Spacing();
ImGui::Columns(2, 0, false); ImGui::Columns(2, 0, false);
Ui::CheckboxWithHint("Spawn inside", &spawner::spawn_inside, "Spawn inside vehicle as driver"); Ui::CheckboxWithHint("Spawn inside", &m_Spawner.m_bSpawnInside, "Spawn inside vehicle as driver");
ImGui::NextColumn(); ImGui::NextColumn();
Ui::CheckboxWithHint("Spawn aircraft in air", &spawner::spawn_in_air); Ui::CheckboxWithHint("Spawn aircraft in air", &m_Spawner.m_bSpawnInAir);
ImGui::Columns(1); ImGui::Columns(1);
ImGui::Spacing(); ImGui::Spacing();
ImGui::SetNextItemWidth(ImGui::GetWindowContentRegionWidth() - 2.5); ImGui::SetNextItemWidth(ImGui::GetWindowContentRegionWidth() - 2.5);
ImGui::InputTextWithHint("##LicenseText", "License plate text", spawner::license_text, 9); ImGui::InputTextWithHint("##LicenseText", "License plate text", m_Spawner.m_nLicenseText, 9);
Ui::DrawImages(spawner::veh_data.images, ImVec2(100, 75), spawner::veh_data.categories, spawner::veh_data.selected, spawner::veh_data.filter, SpawnVehicle, nullptr, Ui::DrawImages(m_Spawner.m_VehData.m_ImagesList, ImVec2(100, 75), m_Spawner.m_VehData.m_Categories,
[](std::string str) m_Spawner.m_VehData.m_Selected, m_Spawner.m_VehData.m_Filter, SpawnVehicle, nullptr,
{ [](std::string str)
return GetNameFromModel(std::stoi(str)); {
}); return GetNameFromModel(std::stoi(str));
});
ImGui::EndTabItem(); ImGui::EndTabItem();
} }
@ -948,59 +969,61 @@ void Vehicle::Draw()
Ui::ListBoxStr("Component", Paint::veh_nodes::names_vec, Paint::veh_nodes::selected); Ui::ListBoxStr("Component", Paint::veh_nodes::names_vec, Paint::veh_nodes::selected);
if (ImGui::ColorEdit3("Color picker", color::color_picker)) if (ImGui::ColorEdit3("Color picker", m_Color.m_fColorPicker))
{ {
uchar r = color::color_picker[0] * 255; uchar r = m_Color.m_fColorPicker[0] * 255;
uchar g = color::color_picker[1] * 255; uchar g = m_Color.m_fColorPicker[1] * 255;
uchar b = color::color_picker[2] * 255; uchar b = m_Color.m_fColorPicker[2] * 255;
Paint::SetNodeColor(veh, Paint::veh_nodes::selected, { r,g,b,255 }, color::material_filter); Paint::SetNodeColor(veh, Paint::veh_nodes::selected, {r, g, b, 255}, m_Color.m_bMatFilter);
} }
ImGui::Spacing(); ImGui::Spacing();
ImGui::Columns(2, NULL, false); ImGui::Columns(2, NULL, false);
ImGui::Checkbox("Material filter", &color::material_filter); ImGui::Checkbox("Material filter", &m_Color.m_bMatFilter);
ImGui::RadioButton("Primary", &color::radio_btn, 1); ImGui::RadioButton("Primary", &m_Color.m_nRadioButton, 1);
ImGui::RadioButton("Secondary", &color::radio_btn, 2); ImGui::RadioButton("Secondary", &m_Color.m_nRadioButton, 2);
ImGui::NextColumn(); ImGui::NextColumn();
ImGui::Checkbox("Show all", &color::show_all); ImGui::Checkbox("Show all", &m_Color.bShowAll);
ImGui::RadioButton("Tertiary", &color::radio_btn, 3); ImGui::RadioButton("Tertiary", &m_Color.m_nRadioButton, 3);
ImGui::RadioButton("Quaternary", &color::radio_btn, 4); ImGui::RadioButton("Quaternary", &m_Color.m_nRadioButton, 4);
ImGui::Spacing(); ImGui::Spacing();
ImGui::Columns(1); ImGui::Columns(1);
ImGui::Text("Select color preset:"); ImGui::Text("Select color preset:");
ImGui::Spacing(); ImGui::Spacing();
int count = (int)carcols_color_values.size(); int count = (int)m_CarcolsColorData.size();
ImVec2 size = Ui::GetSize(); ImVec2 size = Ui::GetSize();
int btns_in_row = ImGui::GetWindowContentRegionWidth() / (size.y * 2); int btnsInRow = ImGui::GetWindowContentRegionWidth() / (size.y * 2);
int btn_size = (ImGui::GetWindowContentRegionWidth() - int(ImGuiStyleVar_ItemSpacing) * (btns_in_row - 0.6 * btns_in_row)) / btns_in_row; int btnSize = (ImGui::GetWindowContentRegionWidth() - int(ImGuiStyleVar_ItemSpacing) * (btnsInRow -
0.6 * btnsInRow)) / btnsInRow;
ImGui::BeginChild("Colorss"); ImGui::BeginChild("Colorss");
if (color::show_all) if (m_Color.bShowAll)
for (int color_id = 0; color_id < count; ++color_id) for (int colorId = 0; colorId < count; ++colorId)
{ {
if (Ui::ColorButton(color_id, carcols_color_values[color_id], ImVec2(btn_size, btn_size))) if (Ui::ColorButton(colorId, m_CarcolsColorData[colorId], ImVec2(btnSize, btnSize)))
*(uint8_replacement*)(int(veh) + 0x433 + color::radio_btn) = color_id; *(uint8_replacement*)(int(veh) + 0x433 + m_Color.m_nRadioButton) = colorId;
if ((color_id + 1) % btns_in_row != 0) if ((colorId + 1) % btnsInRow != 0)
ImGui::SameLine(0.0, 4.0); ImGui::SameLine(0.0, 4.0);
} }
else else
{ {
std::string veh_name = GetNameFromModel(player->m_pVehicle->m_nModelIndex); std::string vehName = GetNameFromModel(player->m_pVehicle->m_nModelIndex);
for (auto entry : carcols_car_data) for (auto entry : m_CarcolsCarData)
{ {
if (entry.first == veh_name) if (entry.first == vehName)
{ {
int count = 1; int count = 1;
for (int color_id : entry.second) for (int colorId : entry.second)
{ {
if (Ui::ColorButton(color_id, carcols_color_values[color_id], ImVec2(btn_size, btn_size))) if (Ui::ColorButton(colorId, m_CarcolsColorData[colorId],
*(uint8_replacement*)(int(veh) + 0x433 + color::radio_btn) = color_id; ImVec2(btnSize, btnSize)))
*(uint8_replacement*)(int(veh) + 0x433 + m_Color.m_nRadioButton) = colorId;
if (count % btns_in_row != 0) if (count % btnsInRow != 0)
ImGui::SameLine(0.0, 4.0); ImGui::SameLine(0.0, 4.0);
++count; ++count;
} }
@ -1029,36 +1052,38 @@ void Vehicle::Draw()
if (Ui::CheckboxWithHint("Pulsing neons", &pulsing)) if (Ui::CheckboxWithHint("Pulsing neons", &pulsing))
SetPulsing(veh, pulsing); SetPulsing(veh, pulsing);
Ui::CheckboxWithHint("Rainbow neons", &neon::rainbow, "Rainbow effect to neon lights"); Ui::CheckboxWithHint("Rainbow neons", &m_Neon.m_bRainbowEffect, "Rainbow effect to neon lights");
ImGui::NextColumn(); ImGui::NextColumn();
Ui::CheckboxWithHint("Traffic neons", &neon::traffic, "Adds neon lights to traffic vehicles.\n\ Ui::CheckboxWithHint("Traffic neons", &m_Neon.m_bApplyOnTraffic, "Adds neon lights to traffic vehicles.\n\
Only some vehicles will have them."); Only some vehicles will have them.");
ImGui::Columns(1); ImGui::Columns(1);
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::ColorEdit3("Color picker", neon::color_picker)) if (ImGui::ColorEdit3("Color picker", m_Neon.m_fColorPicker))
InstallNeon(veh, neon::color_picker[0] * 255, neon::color_picker[1] * 255, neon::color_picker[2] * 255); InstallNeon(veh, m_Neon.m_fColorPicker[0] * 255, m_Neon.m_fColorPicker[1] * 255,
m_Neon.m_fColorPicker[2] * 255);
ImGui::Spacing(); ImGui::Spacing();
ImGui::Text("Select neon preset:"); ImGui::Text("Select neon preset:");
int count = (int)carcols_color_values.size(); int count = (int)m_CarcolsColorData.size();
ImVec2 size = Ui::GetSize(); ImVec2 size = Ui::GetSize();
int btns_in_row = ImGui::GetWindowContentRegionWidth() / (size.y * 2); int btnsInRow = ImGui::GetWindowContentRegionWidth() / (size.y * 2);
int btn_size = (ImGui::GetWindowContentRegionWidth() - int(ImGuiStyleVar_ItemSpacing) * (btns_in_row - 0.6 * btns_in_row)) / btns_in_row; int btnSize = (ImGui::GetWindowContentRegionWidth() - int(ImGuiStyleVar_ItemSpacing) * (btnsInRow -
0.6 * btnsInRow)) / btnsInRow;
ImGui::BeginChild("Neonss"); ImGui::BeginChild("Neonss");
for (int color_id = 0; color_id < count; ++color_id) for (int color_id = 0; color_id < count; ++color_id)
{ {
if (Ui::ColorButton(color_id, carcols_color_values[color_id], ImVec2(btn_size, btn_size))) if (Ui::ColorButton(color_id, m_CarcolsColorData[color_id], ImVec2(btnSize, btnSize)))
{ {
std::vector<float>& color = carcols_color_values[color_id]; std::vector<float>& color = m_CarcolsColorData[color_id];
InstallNeon(veh, color[0] * 255, color[1] * 255, color[2] * 255); InstallNeon(veh, color[0] * 255, color[1] * 255, color[2] * 255);
} }
if ((color_id + 1) % btns_in_row != 0) if ((color_id + 1) % btnsInRow != 0)
ImGui::SameLine(0.0, 4.0); ImGui::SameLine(0.0, 4.0);
} }
@ -1102,30 +1127,35 @@ Only some vehicles will have them.");
ImGui::Spacing(); ImGui::Spacing();
ImGui::SameLine(); ImGui::SameLine();
ImGui::Checkbox("Material filter", &color::material_filter); ImGui::Checkbox("Material filter", &m_Color.m_bMatFilter);
ImGui::Spacing(); ImGui::Spacing();
Ui::DrawImages(texture_data.images, ImVec2(100, 80), texture_data.categories, texture_data.selected, texture_data.filter, Ui::DrawImages(m_TextureData.m_ImagesList, ImVec2(100, 80), m_TextureData.m_Categories, m_TextureData.m_Selected,
[](std::string& str) m_TextureData.m_Filter,
{ [](std::string& str)
Paint::SetNodeTexture(FindPlayerPed()->m_pVehicle, Paint::veh_nodes::selected, str, color::material_filter); {
}, Paint::SetNodeTexture(FindPlayerPed()->m_pVehicle, Paint::veh_nodes::selected, str,
nullptr, m_Color.m_bMatFilter);
[](std::string& str) {return str; },
}); nullptr,
[](std::string& str)
{
return str;
});
ImGui::EndTabItem(); ImGui::EndTabItem();
} }
if (ImGui::BeginTabItem("Tune")) if (ImGui::BeginTabItem("Tune"))
{ {
ImGui::Spacing(); ImGui::Spacing();
Ui::DrawImages(tune_data.images, ImVec2(100, 80), tune_data.categories, tune_data.selected, tune_data.filter, Ui::DrawImages(m_TuneData.m_ImagesList, ImVec2(100, 80), m_TuneData.m_Categories, m_TuneData.m_Selected,
[](std::string& str) {AddComponent(str);}, m_TuneData.m_Filter,
[](std::string& str) {RemoveComponent(str); }, [](std::string& str) { AddComponent(str); },
[](std::string& str) {return str;}, [](std::string& str) { RemoveComponent(str); },
[](std::string& str) [](std::string& str) { return str; },
{ [](std::string& str)
return ((bool(*)(int, CVehicle*))0x49B010)(std::stoi(str), player->m_pVehicle); {
} return ((bool(*)(int, CVehicle*))0x49B010)(std::stoi(str), player->m_pVehicle);
}
); );
ImGui::EndTabItem(); ImGui::EndTabItem();
@ -1135,9 +1165,9 @@ Only some vehicles will have them.");
ImGui::Spacing(); ImGui::Spacing();
CBaseModelInfo* info = CModelInfo::GetModelInfo(player->m_pVehicle->m_nModelIndex); CBaseModelInfo* info = CModelInfo::GetModelInfo(player->m_pVehicle->m_nModelIndex);
int phandling = patch::Get<WORD>((int)info + 0x4A, false); int pHandling = patch::Get<WORD>((int)info + 0x4A, false);
phandling *= 0xE0; pHandling *= 0xE0;
phandling += 0xC2B9DC; pHandling += 0xC2B9DC;
if (ImGui::Button("Reset handling", ImVec2(Ui::GetSize(3)))) if (ImGui::Button("Reset handling", ImVec2(Ui::GetSize(3))))
{ {
@ -1149,72 +1179,75 @@ Only some vehicles will have them.");
if (ImGui::Button("Save to file", ImVec2(Ui::GetSize(3)))) if (ImGui::Button("Save to file", ImVec2(Ui::GetSize(3))))
{ {
GenerateHandlingDataFile(phandling); GenerateHandlingDataFile(pHandling);
CHud::SetHelpMessage("Handling saved", false, false, false); CHud::SetHelpMessage("Handling saved", false, false, false);
} }
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Read more", ImVec2(Ui::GetSize(3)))) if (ImGui::Button("Read more", ImVec2(Ui::GetSize(3))))
ShellExecute(NULL, "open", "https://projectcerbera.com/gta/sa/tutorials/handling", NULL, NULL, SW_SHOWNORMAL); ShellExecute(NULL, "open", "https://projectcerbera.com/gta/sa/tutorials/handling", NULL, NULL,
SW_SHOWNORMAL);
ImGui::Spacing(); ImGui::Spacing();
ImGui::BeginChild("HandlingChild"); ImGui::BeginChild("HandlingChild");
static std::vector<Ui::NamedValue> abs{ { "On", 1 }, { "Off", 0 } }; static std::vector<Ui::NamedValue> abs{{"On", 1}, {"Off", 0}};
Ui::EditRadioButtonAddressEx("Abs", phandling + 0x9C, abs); Ui::EditRadioButtonAddressEx("Abs", pHandling + 0x9C, abs);
Ui::EditFloat("Anti dive multiplier", phandling + 0xC4, 0.0f, 0.0f, 1.0f); Ui::EditFloat("Anti dive multiplier", pHandling + 0xC4, 0.0f, 0.0f, 1.0f);
Ui::EditFloat("Brake bias", phandling + 0x98, 0.0f, 0.0f, 1.0f); Ui::EditFloat("Brake bias", pHandling + 0x98, 0.0f, 0.0f, 1.0f);
Ui::EditFloat("Brake deceleration", phandling + 0x94, 0.0f, 0.0f, 20.0f, 2500.0f); Ui::EditFloat("Brake deceleration", pHandling + 0x94, 0.0f, 0.0f, 20.0f, 2500.0f);
Ui::EditFloat("Centre of mass X", phandling + 0x14, -10.0f, -10.0f, 10.0f); Ui::EditFloat("Centre of mass X", pHandling + 0x14, -10.0f, -10.0f, 10.0f);
Ui::EditFloat("Centre of mass Y", phandling + 0x18, -10.0f, -10.0f, 10.0f); Ui::EditFloat("Centre of mass Y", pHandling + 0x18, -10.0f, -10.0f, 10.0f);
Ui::EditFloat("Centre of mass Z", phandling + 0x1C, -10.0f, -10.0f, 10.0f); Ui::EditFloat("Centre of mass Z", pHandling + 0x1C, -10.0f, -10.0f, 10.0f);
Ui::EditFloat("Collision damage multiplier", phandling + 0xC8, 0.0f, 0.0f, 1.0f, 0.3381f); Ui::EditFloat("Collision damage multiplier", pHandling + 0xC8, 0.0f, 0.0f, 1.0f, 0.3381f);
Ui::EditFloat("Damping level", phandling + 0xB0, -10.0f, -10.0f, 10.0f); // test later Ui::EditFloat("Damping level", pHandling + 0xB0, -10.0f, -10.0f, 10.0f); // test later
Ui::EditFloat("Drag mult", phandling + 0x10, 0.0f, 0.0f, 30.0f); Ui::EditFloat("Drag mult", pHandling + 0x10, 0.0f, 0.0f, 30.0f);
static std::vector<Ui::NamedValue> drive_type{ { "Front wheel drive", 70 }, { "Rear wheel drive", 82 }, { "Four wheel drive", 52 } }; static std::vector<Ui::NamedValue> drive_type{
Ui::EditRadioButtonAddressEx("Drive type", phandling + 0x74, drive_type); {"Front wheel drive", 70}, {"Rear wheel drive", 82}, {"Four wheel drive", 52}
};
Ui::EditRadioButtonAddressEx("Drive type", pHandling + 0x74, drive_type);
Ui::EditFloat("Engine acceleration", phandling + 0x7C, 0.0f, 0.0f, 49.0f, 12500.0f); Ui::EditFloat("Engine acceleration", pHandling + 0x7C, 0.0f, 0.0f, 49.0f, 12500.0f);
Ui::EditFloat("Engine inertia", phandling + 0x80, 0.0f, 0.0f, 400.0f); Ui::EditFloat("Engine inertia", pHandling + 0x80, 0.0f, 0.0f, 400.0f);
static std::vector<Ui::NamedValue> engine_type{ { "Petrol", 80 }, { "Diseal", 68 }, { "Electric", 69 } }; static std::vector<Ui::NamedValue> engine_type{{"Petrol", 80}, {"Diseal", 68}, {"Electric", 69}};
Ui::EditRadioButtonAddressEx("Engine type", phandling + 0x75, engine_type); Ui::EditRadioButtonAddressEx("Engine type", pHandling + 0x75, engine_type);
std::vector<Ui::NamedValue> front_lights{ { "Long", 0 }, { "Small", 1 }, { "Big", 2 }, { "Tall", 3 } }; std::vector<Ui::NamedValue> front_lights{{"Long", 0}, {"Small", 1}, {"Big", 2}, {"Tall", 3}};
Ui::EditRadioButtonAddressEx("Front lights", phandling + 0xDC, front_lights); Ui::EditRadioButtonAddressEx("Front lights", pHandling + 0xDC, front_lights);
Ui::EditFloat("Force level", phandling + 0xAC, -10.0f, -10.0f, 10.0f); // test later Ui::EditFloat("Force level", pHandling + 0xAC, -10.0f, -10.0f, 10.0f); // test later
Ui::EditBits("Handling flags", phandling + 0xD0, handling_flag_names); Ui::EditBits("Handling flags", pHandling + 0xD0, m_HandlingFlagNames);
Ui::EditFloat("High speed damping", phandling + 0xB4, -10.0f, -10.0f, 10.0f);// test later Ui::EditFloat("High speed damping", pHandling + 0xB4, -10.0f, -10.0f, 10.0f); // test later
Ui::EditFloat("Lower limit", phandling + 0xBC, -10.0f, -10.0f, 10.0f);// test later Ui::EditFloat("Lower limit", pHandling + 0xBC, -10.0f, -10.0f, 10.0f); // test later
Ui::EditFloat("Mass", phandling + 0x4, 1.0f, 1.0f, 50000.0f); Ui::EditFloat("Mass", pHandling + 0x4, 1.0f, 1.0f, 50000.0f);
///fcommon.UpdateAddress({ name = 'Max velocity',address = phandling + 0x84 ,size = 4,min = 0,max = 2,is_float = true,cvalue = 0.01 , save = false }) ///fcommon.UpdateAddress({ name = 'Max velocity',address = phandling + 0x84 ,size = 4,min = 0,max = 2,is_float = true,cvalue = 0.01 , save = false })
Ui::EditBits("Model flags", phandling + 0xCC, model_flag_names); Ui::EditBits("Model flags", pHandling + 0xCC, m_ModelFlagNames);
Ui::EditAddress<int>("Monetary value", phandling + 0xD8, 1, 1, 100000); Ui::EditAddress<int>("Monetary value", pHandling + 0xD8, 1, 1, 100000);
Ui::EditAddress<BYTE>("Number of gears", phandling + 0x76, 1, 1, 10); Ui::EditAddress<BYTE>("Number of gears", pHandling + 0x76, 1, 1, 10);
Ui::EditAddress<BYTE>("Percent submerged", phandling + 0x20, 10, 10, 120); Ui::EditAddress<BYTE>("Percent submerged", pHandling + 0x20, 10, 10, 120);
static std::vector<Ui::NamedValue> rear_lights{ { "Long", 0 }, { "Small", 1 }, { "Big", 2 }, { "Tall", 3 } }; static std::vector<Ui::NamedValue> rear_lights{{"Long", 0}, {"Small", 1}, {"Big", 2}, {"Tall", 3}};
Ui::EditRadioButtonAddressEx("Rear lights", phandling + 0xDD, rear_lights); Ui::EditRadioButtonAddressEx("Rear lights", pHandling + 0xDD, rear_lights);
Ui::EditFloat("Seat offset distance", phandling + 0xD4, 0.0f, 0.0f, 1.0f); Ui::EditFloat("Seat offset distance", pHandling + 0xD4, 0.0f, 0.0f, 1.0f);
Ui::EditFloat("Steering lock", phandling + 0xA0, 10.0f, 10.0f, 50.0f); Ui::EditFloat("Steering lock", pHandling + 0xA0, 10.0f, 10.0f, 50.0f);
Ui::EditFloat("Suspension bias", phandling + 0xC0, 0.0f, 0.0f, 1.0f); Ui::EditFloat("Suspension bias", pHandling + 0xC0, 0.0f, 0.0f, 1.0f);
Ui::EditFloat("Traction bias", phandling + 0xA8, 0.0f, 0.0f, 1.0f); Ui::EditFloat("Traction bias", pHandling + 0xA8, 0.0f, 0.0f, 1.0f);
Ui::EditFloat("Traction loss", phandling + 0xA4, 0.0f, 0.0f, 1.0f); Ui::EditFloat("Traction loss", pHandling + 0xA4, 0.0f, 0.0f, 1.0f);
Ui::EditFloat("Traction multiplier", phandling + 0x28, 0.5f, 0.5f, 2.0f); Ui::EditFloat("Traction multiplier", pHandling + 0x28, 0.5f, 0.5f, 2.0f);
Ui::EditFloat("Turn mass", phandling + 0xC, 20.0f, 20.0f, 1000.0f); // test later Ui::EditFloat("Turn mass", pHandling + 0xC, 20.0f, 20.0f, 1000.0f); // test later
Ui::EditFloat("Upper limit", phandling + 0xB8, -1.0f, -1.0f, 1.0f); Ui::EditFloat("Upper limit", pHandling + 0xB8, -1.0f, -1.0f, 1.0f);
Ui::EditAddress<BYTE>("Vehicle anim group", phandling + 0xDE, 0, 0, 20); Ui::EditAddress<BYTE>("Vehicle anim group", pHandling + 0xDE, 0, 0, 20);
ImGui::EndChild(); ImGui::EndChild();

View File

@ -5,77 +5,77 @@
class Vehicle : Paint, Neon class Vehicle : Paint, Neon
{ {
private: private:
inline static bool bike_fly = false; inline static bool m_bBikeFly;
inline static bool dont_fall_bike = false; inline static bool m_bDontFallBike;
inline static bool veh_heavy = false; inline static bool m_bVehHeavy;
inline static bool veh_watertight = false; inline static bool m_bVehWatertight;
inline static bool veh_nodmg = false; inline static bool m_bNoDamage;
inline static int door_menu_button = 0; inline static int m_nDoorMenuButton;
inline static std::string door_names[6] = inline static std::string m_DoorNames[6] =
{ "Hood","Boot","Front left door","Front right door","Rear left door","Rear right door" }; {"Hood", "Boot", "Front left door", "Front right door", "Rear left door", "Rear right door"};
inline static int veh_remove_radius = 0; inline static int m_nVehRemoveRadius;
inline static bool m_bLockSpeed;
inline static bool lock_speed = false; inline static float m_fLockSpeed;
inline static float lock_speed_val = 0.0f; inline static std::map<int, std::string> m_VehicleIDE;
inline static std::vector<std::vector<float>> m_CarcolsColorData;
inline static std::map<int, std::string> vehicle_ide; inline static std::map<std::string, std::vector<int>> m_CarcolsCarData;
inline static std::vector<std::vector<float>> carcols_color_values; static struct
inline static std::map<std::string, std::vector<int>> carcols_car_data;
struct color
{ {
inline static bool material_filter = true; inline static bool m_bMatFilter = true;
inline static int radio_btn = 1; inline static int m_nRadioButton = 1;
inline static bool show_all = false; inline static bool bShowAll;
inline static float color_picker[3]{ 0,0,0 }; inline static float m_fColorPicker[3]{0, 0, 0};
} m_Color;
static struct
{
inline static float m_fColorPicker[3]{0, 0, 0};
inline static bool m_bRainbowEffect;
inline static uint m_nRainbowTimer;
inline static bool m_bApplyOnTraffic;
inline static uint m_bTrafficTimer;
} m_Neon;
static struct
{
inline static SSearchData m_VehData;
inline static bool m_bSpawnInside = true;
inline static bool m_bSpawnInAir = true;
inline static char m_nLicenseText[9];
} m_Spawner;
inline static SSearchData m_TextureData;
inline static SSearchData m_TuneData;
inline static bool m_bImagesLoaded;
static struct
{
inline static bool m_bEnabled;
inline static bool m_bCompAdded;
} m_UnlimitedNitro;
inline static std::vector<std::string> (m_HandlingFlagNames) = // 32 flags
{
"1G_BOOST", "2G_BOOST", "NPC_ANTI_ROLL", "NPC_NEUTRAL_HANDL", "NO_HANDBRAKE", "STEER_REARWHEELS",
"HB_REARWHEEL_STEER", "ALT_STEER_OPT",
"WHEEL_F_NARROW2", "WHEEL_F_NARROW", "WHEEL_F_WIDE", "WHEEL_F_WIDE2", "WHEEL_R_NARROW2", "WHEEL_R_NARROW",
"WHEEL_R_WIDE", "WHEEL_R_WIDE2",
"HYDRAULIC_GEOM", "HYDRAULIC_INST", "HYDRAULIC_NONE", "NOS_INST", "OFFROAD_ABILITY", "OFFROAD_ABILITY2",
"HALOGEN_LIGHTS", "PROC_REARWHEEL_1ST",
"USE_MAXSP_LIMIT", "LOW_RIDER", "STREET_RACER", "SWINGING_CHASSIS", "Unused 1", "Unused 2", "Unused 3",
"Unused 4"
}; };
struct neon inline static std::vector<std::string> (m_ModelFlagNames) = // 32 flags
{ {
inline static float color_picker[3]{ 0,0,0 }; "IS_VAN", "IS_BUS", "IS_LOW", "IS_BIG", "REVERSE_BONNET", "HANGING_BOOT", "TAILGATE_BOOT", "NOSWING_BOOT",
inline static bool rainbow = false; "NO_DOORS", "TANDEM_SEATS",
inline static uint rainbow_timer = 0; "SIT_IN_BOAT", "CONVERTIBLE", "NO_EXHAUST", "DOUBLE_EXHAUST", "NO1FPS_LOOK_BEHIND", "FORCE_DOOR_CHECK",
inline static bool traffic = false; "AXLE_F_NOTILT", "AXLE_F_SOLID", "AXLE_F_MCPHERSON",
inline static uint traffic_timer = 0; "AXLE_F_REVERSE", "AXLE_R_NOTILT", "AXLE_R_SOLID", "AXLE_R_MCPHERSON", "AXLE_R_REVERSE", "IS_BIKE", "IS_HELI",
}; "IS_PLANE", "IS_BOAT", "BOUNCE_PANELS",
"DOUBLE_RWHEELS", "FORCE_GROUND_CLEARANCE", "IS_HATCHBAC1K"
struct spawner
{
inline static SearchData veh_data;
inline static bool spawn_inside = true;
inline static bool spawn_in_air = true;
inline static char license_text[9] = "";
};
inline static SearchData texture_data;
inline static SearchData tune_data;
inline static bool images_loaded = false;
struct unlimited_nitro
{
inline static bool enabled = false;
inline static bool comp_added = false;
};
inline static std::vector<std::string>(handling_flag_names) = // 32 flags
{
"1G_BOOST","2G_BOOST","NPC_ANTI_ROLL","NPC_NEUTRAL_HANDL","NO_HANDBRAKE","STEER_REARWHEELS","HB_REARWHEEL_STEER","ALT_STEER_OPT",
"WHEEL_F_NARROW2","WHEEL_F_NARROW","WHEEL_F_WIDE","WHEEL_F_WIDE2","WHEEL_R_NARROW2","WHEEL_R_NARROW","WHEEL_R_WIDE","WHEEL_R_WIDE2",
"HYDRAULIC_GEOM","HYDRAULIC_INST","HYDRAULIC_NONE","NOS_INST","OFFROAD_ABILITY","OFFROAD_ABILITY2","HALOGEN_LIGHTS","PROC_REARWHEEL_1ST",
"USE_MAXSP_LIMIT","LOW_RIDER","STREET_RACER","SWINGING_CHASSIS","Unused 1","Unused 2","Unused 3","Unused 4"
};
inline static std::vector<std::string>(model_flag_names) = // 32 flags
{
"IS_VAN","IS_BUS","IS_LOW","IS_BIG","REVERSE_BONNET","HANGING_BOOT","TAILGATE_BOOT","NOSWING_BOOT","NO_DOORS","TANDEM_SEATS",
"SIT_IN_BOAT","CONVERTIBLE","NO_EXHAUST","DOUBLE_EXHAUST","NO1FPS_LOOK_BEHIND","FORCE_DOOR_CHECK","AXLE_F_NOTILT","AXLE_F_SOLID","AXLE_F_MCPHERSON",
"AXLE_F_REVERSE","AXLE_R_NOTILT","AXLE_R_SOLID","AXLE_R_MCPHERSON","AXLE_R_REVERSE","IS_BIKE","IS_HELI","IS_PLANE","IS_BOAT","BOUNCE_PANELS",
"DOUBLE_RWHEELS","FORCE_GROUND_CLEARANCE","IS_HATCHBAC1K"
}; };
public: public:
static void AddComponent(const std::string& component, const bool display_message = true); static void AddComponent(const std::string& component, bool display_message = true);
static void RemoveComponent(const std::string& component, const bool display_message = true); static void RemoveComponent(const std::string& component, bool display_message = true);
static std::string GetNameFromModel(int model); static std::string GetNameFromModel(int model);
static int GetModelFromName(const char* name); static int GetModelFromName(const char* name);
static void SpawnVehicle(std::string& name); static void SpawnVehicle(std::string& name);
@ -87,4 +87,3 @@ public:
~Vehicle(); ~Vehicle();
static void Draw(); static void Draw();
}; };

View File

@ -9,33 +9,28 @@
Visual::Visual() Visual::Visual()
{ {
if (GetModuleHandle("timecycle24.asi")) if (GetModuleHandle("timecycle24.asi"))
timecyc_hour = 24; m_nTimecycHour = 24;
Events::processScriptsEvent += [] Events::processScriptsEvent += []
{ {
// TODO: Needs improvement // TODO: Needs improvement
if (lock_weather) if (m_bLockWeather)
{ {
CWeather::OldWeatherType = weather_type_backup; CWeather::OldWeatherType = m_nBacWeatherType;
CWeather::NewWeatherType = weather_type_backup; CWeather::NewWeatherType = m_nBacWeatherType;
} }
}; };
} }
Visual::~Visual()
{
}
// Thanks to GuruGuru // Thanks to GuruGuru
int Visual::GetCurrentHourTimeId(int hour) int Visual::GetCurrentHourTimeId(int hour)
{ {
if (hour == -1) if (hour == -1)
{ {
hour = CClock::ms_nGameClockHours; hour = CClock::ms_nGameClockHours;
} }
if (timecyc_hour == 24) if (m_nTimecycHour == 24)
return hour; return hour;
if (hour < 5) return 0; if (hour < 5) return 0;
@ -44,26 +39,26 @@ int Visual::GetCurrentHourTimeId(int hour)
if (hour == 6) return 2; if (hour == 6) return 2;
if (7 <= hour && hour < 12) return 3; if (7 <= hour && hour < 12) return 3;
if (12 <= hour && hour < 19) return 4; if (12 <= hour && hour < 19) return 4;
if (hour == 19) return 5; if (hour == 19) return 5;
if (hour == 20 || hour == 21) return 6; if (hour == 20 || hour == 21) return 6;
if (hour == 22 || hour == 23) return 7; if (hour == 22 || hour == 23) return 7;
return NULL; return NULL;
} }
bool Visual::TimeCycColorEdit3(const char* label, uchar *r, uchar *g, uchar *b, ImGuiColorEditFlags flags) bool Visual::TimeCycColorEdit3(const char* label, uchar* r, uchar* g, uchar* b, ImGuiColorEditFlags flags)
{ {
bool rtn = false; bool rtn = false;
int val = 23 * GetCurrentHourTimeId() + CWeather::OldWeatherType; int val = 23 * GetCurrentHourTimeId() + CWeather::OldWeatherType;
uchar *red = (uchar*)patch::GetPointer(int(r)); auto red = static_cast<uchar*>(patch::GetPointer(int(r)));
uchar *green = (uchar*)patch::GetPointer(int(g)); auto green = static_cast<uchar*>(patch::GetPointer(int(g)));
uchar *blue = (uchar*)patch::GetPointer(int(b)); auto blue = static_cast<uchar*>(patch::GetPointer(int(b)));
float col[3]{red[val] / 255.0f, green[val] / 255.0f, blue[val] / 255.0f};
float col[3]{red[val]/255.0f,green[val]/255.0f,blue[val]/255.0f};
if (ImGui::ColorEdit3(label, col, flags)) if (ImGui::ColorEdit3(label, col, flags))
{ {
red[val] = col[0] * 255; red[val] = col[0] * 255;
@ -71,22 +66,22 @@ bool Visual::TimeCycColorEdit3(const char* label, uchar *r, uchar *g, uchar *b,
blue[val] = col[2] * 255; blue[val] = col[2] * 255;
rtn = true; rtn = true;
} }
return rtn; return rtn;
} }
bool Visual::TimeCycColorEdit4(const char* label, uchar *r, uchar *g, uchar *b, uchar *a, ImGuiColorEditFlags flags) bool Visual::TimeCycColorEdit4(const char* label, uchar* r, uchar* g, uchar* b, uchar* a, ImGuiColorEditFlags flags)
{ {
bool rtn = false; bool rtn = false;
int val = 23 * GetCurrentHourTimeId() + CWeather::OldWeatherType; int val = 23 * GetCurrentHourTimeId() + CWeather::OldWeatherType;
uchar *red = (uchar*)patch::GetPointer(int(r));
uchar *green = (uchar*)patch::GetPointer(int(g));
uchar *blue = (uchar*)patch::GetPointer(int(b));
uchar *alpha = (uchar*)patch::GetPointer(int(a));
float col[4]{red[val]/255.0f,green[val]/255.0f,blue[val]/255.0f,alpha[val]/255.0f}; auto red = static_cast<uchar*>(patch::GetPointer(int(r)));
auto green = static_cast<uchar*>(patch::GetPointer(int(g)));
auto blue = static_cast<uchar*>(patch::GetPointer(int(b)));
auto alpha = static_cast<uchar*>(patch::GetPointer(int(a)));
float col[4]{red[val] / 255.0f, green[val] / 255.0f, blue[val] / 255.0f, alpha[val] / 255.0f};
if (ImGui::ColorEdit4(label, col, flags)) if (ImGui::ColorEdit4(label, col, flags))
{ {
red[val] = col[0] * 255; red[val] = col[0] * 255;
@ -98,29 +93,31 @@ bool Visual::TimeCycColorEdit4(const char* label, uchar *r, uchar *g, uchar *b,
return rtn; return rtn;
} }
template<typename T>
inline int GetTCVal(T *addr, int index) template <typename T>
int GetTCVal(T* addr, int index)
{ {
T *arr = (T*)patch::GetPointer(int(addr)); T* arr = static_cast<T*>(patch::GetPointer(int(addr)));
return int(arr[index]); return static_cast<int>(arr[index]);
} }
void Visual::GenerateTimecycFile() void Visual::GenerateTimecycFile()
{ {
std::ofstream file; std::ofstream file;
if (timecyc_hour == 24) if (m_nTimecycHour == 24)
file = std::ofstream("timecyc_24h.dat"); file = std::ofstream("timecyc_24h.dat");
else else
file = std::ofstream("timecyc.dat"); file = std::ofstream("timecyc.dat");
for (uint i = 0; i < weather_names.size(); ++i) for (uint i = 0; i < m_WeatherNames.size(); ++i)
{ {
file << "\n\n//////////// " << weather_names[i] << "\n"; file << "\n\n//////////// " << m_WeatherNames[i] << "\n";
file << "//\tAmb\t\t\t\t\tAmb Obj \t\t\t\tDir \t\t\t\t\tSky top\t\t\t\tSky bot\t\t\t\tSunCore\t\t\t\t\tSunCorona\t\t\tSunSz\tSprSz\tSprBght\t\tShdw\tLightShd\tPoleShd\t\tFarClp\t\tFogSt\tLightOnGround\tLowCloudsRGB\tBottomCloudRGB\t\tWaterRGBA\t\t\t\tARGB1\t\t\t\t\tARGB2\t\t\tCloudAlpha\t\tIntensityLimit\t\tWaterFogAlpha\tDirMult \n\n"; file <<
"//\tAmb\t\t\t\t\tAmb Obj \t\t\t\tDir \t\t\t\t\tSky top\t\t\t\tSky bot\t\t\t\tSunCore\t\t\t\t\tSunCorona\t\t\tSunSz\tSprSz\tSprBght\t\tShdw\tLightShd\tPoleShd\t\tFarClp\t\tFogSt\tLightOnGround\tLowCloudsRGB\tBottomCloudRGB\t\tWaterRGBA\t\t\t\tARGB1\t\t\t\t\tARGB2\t\t\tCloudAlpha\t\tIntensityLimit\t\tWaterFogAlpha\tDirMult \n\n";
for (int j = 0; j < timecyc_hour; ++j) for (int j = 0; j < m_nTimecycHour; ++j)
{ {
if (timecyc_hour == 24) if (m_nTimecycHour == 24)
{ {
if (j >= 12) if (j >= 12)
file << "// " << j << " PM\n"; file << "// " << j << " PM\n";
@ -129,49 +126,65 @@ void Visual::GenerateTimecycFile()
} }
else else
{ {
if (j == 0) file << "// Midnight\n"; if (j == 0) file << "// Midnight\n";
if (j == 1) file << "// 5 AM\n"; if (j == 1) file << "// 5 AM\n";
if (j == 2) file << "// 6 AM\n"; if (j == 2) file << "// 6 AM\n";
if (j == 3) file << "// 7 AM\n"; if (j == 3) file << "// 7 AM\n";
if (j == 4) file << "// Midday\n"; if (j == 4) file << "// Midday\n";
if (j == 5) file << "// 7 PM\n"; if (j == 5) file << "// 7 PM\n";
if (j == 6) file << "// 8 PM\n"; if (j == 6) file << "// 8 PM\n";
if (j == 7) file << "// 10 PM\n"; if (j == 7) file << "// 10 PM\n";
} }
int val = 23 * j + i; int val = 23 * j + i;
file << "\t" << GetTCVal(m_nAmbientRed,val) << " " << GetTCVal(m_nAmbientGreen,val) << " " << GetTCVal(m_nAmbientBlue,val) << " \t\t" file << "\t" << GetTCVal(m_nAmbientRed, val) << " " << GetTCVal(m_nAmbientGreen, val) << " " << GetTCVal(
m_nAmbientBlue, val) << " \t\t"
<< "\t" << GetTCVal(m_nAmbientRed_Obj,val) << " " << GetTCVal(m_nAmbientGreen_Obj,val) << " " << GetTCVal(m_nAmbientBlue_Obj,val) << " \t\t" << "\t" << GetTCVal(m_nAmbientRed_Obj, val) << " " << GetTCVal(m_nAmbientGreen_Obj, val) << " " <<
GetTCVal(m_nAmbientBlue_Obj, val) << " \t\t"
<< "\t255 255 255\t\t" // unused << "\t255 255 255\t\t" // unused
<< "\t" << GetTCVal(m_nSkyTopRed,val) << " " << GetTCVal(m_nSkyTopGreen,val) << " " << GetTCVal(m_nSkyTopBlue,val) << " \t\t" << "\t" << GetTCVal(m_nSkyTopRed, val) << " " << GetTCVal(m_nSkyTopGreen, val) << " " << GetTCVal(
m_nSkyTopBlue, val) << " \t\t"
<< "\t" << GetTCVal(m_nSkyBottomRed,val) << " " << GetTCVal(m_nSkyBottomGreen,val) << " " << GetTCVal(m_nSkyBottomBlue,val) << " \t\t" << "\t" << GetTCVal(m_nSkyBottomRed, val) << " " << GetTCVal(m_nSkyBottomGreen, val) << " " << GetTCVal(
m_nSkyBottomBlue, val) << " \t\t"
<< "\t" << GetTCVal(m_nSunCoreRed,val) << " " << GetTCVal(m_nSunCoreGreen,val) << " " << GetTCVal(m_nSunCoreBlue,val) << " \t\t" << "\t" << GetTCVal(m_nSunCoreRed, val) << " " << GetTCVal(m_nSunCoreGreen, val) << " " << GetTCVal(
m_nSunCoreBlue, val) << " \t\t"
<< "\t" << GetTCVal(m_nSunCoronaRed,val) << " " << GetTCVal(m_nSunCoronaGreen,val) << " " << GetTCVal(m_nSunCoronaBlue,val) << " \t\t" << "\t" << GetTCVal(m_nSunCoronaRed, val) << " " << GetTCVal(m_nSunCoronaGreen, val) << " " << GetTCVal(
m_nSunCoronaBlue, val) << " \t\t"
<< "\t" << (GetTCVal(m_fSunSize,val) - 0.5f) / 10.0f << " " << (GetTCVal(m_fSpriteSize,val) - 0.5f) / 10.0f << " " << (GetTCVal(m_fSpriteBrightness,val) - 0.5f) / 10.0f << " \t\t" << "\t" << (GetTCVal(m_fSunSize, val) - 0.5f) / 10.0f << " " << (GetTCVal(m_fSpriteSize, val) - 0.5f) /
10.0f << " " << (GetTCVal(m_fSpriteBrightness, val) - 0.5f) / 10.0f << " \t\t"
<< "\t" << GetTCVal(m_nShadowStrength,val) << " " << GetTCVal(m_nLightShadowStrength,val) << " " << GetTCVal(m_nPoleShadowStrength,val) << " \t\t" << "\t" << GetTCVal(m_nShadowStrength, val) << " " << GetTCVal(m_nLightShadowStrength, val) << " " <<
GetTCVal(m_nPoleShadowStrength, val) << " \t\t"
<< "\t" << GetTCVal(m_fFarClip,val) << " " << GetTCVal(m_fFogStart,val) << " " << (GetTCVal(m_fLightsOnGroundBrightness,val) - 0.5) / 10.0f << " \t\t" << "\t" << GetTCVal(m_fFarClip, val) << " " << GetTCVal(m_fFogStart, val) << " " << (GetTCVal(
m_fLightsOnGroundBrightness, val) - 0.5) / 10.0f << " \t\t"
<< "\t" << GetTCVal(m_nLowCloudsRed,val) << " " << GetTCVal(m_nLowCloudsGreen,val) << " " << GetTCVal(m_nLowCloudsBlue,val) << " \t\t" << "\t" << GetTCVal(m_nLowCloudsRed, val) << " " << GetTCVal(m_nLowCloudsGreen, val) << " " << GetTCVal(
m_nLowCloudsBlue, val) << " \t\t"
<< "\t" << GetTCVal(m_nFluffyCloudsBottomRed,val) << " " <<GetTCVal(m_nFluffyCloudsBottomGreen,val) << " " << GetTCVal(m_nFluffyCloudsBottomBlue,val) << " \t\t" << "\t" << GetTCVal(m_nFluffyCloudsBottomRed, val) << " " << GetTCVal(m_nFluffyCloudsBottomGreen, val)
<< " " << GetTCVal(m_nFluffyCloudsBottomBlue, val) << " \t\t"
<< "\t" << GetTCVal(m_fWaterRed,val) << " " << GetTCVal(m_fWaterGreen,val) << " " << GetTCVal(m_fWaterBlue,val) << " " << GetTCVal(m_fWaterAlpha,val) << " \t\t" << "\t" << GetTCVal(m_fWaterRed, val) << " " << GetTCVal(m_fWaterGreen, val) << " " <<
GetTCVal(m_fWaterBlue, val) << " " << GetTCVal(m_fWaterAlpha, val) << " \t\t"
<< "\t" << GetTCVal(m_fPostFx1Alpha,val) << " " << GetTCVal(m_fPostFx1Red,val) << " " << GetTCVal(m_fPostFx1Green,val) << " " << GetTCVal(m_fPostFx1Blue,val) << " \t\t" << "\t" << GetTCVal(m_fPostFx1Alpha, val) << " " << GetTCVal(m_fPostFx1Red, val) << " " <<
GetTCVal(m_fPostFx1Green, val) << " " << GetTCVal(m_fPostFx1Blue, val) << " \t\t"
<< "\t" << GetTCVal(m_fPostFx2Alpha,val) << " " << GetTCVal(m_fPostFx2Red,val) << " " << GetTCVal(m_fPostFx2Green,val) << " " << GetTCVal(m_fPostFx2Blue,val) << " \t\t" << "\t" << GetTCVal(m_fPostFx2Alpha, val) << " " << GetTCVal(m_fPostFx2Red, val) << " " <<
GetTCVal(m_fPostFx2Green, val) << " " << GetTCVal(m_fPostFx2Blue, val) << " \t\t"
<< "\t" << GetTCVal(m_fCloudAlpha,val) << " " << GetTCVal(m_nHighLightMinIntensity,val) << " " << GetTCVal(m_nWaterFogAlpha,val) << " " << GetTCVal(m_nDirectionalMult,val) / 100.0 << " \t\t" << std::endl; << "\t" << GetTCVal(m_fCloudAlpha, val) << " " << GetTCVal(m_nHighLightMinIntensity, val) << " " <<
GetTCVal(m_nWaterFogAlpha, val) << " " << GetTCVal(m_nDirectionalMult, val) / 100.0 << " \t\t" <<
std::endl;
} }
} }
} }
@ -183,7 +196,7 @@ void Visual::Draw()
if (ImGui::BeginTabItem("Checkboxes")) if (ImGui::BeginTabItem("Checkboxes"))
{ {
ImGui::Spacing(); ImGui::Spacing();
ImGui::Columns(2, 0, false); ImGui::Columns(2, nullptr, false);
Ui::CheckboxAddress("Armour border", 0x589123); Ui::CheckboxAddress("Armour border", 0x589123);
Ui::CheckboxAddress("Armour percentage", 0x589125); Ui::CheckboxAddress("Armour percentage", 0x589125);
Ui::CheckboxAddress("Breath border", 0x589207); Ui::CheckboxAddress("Breath border", 0x589207);
@ -204,8 +217,8 @@ void Visual::Draw()
Command<Commands::DISPLAY_RADAR>(!CHud::bScriptDontDisplayRadar); Command<Commands::DISPLAY_RADAR>(!CHud::bScriptDontDisplayRadar);
Ui::CheckboxAddressEx("Hide wanted level", 0x58DD1B, 0x90, 1); Ui::CheckboxAddressEx("Hide wanted level", 0x58DD1B, 0x90, 1);
if (Ui::CheckboxWithHint("Lock weather", &lock_weather)) if (Ui::CheckboxWithHint("Lock weather", &m_bLockWeather))
weather_type_backup = CWeather::OldWeatherType; m_nBacWeatherType = CWeather::OldWeatherType;
if (Ui::CheckboxWithHint("Show hud", &CHud::m_Wants_To_Draw_Hud)) if (Ui::CheckboxWithHint("Show hud", &CHud::m_Wants_To_Draw_Hud))
Command<Commands::DISPLAY_HUD>(CHud::m_Wants_To_Draw_Hud); Command<Commands::DISPLAY_HUD>(CHud::m_Wants_To_Draw_Hud);
@ -244,7 +257,7 @@ void Visual::Draw()
patch::SetPointer(0x583500, &radar_posY); patch::SetPointer(0x583500, &radar_posY);
patch::SetPointer(0x5834F6, &radar_height); patch::SetPointer(0x5834F6, &radar_height);
patch::SetPointer(0x5834C2, &radar_width); patch::SetPointer(0x5834C2, &radar_width);
patch::SetPointer(0x58A79B, &radar_posX); patch::SetPointer(0x58A79B, &radar_posX);
patch::SetPointer(0x58A7C7, &radar_posY); patch::SetPointer(0x58A7C7, &radar_posY);
patch::SetPointer(0x58A801, &radar_height); patch::SetPointer(0x58A801, &radar_height);
@ -261,7 +274,7 @@ void Visual::Draw()
patch::SetPointer(0x58A9C7, &radar_posY); patch::SetPointer(0x58A9C7, &radar_posY);
patch::SetPointer(0x58A9D5, &radar_height); patch::SetPointer(0x58A9D5, &radar_height);
patch::SetPointer(0x58A99D, &radar_width); patch::SetPointer(0x58A99D, &radar_width);
patch::SetPointer(0x5890FC, &armour_bar); patch::SetPointer(0x5890FC, &armour_bar);
patch::SetChar(0x5890F5, 0); patch::SetChar(0x5890F5, 0);
patch::SetPointer(0x589331, &health_bar); patch::SetPointer(0x589331, &health_bar);
@ -269,7 +282,7 @@ void Visual::Draw()
patch::SetChar(0x5891E4, 0); patch::SetChar(0x5891E4, 0);
patch::SetPointer(0x58EBD1, &clock_bar); patch::SetPointer(0x58EBD1, &clock_bar);
patch::SetChar(0x58EBCA, 0); patch::SetChar(0x58EBCA, 0);
patch::SetPointer(0x58F5FC, &money_posX); patch::SetPointer(0x58F5FC, &money_posX);
patch::SetPointer(0x58F11F, &breath_posX); patch::SetPointer(0x58F11F, &breath_posX);
patch::SetPointer(0x58F100, &breath_posY); patch::SetPointer(0x58F100, &breath_posY);
@ -278,13 +291,14 @@ void Visual::Draw()
patch::SetPointer(0x58F913, &weapon_icon_posY); patch::SetPointer(0x58F913, &weapon_icon_posY);
patch::SetPointer(0x58FA02, &weapon_ammo_posX); patch::SetPointer(0x58FA02, &weapon_ammo_posX);
patch::SetPointer(0x58F9E6, &weapon_ammo_posY); patch::SetPointer(0x58F9E6, &weapon_ammo_posY);
init_patches = true; init_patches = true;
} }
if (ImGui::BeginChild("VisualsChild")) if (ImGui::BeginChild("VisualsChild"))
{ {
ImGui::TextWrapped("These options won't work if you got any mods that drastically changes the game hud. i.e. Mobile Hud, GTA 5 Hud etc."); ImGui::TextWrapped(
"These options won't work if you got any mods that drastically changes the game hud. i.e. Mobile Hud, GTA 5 Hud etc.");
ImGui::Spacing(); ImGui::Spacing();
Ui::ColorPickerAddress("Armourbar color", *(int*)0x5890FC, ImVec4(180, 25, 29, 255)); Ui::ColorPickerAddress("Armourbar color", *(int*)0x5890FC, ImVec4(180, 25, 29, 255));
Ui::EditAddress<float>("Armourbar posX", 0x866B78, -999, 94, 999); Ui::EditAddress<float>("Armourbar posX", 0x866B78, -999, 94, 999);
@ -302,9 +316,11 @@ void Visual::Draw()
Ui::ColorPickerAddress("Money color", 0xBAB230, ImVec4(54, 104, 44, 255)); Ui::ColorPickerAddress("Money color", 0xBAB230, ImVec4(54, 104, 44, 255));
Ui::EditAddress<float>("Money posX", *(int*)0x58F5FC, -999, 32, 999); Ui::EditAddress<float>("Money posX", *(int*)0x58F5FC, -999, 32, 999);
Ui::EditAddress<float>("Money posY", 0x866C88, -999, 89, 999); Ui::EditAddress<float>("Money posY", 0x866C88, -999, 89, 999);
static std::vector<Ui::NamedValue> font_outline{ { "No outline", 0 }, { "Thin outline" ,1 }, { "Default outline" ,2 } }; static std::vector<Ui::NamedValue> font_outline{
{"No outline", 0}, {"Thin outline", 1}, {"Default outline", 2}
};
Ui::EditRadioButtonAddressEx("Money font outline", 0x58F58D, font_outline); Ui::EditRadioButtonAddressEx("Money font outline", 0x58F58D, font_outline);
static std::vector<Ui::NamedValue> style{ { "Style 1", 1 }, { "Style 2" ,2 }, { "Default style" ,3 } }; static std::vector<Ui::NamedValue> style{{"Style 1", 1}, {"Style 2", 2}, {"Default style", 3}};
Ui::EditRadioButtonAddressEx("Money font style", 0x58F57F, style); Ui::EditRadioButtonAddressEx("Money font style", 0x58F57F, style);
Ui::EditAddress<float>("Radar Height", *(int*)0x5834F6, 0, 76, 999); Ui::EditAddress<float>("Radar Height", *(int*)0x5834F6, 0, 76, 999);
Ui::EditAddress<float>("Radar Width", *(int*)0x5834C2, 0, 94, 999); Ui::EditAddress<float>("Radar Width", *(int*)0x5834C2, 0, 94, 999);
@ -312,7 +328,7 @@ void Visual::Draw()
Ui::EditAddress<float>("Radar posY", *(int*)0x583500, -999, 104, 999); Ui::EditAddress<float>("Radar posY", *(int*)0x583500, -999, 104, 999);
Ui::EditAddress<int>("Radar zoom", 0xA444A3, 0, 0, 170); Ui::EditAddress<int>("Radar zoom", 0xA444A3, 0, 0, 170);
Ui::ColorPickerAddress("Radio station color", 0xBAB24C, ImVec4(150, 150, 150, 255)); Ui::ColorPickerAddress("Radio station color", 0xBAB24C, ImVec4(150, 150, 150, 255));
static std::vector<Ui::NamedValue> star_border{ { "No border", 0 }, { "Default" ,1 }, { "Bold border" ,2 } }; static std::vector<Ui::NamedValue> star_border{{"No border", 0}, {"Default", 1}, {"Bold border", 2}};
Ui::EditRadioButtonAddressEx("Wanted star border", 0x58DD41, star_border); Ui::EditRadioButtonAddressEx("Wanted star border", 0x58DD41, star_border);
Ui::EditAddress<float>("Wanted posX", *(int*)0x58DD0F, -999, 29, 999); Ui::EditAddress<float>("Wanted posX", *(int*)0x58DD0F, -999, 29, 999);
Ui::EditAddress<float>("Wanted posY", *(int*)0x58DDFC, -999, 114, 999); Ui::EditAddress<float>("Wanted posY", *(int*)0x58DDFC, -999, 114, 999);
@ -327,7 +343,7 @@ void Visual::Draw()
ImGui::EndTabItem(); ImGui::EndTabItem();
} }
if ( timecyc_hour == 8 ? ImGui::BeginTabItem("Timecyc") : ImGui::BeginTabItem("Timecyc 24h")) if (m_nTimecycHour == 8 ? ImGui::BeginTabItem("Timecyc") : ImGui::BeginTabItem("Timecyc 24h"))
{ {
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::Button("Generate timecyc file", Ui::GetSize(2))) if (ImGui::Button("Generate timecyc file", Ui::GetSize(2)))
@ -344,38 +360,38 @@ void Visual::Draw()
ImGui::Spacing(); ImGui::Spacing();
int weather = CWeather::OldWeatherType; int weather = CWeather::OldWeatherType;
if (Ui::ListBox("Current weather", weather_names, weather)) if (Ui::ListBox("Current weather", m_WeatherNames, weather))
CWeather::OldWeatherType = weather; CWeather::OldWeatherType = weather;
weather = CWeather::NewWeatherType; weather = CWeather::NewWeatherType;
if (Ui::ListBox("Next weather", weather_names, weather)) if (Ui::ListBox("Next weather", m_WeatherNames, weather))
CWeather::NewWeatherType = weather; CWeather::NewWeatherType = weather;
ImGui::Spacing(); ImGui::Spacing();
int hour = CClock::ms_nGameClockHours; int hour = CClock::ms_nGameClockHours;
int minute = CClock::ms_nGameClockMinutes; int minute = CClock::ms_nGameClockMinutes;
if (Game::sync_time) if (CGame::m_bSyncTime)
{ {
ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true);
ImGui::PushStyleVar(ImGuiStyleVar_Alpha, ImGui::GetStyle().Alpha * 0.5f); ImGui::PushStyleVar(ImGuiStyleVar_Alpha, ImGui::GetStyle().Alpha * 0.5f);
} }
if (ImGui::InputInt("Hour", &hour) & !Game::sync_time) if (ImGui::InputInt("Hour", &hour) & !CGame::m_bSyncTime)
{ {
if (hour < 0) hour = 23; if (hour < 0) hour = 23;
if (hour > 23) hour = 0; if (hour > 23) hour = 0;
CClock::ms_nGameClockHours = hour; CClock::ms_nGameClockHours = hour;
} }
if (ImGui::InputInt("Minute", &minute) & !Game::sync_time) if (ImGui::InputInt("Minute", &minute) & !CGame::m_bSyncTime)
{ {
if (minute < 0) minute = 59; if (minute < 0) minute = 59;
if (minute > 59) minute = 0; if (minute > 59) minute = 0;
CClock::ms_nGameClockMinutes = minute; CClock::ms_nGameClockMinutes = minute;
} }
if (Game::sync_time) if (CGame::m_bSyncTime)
{ {
ImGui::PopStyleVar(); ImGui::PopStyleVar();
ImGui::PopItemFlag(); ImGui::PopItemFlag();
@ -392,12 +408,13 @@ void Visual::Draw()
TimeCycColorEdit3("Ambient", m_nAmbientRed, m_nAmbientGreen, m_nAmbientBlue); TimeCycColorEdit3("Ambient", m_nAmbientRed, m_nAmbientGreen, m_nAmbientBlue);
TimeCycColorEdit3("Ambient obj", m_nAmbientRed_Obj, m_nAmbientGreen_Obj, m_nAmbientBlue_Obj); TimeCycColorEdit3("Ambient obj", m_nAmbientRed_Obj, m_nAmbientGreen_Obj, m_nAmbientBlue_Obj);
TimeCycColorEdit3("Fluffy clouds", m_nFluffyCloudsBottomRed , m_nFluffyCloudsBottomGreen, m_nFluffyCloudsBottomBlue); TimeCycColorEdit3("Fluffy clouds", m_nFluffyCloudsBottomRed, m_nFluffyCloudsBottomGreen,
m_nFluffyCloudsBottomBlue);
TimeCycColorEdit3("Low clouds", m_nLowCloudsRed, m_nLowCloudsGreen, m_nLowCloudsBlue); TimeCycColorEdit3("Low clouds", m_nLowCloudsRed, m_nLowCloudsGreen, m_nLowCloudsBlue);
TimeCycColorEdit4("Postfx 1", m_fPostFx1Red, m_fPostFx1Green, m_fPostFx1Blue, m_fPostFx1Alpha); TimeCycColorEdit4("Postfx 1", m_fPostFx1Red, m_fPostFx1Green, m_fPostFx1Blue, m_fPostFx1Alpha);
TimeCycColorEdit4("Postfx 2", m_fPostFx2Red, m_fPostFx2Green, m_fPostFx2Blue, m_fPostFx1Alpha); TimeCycColorEdit4("Postfx 2", m_fPostFx2Red, m_fPostFx2Green, m_fPostFx2Blue, m_fPostFx1Alpha);
TimeCycColorEdit3("Sky bottom", m_nSkyBottomRed, m_nSkyBottomGreen, m_nSkyBottomBlue); TimeCycColorEdit3("Sky bottom", m_nSkyBottomRed, m_nSkyBottomGreen, m_nSkyBottomBlue);
TimeCycColorEdit3("Sun core", m_nSunCoreRed, m_nSunCoreGreen, m_nSunCoreBlue); TimeCycColorEdit3("Sun core", m_nSunCoreRed, m_nSunCoreGreen, m_nSunCoreBlue);
TimeCycColorEdit3("Sun corona", m_nSunCoronaRed, m_nSunCoronaGreen, m_nSunCoronaBlue); TimeCycColorEdit3("Sun corona", m_nSunCoronaRed, m_nSunCoronaGreen, m_nSunCoronaBlue);
@ -413,7 +430,7 @@ void Visual::Draw()
ImGui::BeginChild("TimecycMisc"); ImGui::BeginChild("TimecycMisc");
ImGui::PushItemWidth(ImGui::GetWindowContentRegionWidth() / 2); ImGui::PushItemWidth(ImGui::GetWindowContentRegionWidth() / 2);
TimecycSlider("Cloud alpha", m_fCloudAlpha, 0, 255); TimecycSlider("Cloud alpha", m_fCloudAlpha, 0, 255);
TimecycSlider("Directional mult", m_nDirectionalMult , 0, 255); TimecycSlider("Directional mult", m_nDirectionalMult, 0, 255);
TimecycSlider("Far clip", m_fFarClip, 0, 2000); TimecycSlider("Far clip", m_fFarClip, 0, 2000);
TimecycSlider("Fog start", m_fFogStart, 0, 1500); TimecycSlider("Fog start", m_fFogStart, 0, 1500);
TimecycSlider("High light min intensity", m_nHighLightMinIntensity, 0, 255); TimecycSlider("High light min intensity", m_nHighLightMinIntensity, 0, 255);

View File

@ -2,37 +2,39 @@
class Visual class Visual
{ {
private: private:
inline static bool lock_weather = false; inline static bool m_bLockWeather;
inline static int weather_type_backup = 0; inline static int m_nBacWeatherType;
// Timecyc // Timecyc
inline static int timecyc_hour = 8; inline static int m_nTimecycHour = 8;
inline static std::vector<std::string> weather_names inline static std::vector<std::string> m_WeatherNames
{ {
"EXTRASUNNY LA","SUNNY LA","EXTRASUNNY SMOG LA","SUNNY SMOG LA","CLOUDY LA","SUNNY SF","EXTRASUNNY SF","CLOUDY SF","RAINY SF","FOGGY SF", "EXTRASUNNY LA", "SUNNY LA", "EXTRASUNNY SMOG LA", "SUNNY SMOG LA", "CLOUDY LA", "SUNNY SF", "EXTRASUNNY SF",
"SUNNY VEGAS","EXTRASUNNY VEGAS","CLOUDY VEGAS","EXTRASUNNY COUNTRYSIDE","SUNNY COUNTRYSIDE","CLOUDY COUNTRYSIDE","RAINY COUNTRYSIDE", "CLOUDY SF", "RAINY SF", "FOGGY SF",
"EXTRASUNNY DESERT","SUNNY DESERT","SANDSTORM DESERT","UNDERWATER","EXTRACOLOURS 1","EXTRACOLOURS 2" "SUNNY VEGAS", "EXTRASUNNY VEGAS", "CLOUDY VEGAS", "EXTRASUNNY COUNTRYSIDE", "SUNNY COUNTRYSIDE",
"CLOUDY COUNTRYSIDE", "RAINY COUNTRYSIDE",
"EXTRASUNNY DESERT", "SUNNY DESERT", "SANDSTORM DESERT", "UNDERWATER", "EXTRACOLOURS 1", "EXTRACOLOURS 2"
}; };
static void GenerateTimecycFile(); static void GenerateTimecycFile();
static int GetCurrentHourTimeId(int hour = -1); static int GetCurrentHourTimeId(int hour = -1);
static bool TimeCycColorEdit3(const char* label, uchar* r, uchar* g, uchar* b, ImGuiColorEditFlags flags = 0); static bool TimeCycColorEdit3(const char* label, uchar* r, uchar* g, uchar* b, ImGuiColorEditFlags flags = 0);
static bool TimeCycColorEdit4(const char* label, uchar* r, uchar* g, uchar* b, uchar* a, ImGuiColorEditFlags flags = 0); static bool TimeCycColorEdit4(const char* label, uchar* r, uchar* g, uchar* b, uchar* a,
template<typename T> ImGuiColorEditFlags flags = 0);
template <typename T>
static void TimecycSlider(const char* label, T* data, int min, int max); static void TimecycSlider(const char* label, T* data, int min, int max);
public: public:
Visual(); Visual();
~Visual();
static void Draw(); static void Draw();
}; };
template<typename T> template <typename T>
void Visual::TimecycSlider(const char* label, T* ptr, int min, int max) void Visual::TimecycSlider(const char* label, T* ptr, int min, int max)
{ {
int val = 23 * GetCurrentHourTimeId() + CWeather::OldWeatherType; int val = 23 * GetCurrentHourTimeId() + CWeather::OldWeatherType;
T* arr = (T*)patch::GetPointer(int(ptr)); T* arr = static_cast<T*>(patch::GetPointer(int(ptr)));
int a = arr[val]; int a = arr[val];
if (ImGui::SliderInt(label, &a, min, max)) if (ImGui::SliderInt(label, &a, min, max))
arr[val] = (T)a; arr[val] = static_cast<T>(a);
} }

View File

@ -8,14 +8,16 @@ Weapon::Weapon()
{ {
Events::processScriptsEvent += [] Events::processScriptsEvent += []
{ {
if (!images_loaded) if (!m_bImagesLoaded)
{ {
Util::LoadTexturesInDirRecursive(PLUGIN_PATH((char*)"CheatMenu\\weapons\\"), ".jpg", Weapon::weapon_data.categories, Weapon::weapon_data.images); Util::LoadTexturesInDirRecursive(
images_loaded = true; PLUGIN_PATH((char*)"CheatMenu\\weapons\\"), ".jpg", Weapon::m_WeaponData.m_Categories,
Weapon::m_WeaponData.m_ImagesList);
m_bImagesLoaded = true;
} }
CPlayerPed *player = FindPlayerPed(); CPlayerPed* player = FindPlayerPed();
if (auto_aim) if (m_bAutoAim)
{ {
if (CPad::NewMouseControllerState.X == 0 && CPad::NewMouseControllerState.Y == 0) if (CPad::NewMouseControllerState.X == 0 && CPad::NewMouseControllerState.Y == 0)
{ {
@ -27,15 +29,15 @@ Weapon::Weapon()
} }
uchar slot = player->m_nActiveWeaponSlot; uchar slot = player->m_nActiveWeaponSlot;
if (cur_weapon_slot != slot) if (m_nCurrentWeaponSlot != slot)
{ {
auto weapon_type = player->m_aWeapons[slot].m_nType; auto weapon_type = player->m_aWeapons[slot].m_nType;
CWeaponInfo *pweapon_info = CWeaponInfo::GetWeaponInfo(weapon_type, player->GetWeaponSkill(weapon_type)); CWeaponInfo* pweapon_info = CWeaponInfo::GetWeaponInfo(weapon_type, player->GetWeaponSkill(weapon_type));
if (huge_damage) if (m_bHugeDamage)
pweapon_info->m_nDamage = 1000; pweapon_info->m_nDamage = 1000;
if (long_range) if (m_bLongRange)
{ {
pweapon_info->m_fTargetRange = 1000.0f; pweapon_info->m_fTargetRange = 1000.0f;
pweapon_info->m_fWeaponRange = 1000.0f; pweapon_info->m_fWeaponRange = 1000.0f;
@ -43,19 +45,20 @@ Weapon::Weapon()
pweapon_info->m_nFlags.bReload2Start = true; pweapon_info->m_nFlags.bReload2Start = true;
} }
if (rapid_fire && weapon_type != WEAPON_MINIGUN) // mingun doesn't work with rapidfire if (m_bRapidFire && weapon_type != WEAPON_MINIGUN) // mingun doesn't work with rapidfire
pweapon_info->m_nFlags.bContinuosFire = true; pweapon_info->m_nFlags.bContinuosFire = true;
if (dual_weild && (weapon_type == WEAPON_PISTOL || weapon_type == WEAPON_MICRO_UZI || weapon_type == WEAPON_TEC9 || weapon_type == WEAPON_SAWNOFF)) if (m_bDualWeild && (weapon_type == WEAPON_PISTOL || weapon_type == WEAPON_MICRO_UZI || weapon_type ==
WEAPON_TEC9 || weapon_type == WEAPON_SAWNOFF))
pweapon_info->m_nFlags.bTwinPistol = true; pweapon_info->m_nFlags.bTwinPistol = true;
if (move_aim) if (m_bMoveAim)
pweapon_info->m_nFlags.bMoveAim = true; pweapon_info->m_nFlags.bMoveAim = true;
if (move_fire) if (m_bMoveFire)
pweapon_info->m_nFlags.bMoveFire = true; pweapon_info->m_nFlags.bMoveFire = true;
cur_weapon_slot = slot; m_nCurrentWeaponSlot = slot;
} }
}; };
} }
@ -63,13 +66,14 @@ Weapon::Weapon()
Weapon::~Weapon() Weapon::~Weapon()
{ {
Util::ReleaseTextures(Weapon::weapon_data.images); Util::ReleaseTextures(Weapon::m_WeaponData.m_ImagesList);
} }
void Weapon::SetGangWeapon(std::string& weapon_type) void Weapon::SetGangWeapon(std::string& weapon_type)
{ {
gang_weapons[selected_gang][selected_weapon_count] = std::stoi(weapon_type); m_nGangWeaponList[m_nSelectedGang][m_nSelectedWeapon] = std::stoi(weapon_type);
CGangs::SetGangWeapons(selected_gang, gang_weapons[selected_gang][0], gang_weapons[selected_gang][1], gang_weapons[selected_gang][2]); CGangs::SetGangWeapons(m_nSelectedGang, m_nGangWeaponList[m_nSelectedGang][0], m_nGangWeaponList[m_nSelectedGang][1],
m_nGangWeaponList[m_nSelectedGang][2]);
} }
void Weapon::GiveWeaponToPlayer(std::string& weapon_type) void Weapon::GiveWeaponToPlayer(std::string& weapon_type)
@ -86,25 +90,25 @@ void Weapon::GiveWeaponToPlayer(std::string& weapon_type)
int model = NULL; int model = NULL;
Command<Commands::GET_WEAPONTYPE_MODEL>(iweapon_type, &model); Command<Commands::GET_WEAPONTYPE_MODEL>(iweapon_type, &model);
CStreaming::RequestModel(model,PRIORITY_REQUEST); CStreaming::RequestModel(model, PRIORITY_REQUEST);
if (model == 363) // remote bomb if (model == 363) // remote bomb
CStreaming::RequestModel(364,PRIORITY_REQUEST); // detonator CStreaming::RequestModel(364, PRIORITY_REQUEST); // detonator
CStreaming::LoadAllRequestedModels(false); CStreaming::LoadAllRequestedModels(false);
Command<Commands::GIVE_WEAPON_TO_CHAR>(hplayer, iweapon_type, ammo_count); Command<Commands::GIVE_WEAPON_TO_CHAR>(hplayer, iweapon_type, m_nAmmoCount);
if (model == 363) // remote bomb if (model == 363) // remote bomb
Command<Commands::MARK_MODEL_AS_NO_LONGER_NEEDED>(364); // detonator Command<Commands::MARK_MODEL_AS_NO_LONGER_NEEDED>(364); // detonator
Command<Commands::MARK_MODEL_AS_NO_LONGER_NEEDED>(model); Command<Commands::MARK_MODEL_AS_NO_LONGER_NEEDED>(model);
} }
} }
void Weapon::Draw() void Weapon::Draw()
{ {
CPlayerPed *player = FindPlayerPed(); CPlayerPed* player = FindPlayerPed();
uint hplayer = CPools::GetPedRef(player); uint hplayer = CPools::GetPedRef(player);
ImGui::Spacing(); ImGui::Spacing();
@ -113,10 +117,10 @@ void Weapon::Draw()
float x, y, z; float x, y, z;
Command<Commands::GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS>(hplayer, 0.0, 3.0, 0.0, &x, &y, &z); Command<Commands::GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS>(hplayer, 0.0, 3.0, 0.0, &x, &y, &z);
auto type = player->m_aWeapons[player->m_nActiveWeaponSlot].m_nType; auto type = player->m_aWeapons[player->m_nActiveWeaponSlot].m_nType;
if (type) if (type)
{ {
int model =0, pickup = 0; int model = 0, pickup = 0;
Command<Commands::GET_WEAPONTYPE_MODEL>(type, &model); Command<Commands::GET_WEAPONTYPE_MODEL>(type, &model);
Command<Commands::CREATE_PICKUP_WITH_AMMO>(model, 3, 999, x, y, z, &pickup); Command<Commands::CREATE_PICKUP_WITH_AMMO>(model, 3, 999, x, y, z, &pickup);
@ -142,42 +146,43 @@ void Weapon::Draw()
ImGui::BeginChild("CheckboxesChild"); ImGui::BeginChild("CheckboxesChild");
ImGui::Columns(2, 0, false); ImGui::Columns(2, 0, false);
Ui::CheckboxWithHint("Auto aim", &auto_aim, "Enables aim assist on keyboard\n\nQ = left E = right"); Ui::CheckboxWithHint("Auto aim", &m_bAutoAim, "Enables aim assist on keyboard\n\nQ = left E = right");
if (Ui::CheckboxWithHint("Dual weild", &dual_weild,"Dual weild pistol, shawoff, uzi, tec9\n(Other weapons don't work)")) if (Ui::CheckboxWithHint("Dual weild", &m_bDualWeild,
"Dual weild pistol, shawoff, uzi, tec9\n(Other weapons don't work)"))
{ {
if (!dual_weild) if (!m_bDualWeild)
CWeaponInfo::LoadWeaponData(); CWeaponInfo::LoadWeaponData();
} }
if (Ui::CheckboxWithHint("Huge damage", &huge_damage)) if (Ui::CheckboxWithHint("Huge damage", &m_bHugeDamage))
{ {
if (!huge_damage) if (!m_bHugeDamage)
CWeaponInfo::LoadWeaponData(); CWeaponInfo::LoadWeaponData();
} }
if (Ui::CheckboxWithHint("Fast reload", &fast_reload)) if (Ui::CheckboxWithHint("Fast reload", &m_bFastReload))
Command<Commands::SET_PLAYER_FAST_RELOAD>(hplayer, fast_reload); Command<Commands::SET_PLAYER_FAST_RELOAD>(hplayer, m_bFastReload);
Ui::CheckboxAddress("Infinite ammo", 0x969178); Ui::CheckboxAddress("Infinite ammo", 0x969178);
ImGui::NextColumn(); ImGui::NextColumn();
if (Ui::CheckboxWithHint("Long range", &long_range)) if (Ui::CheckboxWithHint("Long range", &m_bLongRange))
{ {
if (!long_range) if (!m_bLongRange)
CWeaponInfo::LoadWeaponData(); CWeaponInfo::LoadWeaponData();
} }
if (Ui::CheckboxWithHint("Move when aiming", &move_aim)) if (Ui::CheckboxWithHint("Move when aiming", &m_bMoveAim))
{ {
if (!move_aim) if (!m_bMoveAim)
CWeaponInfo::LoadWeaponData(); CWeaponInfo::LoadWeaponData();
} }
if (Ui::CheckboxWithHint("Move when firing", &move_fire)) if (Ui::CheckboxWithHint("Move when firing", &m_bMoveFire))
{ {
if (!move_fire) if (!m_bMoveFire)
CWeaponInfo::LoadWeaponData(); CWeaponInfo::LoadWeaponData();
} }
if (Ui::CheckboxWithHint("Rapid fire", &rapid_fire)) if (Ui::CheckboxWithHint("Rapid fire", &m_bRapidFire))
{ {
if (!rapid_fire) if (!m_bRapidFire)
CWeaponInfo::LoadWeaponData(); CWeaponInfo::LoadWeaponData();
} }
ImGui::Columns(1, 0, false); ImGui::Columns(1, 0, false);
@ -187,36 +192,40 @@ void Weapon::Draw()
if (ImGui::BeginTabItem("Gang weapon editor")) if (ImGui::BeginTabItem("Gang weapon editor"))
{ {
ImGui::Spacing(); ImGui::Spacing();
Ui::ListBox("Select gang", Ped::gang_names, selected_gang); Ui::ListBox("Select gang", Ped::m_GangNames, m_nSelectedGang);
ImGui::Columns(3, 0, false); ImGui::Columns(3, 0, false);
ImGui::RadioButton("Weap 1", &selected_weapon_count, 0); ImGui::RadioButton("Weap 1", &m_nSelectedWeapon, 0);
ImGui::NextColumn(); ImGui::NextColumn();
ImGui::RadioButton("Weap 2", &selected_weapon_count, 1); ImGui::RadioButton("Weap 2", &m_nSelectedWeapon, 1);
ImGui::NextColumn(); ImGui::NextColumn();
ImGui::RadioButton("Weap 3", &selected_weapon_count, 2); ImGui::RadioButton("Weap 3", &m_nSelectedWeapon, 2);
ImGui::Columns(1); ImGui::Columns(1);
ImGui::Spacing(); ImGui::Spacing();
ImGui::Text("Current weapon: %s", weapon_data.json.data[std::to_string(gang_weapons[selected_gang][selected_weapon_count])].get<std::string>().c_str()); ImGui::Text("Current weapon: %s",
m_WeaponData.m_Json.m_Data[std::to_string(m_nGangWeaponList[m_nSelectedGang][m_nSelectedWeapon])].get<
std::string>().c_str());
ImGui::Spacing(); ImGui::Spacing();
Ui::DrawImages(weapon_data.images, ImVec2(65, 65), weapon_data.categories, weapon_data.selected, weapon_data.filter, SetGangWeapon, nullptr, Ui::DrawImages(m_WeaponData.m_ImagesList, ImVec2(65, 65), m_WeaponData.m_Categories, m_WeaponData.m_Selected,
[](std::string str) {return weapon_data.json.data[str].get<std::string>(); }, m_WeaponData.m_Filter, SetGangWeapon, nullptr,
[](std::string str) {return str != "-1"; /*Jetpack*/ } [](std::string str) { return m_WeaponData.m_Json.m_Data[str].get<std::string>(); },
[](std::string str) { return str != "-1"; /*Jetpack*/ }
); );
ImGui::EndTabItem(); ImGui::EndTabItem();
} }
if (ImGui::BeginTabItem("Spawn")) if (ImGui::BeginTabItem("Spawn"))
{ {
ImGui::Spacing(); ImGui::Spacing();
if (ImGui::InputInt("Ammo", &ammo_count)) if (ImGui::InputInt("Ammo", &m_nAmmoCount))
{ {
ammo_count = (ammo_count < 0) ? 0 : ammo_count; m_nAmmoCount = (m_nAmmoCount < 0) ? 0 : m_nAmmoCount;
ammo_count = (ammo_count > 99999) ? 99999 : ammo_count; m_nAmmoCount = (m_nAmmoCount > 99999) ? 99999 : m_nAmmoCount;
} }
Ui::DrawImages(weapon_data.images, ImVec2(65, 65), weapon_data.categories, weapon_data.selected, weapon_data.filter, GiveWeaponToPlayer, nullptr, Ui::DrawImages(m_WeaponData.m_ImagesList, ImVec2(65, 65), m_WeaponData.m_Categories, m_WeaponData.m_Selected,
[](std::string str) {return weapon_data.json.data[str].get<std::string>(); }, m_WeaponData.m_Filter, GiveWeaponToPlayer, nullptr,
[](std::string str) {return str != "0"; /*Unarmed*/ } [](std::string str) { return m_WeaponData.m_Json.m_Data[str].get<std::string>(); },
[](std::string str) { return str != "0"; /*Unarmed*/ }
); );
ImGui::EndTabItem(); ImGui::EndTabItem();
} }

View File

@ -3,35 +3,32 @@
class Weapon class Weapon
{ {
public: public:
inline static SearchData weapon_data{ "weapon" }; inline static SSearchData m_WeaponData{"weapon"};
inline static bool images_loaded = false; inline static bool m_bImagesLoaded;
inline static bool m_bAutoAim;
inline static bool auto_aim = false; inline static bool m_bFastReload;
inline static bool fast_reload = false; inline static bool m_bHugeDamage;
inline static bool huge_damage = false; inline static bool m_bLongRange;
inline static bool long_range = false; inline static bool m_bRapidFire;
inline static bool rapid_fire = false; inline static bool m_bDualWeild;
inline static bool dual_weild = false; inline static bool m_bMoveAim;
inline static bool move_aim = false; inline static bool m_bMoveFire;
inline static bool move_fire = false; inline static int m_nAmmoCount = 99999;
inline static uchar m_nCurrentWeaponSlot = -1;
inline static int ammo_count = 99999; inline static int m_nSelectedGang;
inline static uchar cur_weapon_slot = -1; inline static int m_nSelectedWeapon;
inline static int m_nGangWeaponList[10][3] =
inline static int selected_gang = 0;
inline static int selected_weapon_count = 0;
inline static int gang_weapons[10][3] =
{ {
{WEAPON_PISTOL, WEAPON_MICRO_UZI, WEAPON_UNARMED }, // Ballas {WEAPON_PISTOL, WEAPON_MICRO_UZI, WEAPON_UNARMED}, // Ballas
{WEAPON_PISTOL, WEAPON_UNARMED, WEAPON_UNARMED}, // Grove {WEAPON_PISTOL, WEAPON_UNARMED, WEAPON_UNARMED}, // Grove
{WEAPON_PISTOL, WEAPON_UNARMED, WEAPON_UNARMED}, // Vagos {WEAPON_PISTOL, WEAPON_UNARMED, WEAPON_UNARMED}, // Vagos
{WEAPON_UNARMED, WEAPON_UNARMED, WEAPON_UNARMED}, // SF Rifa {WEAPON_UNARMED, WEAPON_UNARMED, WEAPON_UNARMED}, // SF Rifa
{WEAPON_PISTOL, WEAPON_MICRO_UZI, WEAPON_UNARMED}, // Da Nang Boys {WEAPON_PISTOL, WEAPON_MICRO_UZI, WEAPON_UNARMED}, // Da Nang Boys
{WEAPON_DESERT_EAGLE , WEAPON_UNARMED, WEAPON_UNARMED}, // Mafia {WEAPON_DESERT_EAGLE, WEAPON_UNARMED, WEAPON_UNARMED}, // Mafia
{WEAPON_PISTOL, WEAPON_AK47, WEAPON_UNARMED}, // Triads {WEAPON_PISTOL, WEAPON_AK47, WEAPON_UNARMED}, // Triads
{WEAPON_PISTOL, WEAPON_MICRO_UZI, WEAPON_UNARMED}, // VLA {WEAPON_PISTOL, WEAPON_MICRO_UZI, WEAPON_UNARMED}, // VLA
{WEAPON_UNARMED, WEAPON_UNARMED, WEAPON_UNARMED}, // Gang 9 {WEAPON_UNARMED, WEAPON_UNARMED, WEAPON_UNARMED}, // Gang 9
{WEAPON_UNARMED, WEAPON_UNARMED, WEAPON_UNARMED}, // Gang 10 {WEAPON_UNARMED, WEAPON_UNARMED, WEAPON_UNARMED}, // Gang 10
}; };
Weapon(); Weapon();
@ -41,4 +38,3 @@ public:
static void GiveWeaponToPlayer(std::string& weapon_type); static void GiveWeaponToPlayer(std::string& weapon_type);
static void SetGangWeapon(std::string& weapon_type); static void SetGangWeapon(std::string& weapon_type);
}; };

View File

@ -64,7 +64,7 @@
#include "VKeys.h" #include "VKeys.h"
// Globals // Globals
typedef std::vector<std::pair<std::string, void(*)()>> CallbackTable; using CallbackTable = std::vector<std::pair<std::string, void(*)()>>;
using namespace plugin; using namespace plugin;
namespace fs = std::filesystem; namespace fs = std::filesystem;
@ -77,39 +77,37 @@ enum Renderer
struct Globals struct Globals
{ {
inline static std::string header_id = ""; inline static std::string m_HeaderId;
inline static ImVec2 menu_size = ImVec2(screen::GetScreenWidth() / 4, screen::GetScreenHeight() / 1.2); inline static ImVec2 m_fMenuSize = ImVec2(screen::GetScreenWidth() / 4, screen::GetScreenHeight() / 1.2);
inline static ImVec2 screen_size = ImVec2(-1, -1); inline static ImVec2 m_fScreenSize = ImVec2(-1, -1);
inline static bool show_menu = false; inline static bool m_bShowMenu;
inline static bool init_done = false; inline static bool m_bInit;
inline static bool menu_closing = false;
inline static Renderer renderer = Render_Unknown; inline static Renderer renderer = Render_Unknown;
inline static void* device = nullptr; inline static void* device;
}; };
extern std::ofstream flog; extern std::ofstream flog;
extern CJson config; extern CJson config;
struct TextureStructure struct STextureStructure
{ {
std::string file_name; std::string m_FileName;
std::string category_name; std::string m_CategoryName;
void* texture = nullptr; void* m_pTexture;
}; };
struct HotKeyData struct HotKeyData
{ {
int key1; int m_key1;
int key2; int m_key2;
bool is_down = false; bool m_bPressed;
}; };
struct SSearchData
struct SearchData
{ {
CJson json; CJson m_Json;
ImGuiTextFilter filter = ""; ImGuiTextFilter m_Filter = "";
std::vector<std::string> categories; std::vector<std::string> m_Categories;
std::string selected = "All"; std::string m_Selected = "All";
std::vector<std::unique_ptr<TextureStructure>> images; std::vector<std::unique_ptr<STextureStructure>> m_ImagesList;
}; };