Added vehicles menu (vc) and improvements
This commit is contained in:
parent
916eed8556
commit
45f033f2d2
@ -6,21 +6,20 @@
|
|||||||
|
|
||||||
Animation::Animation()
|
Animation::Animation()
|
||||||
{
|
{
|
||||||
m_AnimData.m_Json.LoadData(m_AnimData.m_Categories, m_AnimData.m_Selected);
|
|
||||||
m_Cutscene::m_Data.m_Json.LoadData(m_Cutscene::m_Data.m_Categories, m_Cutscene::m_Data.m_Selected);
|
|
||||||
|
|
||||||
Events::processScriptsEvent += [this]
|
Events::processScriptsEvent += [this]
|
||||||
{
|
{
|
||||||
if (m_Cutscene::m_bRunning)
|
if (m_Cutscene::m_bRunning)
|
||||||
{
|
{
|
||||||
if (Command<Commands::HAS_CUTSCENE_FINISHED>())
|
if (Command<Commands::HAS_CUTSCENE_FINISHED>())
|
||||||
{
|
{
|
||||||
Command<Commands::CLEAR_CUTSCENE>();
|
CPlayerPed* pPlayer = FindPlayerPed();
|
||||||
m_Cutscene::m_bRunning = false;
|
if (!pPlayer)
|
||||||
m_Cutscene::m_SceneName = "";
|
{
|
||||||
CPlayerPed* player = FindPlayerPed();
|
return;
|
||||||
player->m_nAreaCode = m_Cutscene::m_nInterior;
|
}
|
||||||
Command<Commands::SET_AREA_VISIBLE>(player->m_nAreaCode);
|
|
||||||
|
pPlayer->m_nAreaCode = m_Cutscene::m_nInterior;
|
||||||
|
Command<Commands::SET_AREA_VISIBLE>(pPlayer->m_nAreaCode);
|
||||||
m_Cutscene::m_nInterior = 0;
|
m_Cutscene::m_nInterior = 0;
|
||||||
TheCamera.Fade(0, 1);
|
TheCamera.Fade(0, 1);
|
||||||
}
|
}
|
||||||
@ -43,10 +42,14 @@ void Animation::PlayCutscene(std::string& rootKey, std::string& cutsceneId, std:
|
|||||||
SetHelpMessage("Another cutscene is running", false, false, false);
|
SetHelpMessage("Another cutscene is running", false, false, false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
CPlayerPed* pPlayer = FindPlayerPed();
|
||||||
|
if (!pPlayer)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
m_Cutscene::m_SceneName = cutsceneId;
|
m_Cutscene::m_SceneName = cutsceneId;
|
||||||
Command<Commands::LOAD_CUTSCENE>(cutsceneId.c_str());
|
Command<Commands::LOAD_CUTSCENE>(cutsceneId.c_str());
|
||||||
CPlayerPed* pPlayer = FindPlayerPed();
|
|
||||||
m_Cutscene::m_nInterior = pPlayer->m_nAreaCode;
|
m_Cutscene::m_nInterior = pPlayer->m_nAreaCode;
|
||||||
pPlayer->m_nAreaCode = std::stoi(interior);
|
pPlayer->m_nAreaCode = std::stoi(interior);
|
||||||
Command<Commands::SET_AREA_VISIBLE>(pPlayer->m_nAreaCode);
|
Command<Commands::SET_AREA_VISIBLE>(pPlayer->m_nAreaCode);
|
||||||
@ -68,7 +71,9 @@ void Animation::Draw()
|
|||||||
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();
|
||||||
@ -126,8 +131,8 @@ void Animation::Draw()
|
|||||||
ImGui::Spacing();
|
ImGui::Spacing();
|
||||||
if (ImGui::Button("Add animation", Ui::GetSize()))
|
if (ImGui::Button("Add animation", Ui::GetSize()))
|
||||||
{
|
{
|
||||||
m_AnimData.m_Json.m_Data["Custom"][m_nAnimBuffer] = ("0, " + std::string(m_nIfpBuffer));
|
m_AnimData.m_pJson->m_Data["Custom"][m_nAnimBuffer] = ("0, " + std::string(m_nIfpBuffer));
|
||||||
m_AnimData.m_Json.WriteToDisk();
|
m_AnimData.m_pJson->WriteToDisk();
|
||||||
}
|
}
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
@ -174,23 +179,31 @@ void Animation::PlayAnimation(std::string& ifp, std::string& anim, std::string&
|
|||||||
|
|
||||||
Command<Commands::CLEAR_CHAR_TASKS>(hplayer);
|
Command<Commands::CLEAR_CHAR_TASKS>(hplayer);
|
||||||
if (m_bSecondary)
|
if (m_bSecondary)
|
||||||
|
{
|
||||||
Command<Commands::TASK_PLAY_ANIM_SECONDARY>(hplayer, anim.c_str(), ifp.c_str(), 4.0, m_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, m_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& ifpRepeat)
|
void Animation::RemoveAnimation(std::string& ifp, std::string& anim, std::string& ifpRepeat)
|
||||||
{
|
{
|
||||||
if (ifp == "Custom")
|
if (ifp == "Custom")
|
||||||
{
|
{
|
||||||
m_AnimData.m_Json.m_Data["Custom"].erase(anim);
|
m_AnimData.m_pJson->m_Data["Custom"].erase(anim);
|
||||||
m_AnimData.m_Json.WriteToDisk();
|
m_AnimData.m_pJson->WriteToDisk();
|
||||||
SetHelpMessage("Animation removed", false, false, false);
|
SetHelpMessage("Animation removed", false, false, false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
SetHelpMessage("You can only remove custom anims", false, false, false);
|
SetHelpMessage("You can only remove custom anims", false, false, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
@ -6,10 +6,10 @@ class Animation
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
inline static char m_nAnimBuffer[INPUT_BUFFER_SIZE];
|
inline static char m_nAnimBuffer[INPUT_BUFFER_SIZE];
|
||||||
inline static SSearchData m_AnimData{ "animation" };
|
inline static ResourceStore m_AnimData{ "animation", eResourceType::TYPE_TEXT };
|
||||||
struct m_Cutscene
|
struct m_Cutscene
|
||||||
{
|
{
|
||||||
inline static SSearchData m_Data{ "cutscene" };
|
inline static ResourceStore m_Data{ "cutscene", eResourceType::TYPE_TEXT };
|
||||||
inline static std::string m_SceneName;
|
inline static std::string m_SceneName;
|
||||||
inline static int m_nInterior;
|
inline static int m_nInterior;
|
||||||
inline static bool m_bRunning;
|
inline static bool m_bRunning;
|
||||||
@ -38,5 +38,6 @@ public:
|
|||||||
};
|
};
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
// Dummy Class for GTAVC
|
||||||
class Animation{};
|
class Animation{};
|
||||||
#endif
|
#endif
|
@ -192,14 +192,16 @@ void MenuThread(void* param)
|
|||||||
Hook::ApplyMouseFix();
|
Hook::ApplyMouseFix();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Wait till the game is initialized
|
// Wait till game init
|
||||||
Events::initRwEvent += []
|
Events::initRwEvent += []
|
||||||
{
|
{
|
||||||
bGameInit = true;
|
bGameInit = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
while (!bGameInit)
|
while (!bGameInit)
|
||||||
|
{
|
||||||
Sleep(1000);
|
Sleep(1000);
|
||||||
|
}
|
||||||
|
|
||||||
if (GetModuleHandle("SAMP.dll"))
|
if (GetModuleHandle("SAMP.dll"))
|
||||||
{
|
{
|
||||||
@ -212,7 +214,7 @@ void MenuThread(void* param)
|
|||||||
CFastman92limitAdjuster::Init();
|
CFastman92limitAdjuster::Init();
|
||||||
CheatMenu menu;
|
CheatMenu menu;
|
||||||
|
|
||||||
time_t now = time(0);
|
time_t now = time(0);
|
||||||
struct tm tstruct = *localtime(&now);
|
struct tm tstruct = *localtime(&now);
|
||||||
int last_check_date = config.GetValue("config.last_update_checked", 0);
|
int last_check_date = config.GetValue("config.last_update_checked", 0);
|
||||||
|
|
||||||
@ -227,7 +229,9 @@ void MenuThread(void* param)
|
|||||||
Sleep(5000);
|
Sleep(5000);
|
||||||
|
|
||||||
if (Updater::m_State == UPDATER_CHECKING)
|
if (Updater::m_State == UPDATER_CHECKING)
|
||||||
|
{
|
||||||
Updater::CheckForUpdate();
|
Updater::CheckForUpdate();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -246,6 +250,8 @@ BOOL WINAPI DllMain(HINSTANCE hDllHandle, DWORD nReason, LPVOID Reserved)
|
|||||||
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);
|
||||||
}
|
}
|
||||||
#elif GTAVC
|
#elif GTAVC
|
||||||
|
MessageBox(RsGlobal.ps->window, "Unknown game version. GTA VC v1.0 EN is required.", "CheatMenu", MB_ICONERROR);
|
||||||
|
|
||||||
if (gameVersion == GAME_10EN)
|
if (gameVersion == GAME_10EN)
|
||||||
{
|
{
|
||||||
CreateThread(nullptr, NULL, (LPTHREAD_START_ROUTINE)&MenuThread, nullptr, NULL, nullptr);
|
CreateThread(nullptr, NULL, (LPTHREAD_START_ROUTINE)&MenuThread, nullptr, NULL, nullptr);
|
||||||
|
@ -28,9 +28,6 @@ void Game::RealTimeClock()
|
|||||||
|
|
||||||
Game::Game()
|
Game::Game()
|
||||||
{
|
{
|
||||||
m_MissionData.m_Json.LoadData(m_MissionData.m_Categories, m_MissionData.m_Selected);
|
|
||||||
m_StatData.m_Json.LoadData(m_StatData.m_Categories, m_StatData.m_Selected);
|
|
||||||
|
|
||||||
// Generate enabled cheats vector
|
// Generate enabled cheats vector
|
||||||
for (auto element : m_RandomCheats::m_Json.m_Data.items())
|
for (auto element : m_RandomCheats::m_Json.m_Data.items())
|
||||||
{
|
{
|
||||||
@ -605,7 +602,7 @@ It's recommanded not to save after using the mission loader. Use it at your own
|
|||||||
ImGui::Spacing();
|
ImGui::Spacing();
|
||||||
|
|
||||||
ImGui::BeginChild("STATCHILD");
|
ImGui::BeginChild("STATCHILD");
|
||||||
for (auto root : m_StatData.m_Json.m_Data.items())
|
for (auto root : m_StatData.m_pJson->m_Data.items())
|
||||||
{
|
{
|
||||||
if (root.key() == m_StatData.m_Selected || m_StatData.m_Selected == "All")
|
if (root.key() == m_StatData.m_Selected || m_StatData.m_Selected == "All")
|
||||||
{
|
{
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include "pch.h"
|
||||||
class Game
|
class Game
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
inline static SSearchData m_MissionData{ "mission" };
|
inline static ResourceStore m_MissionData{ "mission", eResourceType::TYPE_TEXT };
|
||||||
inline static std::vector<std::string> m_DayNames =
|
inline static std::vector<std::string> m_DayNames =
|
||||||
{
|
{
|
||||||
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
|
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
|
||||||
@ -49,7 +50,7 @@ public:
|
|||||||
inline static uint m_nSolidWaterObj;
|
inline static uint m_nSolidWaterObj;
|
||||||
inline static bool m_bMissionLoaderWarningShown;
|
inline static bool m_bMissionLoaderWarningShown;
|
||||||
|
|
||||||
inline static SSearchData m_StatData{ "stat" };
|
inline static ResourceStore m_StatData{ "stat", eResourceType::TYPE_TEXT };
|
||||||
|
|
||||||
Game();
|
Game();
|
||||||
static void Draw();
|
static void Draw();
|
||||||
|
12
src/Json.cpp
12
src/Json.cpp
@ -4,7 +4,9 @@
|
|||||||
CJson::CJson(const char* name)
|
CJson::CJson(const char* name)
|
||||||
{
|
{
|
||||||
if (name == "" || !fs::is_directory(PLUGIN_PATH((char*)"CheatMenu")))
|
if (name == "" || !fs::is_directory(PLUGIN_PATH((char*)"CheatMenu")))
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
m_FilePath = PLUGIN_PATH((char*)"/CheatMenu/json/") + std::string(name) + ".json";
|
m_FilePath = PLUGIN_PATH((char*)"/CheatMenu/json/") + std::string(name) + ".json";
|
||||||
|
|
||||||
@ -27,9 +29,13 @@ CJson::CJson(const char* name)
|
|||||||
m_Data = "{}"_json;
|
m_Data = "{}"_json;
|
||||||
|
|
||||||
if (m_FilePath.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 " << m_FilePath << std::endl;
|
flog << "Failed to locate file " << m_FilePath << std::endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,9 +45,3 @@ void CJson::WriteToDisk()
|
|||||||
file << m_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
|
|
||||||
{
|
|
||||||
for (auto element : m_Data.items())
|
|
||||||
vec.push_back(element.key());
|
|
||||||
}
|
|
||||||
|
24
src/Json.h
24
src/Json.h
@ -1,6 +1,10 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "../Depend/json.hpp"
|
#include "../Depend/json.hpp"
|
||||||
|
|
||||||
|
/*
|
||||||
|
Wrapper class for nlohmann::json
|
||||||
|
Contains helper methods
|
||||||
|
*/
|
||||||
class CJson
|
class CJson
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
@ -26,7 +30,9 @@ public:
|
|||||||
nlohmann::json* json = &m_Data;
|
nlohmann::json* json = &m_Data;
|
||||||
|
|
||||||
while (getline(ss, line, '.'))
|
while (getline(ss, line, '.'))
|
||||||
|
{
|
||||||
json = &((*json)[line]);
|
json = &((*json)[line]);
|
||||||
|
}
|
||||||
|
|
||||||
// json library bugs with bool, using int instead
|
// json library bugs with bool, using int instead
|
||||||
if (typeid(T) == typeid(bool))
|
if (typeid(T) == typeid(bool))
|
||||||
@ -52,7 +58,9 @@ public:
|
|||||||
nlohmann::json* json = &m_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>();
|
||||||
}
|
}
|
||||||
@ -66,7 +74,6 @@ public:
|
|||||||
Allows to save values in json hierarchy using '.'
|
Allows to save values in json hierarchy using '.'
|
||||||
Example: "Menu.Window.X"
|
Example: "Menu.Window.X"
|
||||||
*/
|
*/
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void SetValue(std::string&& key, T& val)
|
void SetValue(std::string&& key, T& val)
|
||||||
{
|
{
|
||||||
@ -76,13 +83,20 @@ public:
|
|||||||
nlohmann::json* json = &m_Data;
|
nlohmann::json* json = &m_Data;
|
||||||
|
|
||||||
while (getline(ss, line, '.'))
|
while (getline(ss, line, '.'))
|
||||||
|
{
|
||||||
json = &((*json)[line]);
|
json = &((*json)[line]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// json library bugs with bool, using int instead
|
// json library bugs with bool, using int instead
|
||||||
if (typeid(T) == typeid(bool))
|
if (typeid(T) == typeid(bool))
|
||||||
|
{
|
||||||
*json = (val ? 1 : 0);
|
*json = (val ? 1 : 0);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
*json = val;
|
*json = val;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
@ -94,17 +108,13 @@ public:
|
|||||||
nlohmann::json* json = &m_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.
|
|
||||||
Used to create drop down category menus
|
|
||||||
*/
|
|
||||||
void LoadData(std::vector<std::string>& vec, std::string& selected);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Saves json data to disk
|
Saves json data to disk
|
||||||
*/
|
*/
|
||||||
|
@ -86,14 +86,6 @@ void Paint::ResetAfterRenderEvent(CVehicle* pVeh)
|
|||||||
|
|
||||||
Paint::Paint()
|
Paint::Paint()
|
||||||
{
|
{
|
||||||
Events::processScriptsEvent += []
|
|
||||||
{
|
|
||||||
if (!m_bImagesLoaded)
|
|
||||||
{
|
|
||||||
Util::LoadTextureDirectory(m_TextureData, PLUGIN_PATH((char*)"CheatMenu\\textures.txd"));
|
|
||||||
m_bImagesLoaded = true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Events::vehicleRenderEvent.before += RenderEvent;
|
Events::vehicleRenderEvent.before += RenderEvent;
|
||||||
Events::vehicleResetAfterRender += ResetAfterRenderEvent;
|
Events::vehicleResetAfterRender += ResetAfterRenderEvent;
|
||||||
}
|
}
|
||||||
|
@ -70,11 +70,10 @@ private:
|
|||||||
void resetMaterialColor(RpMaterial* material);
|
void resetMaterialColor(RpMaterial* material);
|
||||||
void resetMaterialTexture(RpMaterial* material);
|
void resetMaterialTexture(RpMaterial* material);
|
||||||
};
|
};
|
||||||
inline static bool m_bImagesLoaded;
|
|
||||||
inline static VehicleExtendedData<VehData> m_VehData;
|
inline static VehicleExtendedData<VehData> m_VehData;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
inline static SSearchData m_TextureData;
|
inline static ResourceStore m_TextureData { "textures" };
|
||||||
|
|
||||||
struct veh_nodes
|
struct veh_nodes
|
||||||
{
|
{
|
||||||
|
19
src/Ped.cpp
19
src/Ped.cpp
@ -11,17 +11,6 @@ Ped::Ped()
|
|||||||
{
|
{
|
||||||
m_bExGangWarsInstalled = true;
|
m_bExGangWarsInstalled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Events::processScriptsEvent += []
|
|
||||||
{
|
|
||||||
if (!m_bImagesLoaded)
|
|
||||||
{
|
|
||||||
Util::LoadTextureDirectory(m_PedData, PLUGIN_PATH((char*)"CheatMenu\\peds.txd"));
|
|
||||||
m_bImagesLoaded = true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
#elif GTAVC
|
|
||||||
m_PedData.m_Json.LoadData(m_PedData.m_Categories, m_PedData.m_Selected);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -46,7 +35,7 @@ void Ped::SpawnPed(std::string& cat, std::string& name, std::string& model)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BY_GAME(m_PedData.m_Json.m_Data.contains(model), true))
|
if (BY_GAME(m_PedData.m_pJson->m_Data.contains(model), true))
|
||||||
{
|
{
|
||||||
CPlayerPed* player = FindPlayerPed();
|
CPlayerPed* player = FindPlayerPed();
|
||||||
CVector pos = player->GetPosition();
|
CVector pos = player->GetPosition();
|
||||||
@ -273,7 +262,7 @@ void Ped::Draw()
|
|||||||
#ifdef GTASA
|
#ifdef GTASA
|
||||||
Ui::DrawImages(m_PedData.m_ImagesList, ImVec2(65, 110), m_PedData.m_Categories, m_PedData.m_Selected,
|
Ui::DrawImages(m_PedData.m_ImagesList, ImVec2(65, 110), m_PedData.m_Categories, m_PedData.m_Selected,
|
||||||
m_PedData.m_Filter, SpawnPed, nullptr,
|
m_PedData.m_Filter, SpawnPed, nullptr,
|
||||||
[](std::string str) { return m_PedData.m_Json.m_Data[str].get<std::string>(); });
|
[](std::string str) { return m_PedData.m_pJson->m_Data[str].get<std::string>(); });
|
||||||
#elif GTAVC
|
#elif GTAVC
|
||||||
Ui::DrawJSON(m_PedData, SpawnPed, nullptr);
|
Ui::DrawJSON(m_PedData, SpawnPed, nullptr);
|
||||||
#endif
|
#endif
|
||||||
@ -303,7 +292,7 @@ void Ped::Draw()
|
|||||||
#ifdef GTASA
|
#ifdef GTASA
|
||||||
ImGui::Spacing();
|
ImGui::Spacing();
|
||||||
ImGui::Text("Selected weapon: %s",
|
ImGui::Text("Selected weapon: %s",
|
||||||
Weapon::m_WeaponData.m_Json.m_Data[std::to_string(m_SpawnPed::m_nWeaponId)].get<std::string>().c_str());
|
Weapon::m_WeaponData.m_pJson->m_Data[std::to_string(m_SpawnPed::m_nWeaponId)].get<std::string>().c_str());
|
||||||
ImGui::Spacing();
|
ImGui::Spacing();
|
||||||
|
|
||||||
Ui::DrawImages(Weapon::m_WeaponData.m_ImagesList, ImVec2(65, 65), Weapon::m_WeaponData.m_Categories,
|
Ui::DrawImages(Weapon::m_WeaponData.m_ImagesList, ImVec2(65, 65), Weapon::m_WeaponData.m_Categories,
|
||||||
@ -312,7 +301,7 @@ void Ped::Draw()
|
|||||||
nullptr,
|
nullptr,
|
||||||
[](std::string str)
|
[](std::string str)
|
||||||
{
|
{
|
||||||
return Weapon::m_WeaponData.m_Json.m_Data[str].get<std::string>();
|
return Weapon::m_WeaponData.m_pJson->m_Data[str].get<std::string>();
|
||||||
},
|
},
|
||||||
[](std::string str) { return str != "-1"; /*Jetpack*/ }
|
[](std::string str) { return str != "-1"; /*Jetpack*/ }
|
||||||
);
|
);
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include "pch.h"
|
||||||
#include "Player.h"
|
#include "Player.h"
|
||||||
#ifdef GTASA
|
#ifdef GTASA
|
||||||
#include "Weapon.h"
|
#include "Weapon.h"
|
||||||
@ -10,7 +11,7 @@ private:
|
|||||||
inline static CJson m_SpecialPedJson = CJson("ped special");
|
inline static CJson m_SpecialPedJson = CJson("ped special");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
inline static SSearchData m_PedData{"ped"};
|
inline static ResourceStore m_PedData{"ped", eResourceType::TYPE_TEXT};
|
||||||
inline static bool m_bImagesLoaded;
|
inline static bool m_bImagesLoaded;
|
||||||
inline static bool m_bExGangWarsInstalled;
|
inline static bool m_bExGangWarsInstalled;
|
||||||
inline static int m_nPedRemoveRadius = 5;
|
inline static int m_nPedRemoveRadius = 5;
|
||||||
|
@ -81,19 +81,6 @@ Player::Player()
|
|||||||
CPlayerPed* player = FindPlayerPed();
|
CPlayerPed* player = FindPlayerPed();
|
||||||
int hplayer = CPools::GetPedRef(player);
|
int hplayer = CPools::GetPedRef(player);
|
||||||
|
|
||||||
|
|
||||||
if (!m_bImagesLoaded)
|
|
||||||
{
|
|
||||||
#ifdef GTASA
|
|
||||||
Util::LoadTextureDirectory(m_ClothData, PLUGIN_PATH((char*)"CheatMenu\\clothes.txd"), true);
|
|
||||||
#elif GTAVC
|
|
||||||
skinData.m_Json.LoadData(skinData.m_Categories, skinData.m_Selected);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
m_bImagesLoaded = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (m_KeepPosition::m_bEnabled)
|
if (m_KeepPosition::m_bEnabled)
|
||||||
{
|
{
|
||||||
if (Command<Commands::IS_CHAR_DEAD>(hplayer))
|
if (Command<Commands::IS_CHAR_DEAD>(hplayer))
|
||||||
@ -220,7 +207,7 @@ void Player::ChangePlayerModel(std::string& model)
|
|||||||
bool custom_skin = std::find(m_CustomSkins::m_List.begin(), m_CustomSkins::m_List.end(), model) !=
|
bool custom_skin = std::find(m_CustomSkins::m_List.begin(), m_CustomSkins::m_List.end(), model) !=
|
||||||
m_CustomSkins::m_List.end();
|
m_CustomSkins::m_List.end();
|
||||||
|
|
||||||
if (Ped::m_PedData.m_Json.m_Data.contains(model) || custom_skin)
|
if (Ped::m_PedData.m_pJson->m_Data.contains(model) || custom_skin)
|
||||||
{
|
{
|
||||||
CPlayerPed* player = FindPlayerPed();
|
CPlayerPed* player = FindPlayerPed();
|
||||||
if (Ped::m_SpecialPedJson.m_Data.contains(model) || custom_skin)
|
if (Ped::m_SpecialPedJson.m_Data.contains(model) || custom_skin)
|
||||||
@ -611,7 +598,7 @@ void Player::Draw()
|
|||||||
{
|
{
|
||||||
Ui::DrawImages(Ped::m_PedData.m_ImagesList, ImVec2(65, 110), Ped::m_PedData.m_Categories,
|
Ui::DrawImages(Ped::m_PedData.m_ImagesList, ImVec2(65, 110), Ped::m_PedData.m_Categories,
|
||||||
Ped::m_PedData.m_Selected, Ped::m_PedData.m_Filter, ChangePlayerModel, nullptr,
|
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>(); });
|
[](std::string str) { return Ped::m_PedData.m_pJson->m_Data[str].get<std::string>(); });
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
if (ImGui::BeginTabItem("Custom skins"))
|
if (ImGui::BeginTabItem("Custom skins"))
|
||||||
|
@ -5,7 +5,6 @@ class Player
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
inline static bool m_bGodMode;
|
inline static bool m_bGodMode;
|
||||||
inline static bool m_bImagesLoaded;
|
|
||||||
inline static bool m_bModloaderInstalled;
|
inline static bool m_bModloaderInstalled;
|
||||||
struct m_KeepPosition
|
struct m_KeepPosition
|
||||||
{
|
{
|
||||||
@ -16,7 +15,7 @@ private:
|
|||||||
#ifdef GTASA
|
#ifdef GTASA
|
||||||
inline static bool m_bAimSkinChanger;
|
inline static bool m_bAimSkinChanger;
|
||||||
inline static int m_nUiBodyState;
|
inline static int m_nUiBodyState;
|
||||||
inline static SSearchData m_ClothData;
|
inline static ResourceStore m_ClothData { "clothes" };
|
||||||
struct m_CustomSkins
|
struct m_CustomSkins
|
||||||
{
|
{
|
||||||
inline static std::string m_Path = paths::GetGameDirPathA() + std::string("\\modloader\\Custom Skins\\");;
|
inline static std::string m_Path = paths::GetGameDirPathA() + std::string("\\modloader\\Custom Skins\\");;
|
||||||
@ -24,7 +23,7 @@ private:
|
|||||||
inline static std::vector<std::string> m_List;
|
inline static std::vector<std::string> m_List;
|
||||||
};
|
};
|
||||||
#elif GTAVC
|
#elif GTAVC
|
||||||
inline static SSearchData skinData{ "skin" };
|
inline static ResourceStore skinData{ "skin", eResourceType::TYPE_TEXT };
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
85
src/ResourceStore.cpp
Normal file
85
src/ResourceStore.cpp
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
#include "pch.h"
|
||||||
|
#include "CFileLoader.h"
|
||||||
|
#include "extensions/Paths.h"
|
||||||
|
|
||||||
|
ResourceStore::ResourceStore(const char* text, eResourceType type)
|
||||||
|
{
|
||||||
|
if (type == eResourceType::TYPE_IMAGE)
|
||||||
|
{
|
||||||
|
Events::processScriptsEvent += [text, this]()
|
||||||
|
{
|
||||||
|
if (!m_bTexturesLoaded)
|
||||||
|
{
|
||||||
|
// LoadTextureDirectory(ResourceStore& data, char* path, bool pass_full_name)
|
||||||
|
LoadTextureResource(text);
|
||||||
|
m_bTexturesLoaded = true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_pJson = std::make_unique<CJson>(text);
|
||||||
|
|
||||||
|
// Generate categories
|
||||||
|
for (auto element : m_pJson->m_Data.items())
|
||||||
|
{
|
||||||
|
m_Categories.push_back(element.key());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void* GetTextureFromRaster(RwTexture* pTexture)
|
||||||
|
{
|
||||||
|
RwRasterEx* raster = (RwRasterEx*)(&pTexture->raster->parent);
|
||||||
|
|
||||||
|
return (&raster->m_pRenderResource->texture);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ResourceStore::LoadTextureResource(std::string&& name)
|
||||||
|
{
|
||||||
|
std::string fullPath = PLUGIN_PATH((char*)"CheatMenu\\") + name + ".txd";
|
||||||
|
RwTexDictionary* pRwTexDictionary = CFileLoader::LoadTexDictionary(fullPath.c_str());
|
||||||
|
|
||||||
|
if (pRwTexDictionary)
|
||||||
|
{
|
||||||
|
RwLinkList *pRLL = (RwLinkList*)pRwTexDictionary->texturesInDict.link.next;
|
||||||
|
RwTexDictionary *pEndDic;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
pEndDic = (RwTexDictionary*)pRLL->link.next;
|
||||||
|
RwTexture *pTex = (RwTexture*)&pRLL[-1];
|
||||||
|
|
||||||
|
m_ImagesList.push_back(std::make_unique<STextureResource>());
|
||||||
|
m_ImagesList.back().get()->m_pRwTexture = pTex;
|
||||||
|
|
||||||
|
// Fetch IDirec9Texture9* from RwTexture*
|
||||||
|
m_ImagesList.back().get()->m_pTexture = GetTextureFromRaster(pTex);
|
||||||
|
|
||||||
|
// Naming format in Txd `Category$TextureName`
|
||||||
|
std::stringstream ss(pTex->name);
|
||||||
|
std::string str;
|
||||||
|
getline(ss, str, '$');
|
||||||
|
m_ImagesList.back().get()->m_CategoryName = str;
|
||||||
|
|
||||||
|
if (name == "clothes")
|
||||||
|
{
|
||||||
|
// pass full name
|
||||||
|
m_ImagesList.back().get()->m_FileName = pTex->name;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
getline(ss, str, '$');
|
||||||
|
m_ImagesList.back().get()->m_FileName = str;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Genereate categories
|
||||||
|
std::string itemNames;
|
||||||
|
if (!std::count(m_Categories.begin(), m_Categories.end(), itemNames))
|
||||||
|
{
|
||||||
|
m_Categories.push_back(itemNames);
|
||||||
|
}
|
||||||
|
pRLL = (RwLinkList*)pEndDic;
|
||||||
|
}
|
||||||
|
while ( pEndDic != (RwTexDictionary*)&pRwTexDictionary->texturesInDict );
|
||||||
|
}
|
||||||
|
}
|
60
src/ResourceStore.h
Normal file
60
src/ResourceStore.h
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
#include <string>
|
||||||
|
#include <rw/rwcore.h>
|
||||||
|
#include "Json.h"
|
||||||
|
#include "../depend/imgui/imgui.h"
|
||||||
|
#include "d3d9.h"
|
||||||
|
|
||||||
|
struct RwD3D9Raster
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
IDirect3DTexture9* texture;
|
||||||
|
IDirect3DSurface9* surface;
|
||||||
|
};
|
||||||
|
unsigned char* palette;
|
||||||
|
unsigned char alpha;
|
||||||
|
unsigned char cubeTextureFlags; /* 0x01 IS_CUBEMAP_TEX */
|
||||||
|
unsigned char textureFlags; /* 0x10 IS_COMPRESSED */
|
||||||
|
unsigned char lockedLevel;
|
||||||
|
IDirect3DSurface9* lockedSurface;
|
||||||
|
D3DLOCKED_RECT lockedRect;
|
||||||
|
D3DFORMAT format;
|
||||||
|
IDirect3DSwapChain9* swapChain;
|
||||||
|
HWND* hwnd;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RwRasterEx : public RwRaster
|
||||||
|
{
|
||||||
|
RwD3D9Raster *m_pRenderResource;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct STextureResource
|
||||||
|
{
|
||||||
|
std::string m_FileName;
|
||||||
|
std::string m_CategoryName;
|
||||||
|
RwTexture *m_pRwTexture = nullptr;
|
||||||
|
void *m_pTexture = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum eResourceType
|
||||||
|
{
|
||||||
|
TYPE_IMAGE,
|
||||||
|
TYPE_TEXT,
|
||||||
|
};
|
||||||
|
|
||||||
|
using TextureResourceList = std::vector<std::unique_ptr<STextureResource>>;
|
||||||
|
class ResourceStore
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
void LoadTextureResource(std::string&& path);
|
||||||
|
|
||||||
|
public:
|
||||||
|
ImGuiTextFilter m_Filter = "";
|
||||||
|
std::vector<std::string> m_Categories = {"All"};
|
||||||
|
std::string m_Selected = "All";
|
||||||
|
std::unique_ptr<CJson> m_pJson;
|
||||||
|
TextureResourceList m_ImagesList;
|
||||||
|
bool m_bTexturesLoaded = false;
|
||||||
|
|
||||||
|
ResourceStore(const char* text, eResourceType type = TYPE_IMAGE);
|
||||||
|
};
|
@ -15,9 +15,11 @@ void Teleport::FetchRadarSpriteData()
|
|||||||
|
|
||||||
// Update the radar list each 5 seconds
|
// Update the radar list each 5 seconds
|
||||||
if (cur_timer - timer < 5000)
|
if (cur_timer - timer < 5000)
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
tp_data.m_Json.m_Data.erase("Radar");
|
tp_data.m_pJson->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)
|
||||||
@ -27,7 +29,7 @@ void Teleport::FetchRadarSpriteData()
|
|||||||
auto sprite_name = m_SpriteJson.m_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.m_Json.m_Data["Radar"][key_name] = "0, " + std::to_string(pos.x) + ", " + std::to_string(pos.y) + ", " +
|
tp_data.m_pJson->m_Data["Radar"][key_name] = "0, " + std::to_string(pos.x) + ", " + std::to_string(pos.y) + ", " +
|
||||||
std::to_string(pos.z);
|
std::to_string(pos.z);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -41,7 +43,6 @@ void Teleport::FetchRadarSpriteData()
|
|||||||
|
|
||||||
Teleport::Teleport()
|
Teleport::Teleport()
|
||||||
{
|
{
|
||||||
tp_data.m_Json.LoadData(tp_data.m_Categories, tp_data.m_Selected);
|
|
||||||
m_bQuickTeleport = config.GetValue("quick_teleport", false);
|
m_bQuickTeleport = config.GetValue("quick_teleport", false);
|
||||||
|
|
||||||
Events::processScriptsEvent += []
|
Events::processScriptsEvent += []
|
||||||
@ -61,9 +62,13 @@ Teleport::Teleport()
|
|||||||
CVehicle* pVeh = player->m_pVehicle;
|
CVehicle* pVeh = player->m_pVehicle;
|
||||||
|
|
||||||
if (pVeh && BY_GAME(player->m_nPedFlags.bInVehicle, player->m_pVehicle))
|
if (pVeh && BY_GAME(player->m_nPedFlags.bInVehicle, player->m_pVehicle))
|
||||||
|
{
|
||||||
BY_GAME(pVeh->Teleport(m_Teleport::m_fPos, false), pVeh->Teleport(m_Teleport::m_fPos));
|
BY_GAME(pVeh->Teleport(m_Teleport::m_fPos, false), pVeh->Teleport(m_Teleport::m_fPos));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
BY_GAME(player->Teleport(m_Teleport::m_fPos, false), player->Teleport(m_Teleport::m_fPos));
|
BY_GAME(player->Teleport(m_Teleport::m_fPos, false), player->Teleport(m_Teleport::m_fPos));
|
||||||
|
}
|
||||||
|
|
||||||
m_Teleport::m_bEnabled = 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);
|
||||||
@ -83,7 +88,7 @@ Teleport::Teleport()
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
void Teleport::TeleportPlayer(bool get_marker, CVector pos, short interior_id)
|
void Teleport::TeleportPlayer(bool get_marker, CVector pos, int interior_id)
|
||||||
{
|
{
|
||||||
CPlayerPed* pPlayer = FindPlayerPed();
|
CPlayerPed* pPlayer = FindPlayerPed();
|
||||||
CVehicle* pVeh = pPlayer->m_pVehicle;
|
CVehicle* pVeh = pPlayer->m_pVehicle;
|
||||||
@ -150,24 +155,10 @@ void Teleport::TeleportToLocation(std::string& rootkey, std::string& bLocName, s
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
int interior = 0;
|
int dimension = 0;
|
||||||
CVector pos;
|
CVector pos;
|
||||||
std::stringstream ss(loc);
|
sscanf(loc.c_str(), "%d,%f,%f,%f", &dimension, &pos.x, &pos.y, &pos.z);
|
||||||
std::string temp;
|
TeleportPlayer(false, pos, dimension);
|
||||||
|
|
||||||
std::getline(ss, temp, ',');
|
|
||||||
interior = std::stoi(temp);
|
|
||||||
|
|
||||||
std::getline(ss, temp, ',');
|
|
||||||
pos.x = std::stof(temp);
|
|
||||||
|
|
||||||
std::getline(ss, temp, ',');
|
|
||||||
pos.y = std::stof(temp);
|
|
||||||
|
|
||||||
std::getline(ss, temp, ',');
|
|
||||||
pos.z = std::stof(temp);
|
|
||||||
|
|
||||||
TeleportPlayer(false, pos, static_cast<short>(interior));
|
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
@ -179,11 +170,14 @@ void Teleport::RemoveTeleportEntry(std::string& category, std::string& key, std:
|
|||||||
{
|
{
|
||||||
if (category == "Custom")
|
if (category == "Custom")
|
||||||
{
|
{
|
||||||
tp_data.m_Json.m_Data["Custom"].erase(key);
|
tp_data.m_pJson->m_Data["Custom"].erase(key);
|
||||||
SetHelpMessage("Location removed", false, false, false);
|
SetHelpMessage("Location removed", false, false, false);
|
||||||
tp_data.m_Json.WriteToDisk();
|
tp_data.m_pJson->WriteToDisk();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetHelpMessage("You can only remove custom location", false, false, false);
|
||||||
}
|
}
|
||||||
else SetHelpMessage("You can only remove custom location", false, false, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Teleport::Draw()
|
void Teleport::Draw()
|
||||||
@ -225,21 +219,12 @@ void Teleport::Draw()
|
|||||||
|
|
||||||
if (ImGui::Button("Teleport to coord", Ui::GetSize(2)))
|
if (ImGui::Button("Teleport to coord", Ui::GetSize(2)))
|
||||||
{
|
{
|
||||||
std::stringstream ss(m_nInputBuffer);
|
CVector pos;
|
||||||
std::string temp;
|
|
||||||
CVector pos(0, 0, 0);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
getline(ss, temp, ',');
|
sscanf(m_nInputBuffer,"%f,%f,%f", &pos.x, &pos.y, &pos.z);
|
||||||
pos.x = std::stof(temp);
|
pos.z += 1.0f;
|
||||||
|
|
||||||
getline(ss, temp, ',');
|
|
||||||
pos.y = std::stof(temp);
|
|
||||||
|
|
||||||
getline(ss, temp, ',');
|
|
||||||
pos.z = std::stof(temp) + 1.0f;
|
|
||||||
|
|
||||||
TeleportPlayer(false, pos);
|
TeleportPlayer(false, pos);
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
@ -283,15 +268,15 @@ void Teleport::Draw()
|
|||||||
ImGui::Spacing();
|
ImGui::Spacing();
|
||||||
if (ImGui::Button("Add location", Ui::GetSize()))
|
if (ImGui::Button("Add location", Ui::GetSize()))
|
||||||
{
|
{
|
||||||
tp_data.m_Json.m_Data["Custom"][m_nLocationBuffer] = ("0, " + std::string(m_nInputBuffer));
|
tp_data.m_pJson->m_Data["Custom"][m_nLocationBuffer] = ("0, " + std::string(m_nInputBuffer));
|
||||||
|
|
||||||
#ifdef GTASA
|
#ifdef GTASA
|
||||||
// Clear the Radar coordinates
|
// Clear the Radar coordinates
|
||||||
tp_data.m_Json.m_Data.erase("Radar");
|
tp_data.m_pJson->m_Data.erase("Radar");
|
||||||
tp_data.m_Json.m_Data["Radar"] = {};
|
tp_data.m_pJson->m_Data["Radar"] = {};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
tp_data.m_Json.WriteToDisk();
|
tp_data.m_pJson->WriteToDisk();
|
||||||
}
|
}
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@ private:
|
|||||||
inline static bool m_bInsertCoord;
|
inline static bool m_bInsertCoord;
|
||||||
inline static bool m_bQuickTeleport;
|
inline static bool m_bQuickTeleport;
|
||||||
inline static char m_nInputBuffer[INPUT_BUFFER_SIZE];
|
inline static char m_nInputBuffer[INPUT_BUFFER_SIZE];
|
||||||
inline static SSearchData tp_data{ "teleport" };
|
inline static ResourceStore tp_data{ "teleport", eResourceType::TYPE_TEXT };
|
||||||
inline static char m_nLocationBuffer[INPUT_BUFFER_SIZE];
|
inline static char m_nLocationBuffer[INPUT_BUFFER_SIZE];
|
||||||
inline static uint m_nQuickTeleportTimer;
|
inline static uint m_nQuickTeleportTimer;
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ 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), int 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);
|
||||||
};
|
};
|
||||||
|
@ -347,7 +347,7 @@ bool Ui::CheckboxBitFlag(const char* label, uint flag, const char* hint)
|
|||||||
return rtn;
|
return rtn;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ui::DrawJSON(SSearchData& data,
|
void Ui::DrawJSON(ResourceStore& data,
|
||||||
std::function<void(std::string&, std::string&, std::string&)> func_left_click,
|
std::function<void(std::string&, std::string&, std::string&)> func_left_click,
|
||||||
std::function<void(std::string&, std::string&, std::string&)> func_right_click)
|
std::function<void(std::string&, std::string&, std::string&)> func_right_click)
|
||||||
{
|
{
|
||||||
@ -376,7 +376,7 @@ void Ui::DrawJSON(SSearchData& data,
|
|||||||
|
|
||||||
|
|
||||||
ImGui::BeginChild(1);
|
ImGui::BeginChild(1);
|
||||||
for (auto root : data.m_Json.m_Data.items())
|
for (auto root : data.m_pJson->m_Data.items())
|
||||||
{
|
{
|
||||||
if (root.key() == data.m_Selected || data.m_Selected == "All")
|
if (root.key() == data.m_Selected || data.m_Selected == "All")
|
||||||
{
|
{
|
||||||
@ -483,7 +483,7 @@ 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<STextureStructure>>& img_vec, ImVec2 image_size,
|
void Ui::DrawImages(std::vector<std::unique_ptr<STextureResource>>& 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<std::string(std::string&)> get_name_func,
|
||||||
|
4
src/Ui.h
4
src/Ui.h
@ -48,10 +48,10 @@ public:
|
|||||||
static bool CheckboxWithHint(const char* label, bool* state, const char* hint = nullptr, 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(SSearchData& data,
|
static void DrawJSON(ResourceStore& data,
|
||||||
std::function<void(std::string&, std::string&, std::string&)> func_left_click,
|
std::function<void(std::string&, std::string&, std::string&)> func_left_click,
|
||||||
std::function<void(std::string&, std::string&, std::string&)> func_right_click);
|
std::function<void(std::string&, std::string&, std::string&)> func_right_click);
|
||||||
static void DrawImages(std::vector<std::unique_ptr<STextureStructure>>& img_vec, ImVec2 image_size,
|
static void DrawImages(std::vector<std::unique_ptr<STextureResource>>& 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_left_click,
|
||||||
std::function<void(std::string&)> on_right_click,
|
std::function<void(std::string&)> on_right_click,
|
||||||
|
69
src/Util.cpp
69
src/Util.cpp
@ -1,75 +1,6 @@
|
|||||||
#include "pch.h"
|
#include "pch.h"
|
||||||
#include "Util.h"
|
#include "Util.h"
|
||||||
#include "psapi.h"
|
#include "psapi.h"
|
||||||
#include "CFileLoader.h"
|
|
||||||
|
|
||||||
void Util::LoadTextureDirectory(SSearchData& data, char* path, bool pass_full_name)
|
|
||||||
{
|
|
||||||
RwTexDictionary* pRwTexDictionary = &data.txd;
|
|
||||||
|
|
||||||
// allow SA textures for VC
|
|
||||||
pRwTexDictionary = CFileLoader::LoadTexDictionary(path);
|
|
||||||
|
|
||||||
if (pRwTexDictionary)
|
|
||||||
{
|
|
||||||
// FIX ME
|
|
||||||
if (pass_full_name)
|
|
||||||
{
|
|
||||||
RwTexDictionaryForAllTextures(pRwTexDictionary, [](RwTexture* tex, void* data)
|
|
||||||
{
|
|
||||||
SSearchData* sdata = reinterpret_cast<SSearchData*>(data);
|
|
||||||
sdata->m_ImagesList.push_back(std::make_unique<STextureStructure>());
|
|
||||||
sdata->m_ImagesList.back().get()->m_pRwTexture = tex;
|
|
||||||
sdata->m_ImagesList.back().get()->m_pTexture = Util::GetTextureFromRaster(tex);
|
|
||||||
|
|
||||||
std::stringstream ss(tex->name);
|
|
||||||
std::string str;
|
|
||||||
getline(ss, str, '$');
|
|
||||||
|
|
||||||
sdata->m_ImagesList.back().get()->m_CategoryName = str;
|
|
||||||
if (!std::count(sdata->m_Categories.begin(), sdata->m_Categories.end(), str))
|
|
||||||
{
|
|
||||||
sdata->m_Categories.push_back(str);
|
|
||||||
}
|
|
||||||
sdata->m_ImagesList.back().get()->m_FileName = tex->name;
|
|
||||||
|
|
||||||
return tex;
|
|
||||||
}, &data);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
RwTexDictionaryForAllTextures(pRwTexDictionary, [](RwTexture* tex, void* data)
|
|
||||||
{
|
|
||||||
SSearchData* sdata = reinterpret_cast<SSearchData*>(data);
|
|
||||||
sdata->m_ImagesList.push_back(std::make_unique<STextureStructure>());
|
|
||||||
sdata->m_ImagesList.back().get()->m_pRwTexture = tex;
|
|
||||||
sdata->m_ImagesList.back().get()->m_pTexture = Util::GetTextureFromRaster(tex);
|
|
||||||
|
|
||||||
std::stringstream ss(tex->name);
|
|
||||||
std::string str;
|
|
||||||
getline(ss, str, '$');
|
|
||||||
|
|
||||||
sdata->m_ImagesList.back().get()->m_CategoryName = str;
|
|
||||||
if (!std::count(sdata->m_Categories.begin(), sdata->m_Categories.end(), str))
|
|
||||||
{
|
|
||||||
sdata->m_Categories.push_back(str);
|
|
||||||
}
|
|
||||||
getline(ss, str);
|
|
||||||
sdata->m_ImagesList.back().get()->m_FileName = str;
|
|
||||||
|
|
||||||
return tex;
|
|
||||||
}, &data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void* Util::GetTextureFromRaster(RwTexture* pTexture)
|
|
||||||
{
|
|
||||||
RwRasterEx* raster = (RwRasterEx*)(&pTexture->raster->parent);
|
|
||||||
|
|
||||||
return (&raster->renderResource->texture);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string Util::GetLocationName(CVector* pos)
|
std::string Util::GetLocationName(CVector* pos)
|
||||||
{
|
{
|
||||||
|
@ -26,6 +26,4 @@ public:
|
|||||||
static void RainbowValues(int& r, int& g, int& b, float speed);
|
static void RainbowValues(int& r, int& g, int& b, float speed);
|
||||||
static void GetCPUUsageInit();
|
static void GetCPUUsageInit();
|
||||||
static double GetCurrentCPUUsage();
|
static double GetCurrentCPUUsage();
|
||||||
static void* GetTextureFromRaster(RwTexture* pTexture);
|
|
||||||
static void LoadTextureDirectory(SSearchData& data, char* path, bool pass_full_name = false);
|
|
||||||
};
|
};
|
||||||
|
236
src/Vehicle.cpp
236
src/Vehicle.cpp
@ -33,19 +33,10 @@ Vehicle::Vehicle()
|
|||||||
#ifdef GTASA
|
#ifdef GTASA
|
||||||
ParseVehiclesIDE();
|
ParseVehiclesIDE();
|
||||||
#endif
|
#endif
|
||||||
ParseCarcolsDAT();
|
|
||||||
|
|
||||||
Events::processScriptsEvent += [this]
|
Events::processScriptsEvent += [this]
|
||||||
{
|
{
|
||||||
#ifdef GTASA
|
ParseCarcolsDAT();
|
||||||
if (!m_bImagesLoaded)
|
|
||||||
{
|
|
||||||
Util::LoadTextureDirectory(m_Spawner::m_VehData, PLUGIN_PATH((char*)"CheatMenu\\vehicles.txd"));
|
|
||||||
Util::LoadTextureDirectory(m_TuneData, PLUGIN_PATH((char*)"CheatMenu\\components.txd"));
|
|
||||||
m_bImagesLoaded = true;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
uint timer = CTimer::m_snTimeInMilliseconds;
|
uint timer = CTimer::m_snTimeInMilliseconds;
|
||||||
CPlayerPed* pPlayer = FindPlayerPed();
|
CPlayerPed* pPlayer = FindPlayerPed();
|
||||||
CVehicle* pVeh = pPlayer->m_pVehicle;
|
CVehicle* pVeh = pPlayer->m_pVehicle;
|
||||||
@ -326,11 +317,72 @@ void Vehicle::ParseVehiclesIDE()
|
|||||||
}
|
}
|
||||||
else flog << "Vehicle.ide file not found";
|
else flog << "Vehicle.ide file not found";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Vehicle::GenerateHandlingDataFile(int phandling)
|
||||||
|
{
|
||||||
|
FILE* fp = fopen("handling.txt", "w");
|
||||||
|
|
||||||
|
std::string handlingId = m_VehicleIDE[FindPlayerPed()->m_pVehicle->m_nModelIndex];
|
||||||
|
float fMass = patch::Get<float>(phandling + 0x4);
|
||||||
|
float fTurnMass = patch::Get<float>(phandling + 0xC);
|
||||||
|
float fDragMult = patch::Get<float>(phandling + 0x10);
|
||||||
|
float CentreOfMassX = patch::Get<float>(phandling + 0x14);
|
||||||
|
float CentreOfMassY = patch::Get<float>(phandling + 0x18);
|
||||||
|
float CentreOfMassZ = patch::Get<float>(phandling + 0x1C);
|
||||||
|
int nPercentSubmerged = patch::Get<int>(phandling + 0x20);
|
||||||
|
float fTractionMultiplier = patch::Get<float>(phandling + 0x28);
|
||||||
|
float fTractionLoss = patch::Get<float>(phandling + 0xA4);
|
||||||
|
float TractionBias = patch::Get<float>(phandling + 0xA8);
|
||||||
|
float fEngineAcceleration = patch::Get<float>(phandling + 0x7C) * 12500;
|
||||||
|
float fEngineInertia = patch::Get<float>(phandling + 0x80);
|
||||||
|
int nDriveType = patch::Get<BYTE>(phandling + 0x74);
|
||||||
|
int nEngineType = patch::Get<BYTE>(phandling + 0x75);
|
||||||
|
float BrakeDeceleration = patch::Get<float>(phandling + 0x94) * 2500;
|
||||||
|
float BrakeBias = patch::Get<float>(phandling + 0x98);
|
||||||
|
int ABS = patch::Get<BYTE>(phandling + 0x9C);
|
||||||
|
float SteeringLock = patch::Get<float>(phandling + 0xA0);
|
||||||
|
float SuspensionForceLevel = patch::Get<float>(phandling + 0xAC);
|
||||||
|
float SuspensionDampingLevel = patch::Get<float>(phandling + 0xB0);
|
||||||
|
float SuspensionHighSpdComDamp = patch::Get<float>(phandling + 0xB4);
|
||||||
|
float Suspension_upper_limit = patch::Get<float>(phandling + 0xB8);
|
||||||
|
float Suspension_lower_limit = patch::Get<float>(phandling + 0xBC);
|
||||||
|
float Suspension_bias = patch::Get<float>(phandling + 0xC0);
|
||||||
|
float Suspension_anti_dive_multiplier = patch::Get<float>(phandling + 0xC4);
|
||||||
|
float fCollisionDamageMultiplier = patch::Get<float>(phandling + 0xC8) * 0.338;
|
||||||
|
int nMonetaryValue = patch::Get<int>(phandling + 0xD8);
|
||||||
|
|
||||||
|
int MaxVelocity = patch::Get<float>(phandling + 0x84);
|
||||||
|
MaxVelocity = MaxVelocity * 206 + (MaxVelocity - 0.918668) * 1501;
|
||||||
|
|
||||||
|
int modelFlags = patch::Get<int>(phandling + 0xCC);
|
||||||
|
int handlingFlags = patch::Get<int>(phandling + 0xD0);
|
||||||
|
|
||||||
|
int front_lights = patch::Get<BYTE>(phandling + 0xDC);
|
||||||
|
int rear_lights = patch::Get<BYTE>(phandling + 0xDD);
|
||||||
|
int vehicle_anim_group = patch::Get<BYTE>(phandling + 0xDE);
|
||||||
|
int nNumberOfGears = patch::Get<BYTE>(phandling + 0x76);
|
||||||
|
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",
|
||||||
|
handlingId.c_str(), fMass, fTurnMass, fDragMult, CentreOfMassX, CentreOfMassY, CentreOfMassZ, nPercentSubmerged,
|
||||||
|
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);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void Vehicle::ParseCarcolsDAT()
|
void Vehicle::ParseCarcolsDAT()
|
||||||
{
|
{
|
||||||
std::string m_FilePath = std::string(paths::GetGameDirPathA()) + "/data/carcols.dat";
|
std::string m_FilePath = GAME_PATH((char*)"/data/carcols.dat");
|
||||||
|
|
||||||
if (fs::exists(m_FilePath))
|
if (fs::exists(m_FilePath))
|
||||||
{
|
{
|
||||||
@ -431,9 +483,12 @@ void Vehicle::ParseCarcolsDAT()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Vehicle::SpawnVehicle(std::string& smodel)
|
|
||||||
{
|
|
||||||
#ifdef GTASA
|
#ifdef GTASA
|
||||||
|
void Vehicle::SpawnVehicle(std::string& smodel)
|
||||||
|
#elif GTAVC
|
||||||
|
void Vehicle::SpawnVehicle(std::string& rootkey, std::string& vehName, std::string& smodel)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
CPlayerPed* player = FindPlayerPed();
|
CPlayerPed* player = FindPlayerPed();
|
||||||
int hplayer = CPools::GetPedRef(player);
|
int hplayer = CPools::GetPedRef(player);
|
||||||
|
|
||||||
@ -458,6 +513,7 @@ void Vehicle::SpawnVehicle(std::string& smodel)
|
|||||||
|
|
||||||
Command<Commands::WARP_CHAR_FROM_CAR_TO_COORD>(hplayer, pos.x, pos.y, pos.z);
|
Command<Commands::WARP_CHAR_FROM_CAR_TO_COORD>(hplayer, pos.x, pos.y, pos.z);
|
||||||
|
|
||||||
|
#ifdef GTASA
|
||||||
if (pveh->m_nVehicleClass == VEHICLE_TRAIN)
|
if (pveh->m_nVehicleClass == VEHICLE_TRAIN)
|
||||||
{
|
{
|
||||||
Command<Commands::DELETE_MISSION_TRAIN>(hveh);
|
Command<Commands::DELETE_MISSION_TRAIN>(hveh);
|
||||||
@ -466,6 +522,9 @@ void Vehicle::SpawnVehicle(std::string& smodel)
|
|||||||
{
|
{
|
||||||
Command<Commands::DELETE_CAR>(hveh);
|
Command<Commands::DELETE_CAR>(hveh);
|
||||||
}
|
}
|
||||||
|
#elif GTAVC
|
||||||
|
Command<Commands::DELETE_CAR>(hveh);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (interior == 0)
|
if (interior == 0)
|
||||||
@ -480,6 +539,7 @@ void Vehicle::SpawnVehicle(std::string& smodel)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef GTASA
|
||||||
if (CModelInfo::IsTrainModel(imodel))
|
if (CModelInfo::IsTrainModel(imodel))
|
||||||
{
|
{
|
||||||
int train_id = GetRandomTrainIdForModel(imodel);
|
int train_id = GetRandomTrainIdForModel(imodel);
|
||||||
@ -527,38 +587,58 @@ void Vehicle::SpawnVehicle(std::string& smodel)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
#endif
|
||||||
CStreaming::RequestModel(imodel, PRIORITY_REQUEST);
|
CStreaming::RequestModel(imodel, PRIORITY_REQUEST);
|
||||||
CStreaming::LoadAllRequestedModels(false);
|
CStreaming::LoadAllRequestedModels(false);
|
||||||
|
#ifdef GTASA
|
||||||
if (m_Spawner::m_nLicenseText[0] != '\0')
|
if (m_Spawner::m_nLicenseText[0] != '\0')
|
||||||
{
|
{
|
||||||
Command<Commands::CUSTOM_PLATE_FOR_NEXT_CAR>(imodel, m_Spawner::m_nLicenseText);
|
Command<Commands::CUSTOM_PLATE_FOR_NEXT_CAR>(imodel, m_Spawner::m_nLicenseText);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
int hveh = 0;
|
int hveh = 0;
|
||||||
if (m_Spawner::m_bSpawnInside)
|
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);
|
||||||
|
#ifdef GTASA
|
||||||
veh->SetHeading(player->GetHeading());
|
veh->SetHeading(player->GetHeading());
|
||||||
|
#elif GTAVC
|
||||||
|
float x,y,z;
|
||||||
|
player->m_placement.GetOrientation(x, y, z);
|
||||||
|
veh->m_placement.SetOrientation(x, y, z);
|
||||||
|
#endif
|
||||||
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);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
#ifdef GTASA
|
||||||
player->TransformFromObjectSpace(pos, CVector(0, 10, 0));
|
player->TransformFromObjectSpace(pos, CVector(0, 10, 0));
|
||||||
|
#elif GTAVC
|
||||||
|
player->TransformFromObjectSpace(pos);
|
||||||
|
#endif
|
||||||
Command<Commands::CREATE_CAR>(imodel, pos.x, pos.y, pos.z + 3.0f, &hveh);
|
Command<Commands::CREATE_CAR>(imodel, pos.x, pos.y, pos.z + 3.0f, &hveh);
|
||||||
veh = CPools::GetVehicle(hveh);
|
veh = CPools::GetVehicle(hveh);
|
||||||
|
#ifdef GTASA
|
||||||
veh->SetHeading(player->GetHeading() + 55.0f);
|
veh->SetHeading(player->GetHeading() + 55.0f);
|
||||||
|
#elif GTAVC
|
||||||
|
float x,y,z;
|
||||||
|
player->m_placement.GetOrientation(x, y, z);
|
||||||
|
veh->m_placement.SetOrientation(x, y, z);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
BY_GAME(veh->m_nDoorLock, veh->m_nLockStatus) = CARLOCK_UNLOCKED;
|
BY_GAME(veh->m_nDoorLock, veh->m_nLockStatus) = CARLOCK_UNLOCKED;
|
||||||
BY_GAME(veh->m_nAreaCode, veh->m_nInterior) = interior;
|
BY_GAME(veh->m_nAreaCode, veh->m_nInterior) = interior;
|
||||||
Command<Commands::MARK_CAR_AS_NO_LONGER_NEEDED>(CPools::GetVehicleRef(veh));
|
Command<Commands::MARK_CAR_AS_NO_LONGER_NEEDED>(CPools::GetVehicleRef(veh));
|
||||||
CStreaming::SetModelIsDeletable(imodel);
|
CStreaming::SetModelIsDeletable(imodel);
|
||||||
|
#ifdef GTASA
|
||||||
}
|
}
|
||||||
veh->m_nVehicleFlags.bHasBeenOwnedByPlayer = true;
|
veh->m_nVehicleFlags.bHasBeenOwnedByPlayer = true;
|
||||||
}
|
#elif GTAVC
|
||||||
|
Command<Commands::RESTORE_CAMERA_JUMPCUT>();
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Vehicle::GetNameFromModel(int model)
|
std::string Vehicle::GetNameFromModel(int model)
|
||||||
@ -583,67 +663,6 @@ int Vehicle::GetModelFromName(const char* name)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Vehicle::GenerateHandlingDataFile(int phandling)
|
|
||||||
{
|
|
||||||
FILE* fp = fopen("handling.txt", "w");
|
|
||||||
|
|
||||||
std::string handlingId = m_VehicleIDE[FindPlayerPed()->m_pVehicle->m_nModelIndex];
|
|
||||||
float fMass = patch::Get<float>(phandling + 0x4);
|
|
||||||
float fTurnMass = patch::Get<float>(phandling + 0xC);
|
|
||||||
float fDragMult = patch::Get<float>(phandling + 0x10);
|
|
||||||
float CentreOfMassX = patch::Get<float>(phandling + 0x14);
|
|
||||||
float CentreOfMassY = patch::Get<float>(phandling + 0x18);
|
|
||||||
float CentreOfMassZ = patch::Get<float>(phandling + 0x1C);
|
|
||||||
int nPercentSubmerged = patch::Get<int>(phandling + 0x20);
|
|
||||||
float fTractionMultiplier = patch::Get<float>(phandling + 0x28);
|
|
||||||
float fTractionLoss = patch::Get<float>(phandling + 0xA4);
|
|
||||||
float TractionBias = patch::Get<float>(phandling + 0xA8);
|
|
||||||
float fEngineAcceleration = patch::Get<float>(phandling + 0x7C) * 12500;
|
|
||||||
float fEngineInertia = patch::Get<float>(phandling + 0x80);
|
|
||||||
int nDriveType = patch::Get<BYTE>(phandling + 0x74);
|
|
||||||
int nEngineType = patch::Get<BYTE>(phandling + 0x75);
|
|
||||||
float BrakeDeceleration = patch::Get<float>(phandling + 0x94) * 2500;
|
|
||||||
float BrakeBias = patch::Get<float>(phandling + 0x98);
|
|
||||||
int ABS = patch::Get<BYTE>(phandling + 0x9C);
|
|
||||||
float SteeringLock = patch::Get<float>(phandling + 0xA0);
|
|
||||||
float SuspensionForceLevel = patch::Get<float>(phandling + 0xAC);
|
|
||||||
float SuspensionDampingLevel = patch::Get<float>(phandling + 0xB0);
|
|
||||||
float SuspensionHighSpdComDamp = patch::Get<float>(phandling + 0xB4);
|
|
||||||
float Suspension_upper_limit = patch::Get<float>(phandling + 0xB8);
|
|
||||||
float Suspension_lower_limit = patch::Get<float>(phandling + 0xBC);
|
|
||||||
float Suspension_bias = patch::Get<float>(phandling + 0xC0);
|
|
||||||
float Suspension_anti_dive_multiplier = patch::Get<float>(phandling + 0xC4);
|
|
||||||
float fCollisionDamageMultiplier = patch::Get<float>(phandling + 0xC8) * 0.338;
|
|
||||||
int nMonetaryValue = patch::Get<int>(phandling + 0xD8);
|
|
||||||
|
|
||||||
int MaxVelocity = patch::Get<float>(phandling + 0x84);
|
|
||||||
MaxVelocity = MaxVelocity * 206 + (MaxVelocity - 0.918668) * 1501;
|
|
||||||
|
|
||||||
int modelFlags = patch::Get<int>(phandling + 0xCC);
|
|
||||||
int handlingFlags = patch::Get<int>(phandling + 0xD0);
|
|
||||||
|
|
||||||
int front_lights = patch::Get<BYTE>(phandling + 0xDC);
|
|
||||||
int rear_lights = patch::Get<BYTE>(phandling + 0xDD);
|
|
||||||
int vehicle_anim_group = patch::Get<BYTE>(phandling + 0xDE);
|
|
||||||
int nNumberOfGears = patch::Get<BYTE>(phandling + 0x76);
|
|
||||||
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",
|
|
||||||
handlingId.c_str(), fMass, fTurnMass, fDragMult, CentreOfMassX, CentreOfMassY, CentreOfMassZ, nPercentSubmerged,
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Vehicle::Draw()
|
void Vehicle::Draw()
|
||||||
{
|
{
|
||||||
ImGui::Spacing();
|
ImGui::Spacing();
|
||||||
@ -653,14 +672,10 @@ void Vehicle::Draw()
|
|||||||
|
|
||||||
if (ImGui::Button("Blow up cars", ImVec2(Ui::GetSize(BY_GAME(3,2)))))
|
if (ImGui::Button("Blow up cars", ImVec2(Ui::GetSize(BY_GAME(3,2)))))
|
||||||
{
|
{
|
||||||
#ifdef GTASA
|
|
||||||
Call<0x439D80>();
|
|
||||||
#elif GTAVC
|
|
||||||
for (CVehicle *pVeh : CPools::ms_pVehiclePool)
|
for (CVehicle *pVeh : CPools::ms_pVehiclePool)
|
||||||
{
|
{
|
||||||
pVeh->BlowUpCar(pPlayer);
|
BY_GAME(pVeh->BlowUpCar(pPlayer, false), pVeh->BlowUpCar(pPlayer));
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
@ -705,15 +720,17 @@ void Vehicle::Draw()
|
|||||||
ImGui::Spacing();
|
ImGui::Spacing();
|
||||||
ImGui::BeginChild("CheckboxesChild");
|
ImGui::BeginChild("CheckboxesChild");
|
||||||
ImGui::Columns(2, 0, false);
|
ImGui::Columns(2, 0, false);
|
||||||
|
#ifdef GTASA
|
||||||
Ui::CheckboxAddress("Aggressive drivers", 0x96914F);
|
Ui::CheckboxAddress("Aggressive drivers", 0x96914F);
|
||||||
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);
|
#endif
|
||||||
|
Ui::CheckboxAddress("All taxis have nitro", BY_GAME(0x96918B,0xA10B3A));
|
||||||
Ui::CheckboxWithHint("Bikes fly", &m_bBikeFly);
|
Ui::CheckboxWithHint("Bikes fly", &m_bBikeFly);
|
||||||
Ui::CheckboxAddress("Boats fly", 0x969153);
|
Ui::CheckboxAddress("Boats fly", BY_GAME(0x969153,0xA10B11));
|
||||||
Ui::CheckboxAddress("Cars fly", 0x969160);
|
Ui::CheckboxAddress("Cars fly", BY_GAME(0x969160,0xA10B28));
|
||||||
Ui::CheckboxWithHint("Cars heavy", &m_bVehHeavy);
|
Ui::CheckboxWithHint("Cars heavy", &m_bVehHeavy);
|
||||||
|
|
||||||
if (Ui::CheckboxWithHint("Damage proof", &m_bNoDamage,
|
if (Ui::CheckboxWithHint("Damage proof", &m_bNoDamage,
|
||||||
"Every vehicle entered will be damage proof\nBullet, Collision, Explosion, Fire, Meele etc"))
|
"Every vehicle entered will be damage proof\nBullet, Collision, Explosion, Fire, Meele etc"))
|
||||||
{
|
{
|
||||||
@ -735,21 +752,28 @@ void Vehicle::Draw()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef GTASA
|
||||||
Ui::CheckboxAddress("Decreased traffic", 0x96917A);
|
Ui::CheckboxAddress("Decreased traffic", 0x96917A);
|
||||||
|
#endif
|
||||||
ImGui::NextColumn();
|
ImGui::NextColumn();
|
||||||
|
#ifdef GTASA
|
||||||
Ui::CheckboxWithHint("Don't fall off bike", &m_bDontFallBike);
|
Ui::CheckboxWithHint("Don't fall off bike", &m_bDontFallBike);
|
||||||
Ui::CheckboxAddress("Drive on water", 0x969152);
|
#endif
|
||||||
|
Ui::CheckboxAddress("Drive on water", BY_GAME(0x969152,0xA10B81));
|
||||||
|
#ifdef GTASA
|
||||||
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);
|
#endif
|
||||||
|
Ui::CheckboxAddress("Green traffic lights", BY_GAME(0x96914E,0xA10ADC));
|
||||||
|
#ifdef GTASA
|
||||||
Ui::CheckboxAddress("Perfect handling", 0x96914C);
|
Ui::CheckboxAddress("Perfect handling", 0x96914C);
|
||||||
Ui::CheckboxAddress("Tank mode", 0x969164);
|
Ui::CheckboxAddress("Tank mode", 0x969164);
|
||||||
|
|
||||||
Ui::CheckboxWithHint("Unlimited nitro", &m_UnlimitedNitro::m_bEnabled, "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");
|
||||||
|
#endif
|
||||||
Ui::CheckboxWithHint("Watertight car", &m_bVehWatertight);
|
Ui::CheckboxWithHint("Watertight car", &m_bVehWatertight);
|
||||||
Ui::CheckboxAddress("Wheels only", 0x96914B);
|
Ui::CheckboxAddress("Wheels only", BY_GAME(0x96914B,0xA10B70));
|
||||||
ImGui::Columns(1);
|
ImGui::Columns(1);
|
||||||
|
|
||||||
if (is_driver)
|
if (is_driver)
|
||||||
@ -947,6 +971,7 @@ void Vehicle::Draw()
|
|||||||
ImGui::Spacing();
|
ImGui::Spacing();
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
}
|
}
|
||||||
|
#ifdef GTASA
|
||||||
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} };
|
||||||
@ -960,14 +985,14 @@ void Vehicle::Draw()
|
|||||||
ImGui::Spacing();
|
ImGui::Spacing();
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (pPlayer && pPlayer->m_pVehicle)
|
if (pPlayer && pPlayer->m_pVehicle)
|
||||||
{
|
{
|
||||||
CVehicle* pVeh = pPlayer->m_pVehicle;
|
CVehicle* pVeh = pPlayer->m_pVehicle;
|
||||||
int hVeh = CPools::GetVehicleRef(pVeh);
|
int hVeh = CPools::GetVehicleRef(pVeh);
|
||||||
|
|
||||||
Ui::EditFloat("Dirt level", (int)pVeh + 0x4B0, 0, 7.5, 15);
|
|
||||||
#ifdef GTASA
|
#ifdef GTASA
|
||||||
|
Ui::EditFloat("Dirt level", (int)pVeh + 0x4B0, 0, 7.5, 15);
|
||||||
if (pVeh->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);
|
||||||
@ -1077,6 +1102,7 @@ void Vehicle::Draw()
|
|||||||
|
|
||||||
|
|
||||||
ImGui::Spacing();
|
ImGui::Spacing();
|
||||||
|
#ifdef GTASA
|
||||||
ImGui::SetNextItemWidth(ImGui::GetWindowContentRegionWidth() - 2.5);
|
ImGui::SetNextItemWidth(ImGui::GetWindowContentRegionWidth() - 2.5);
|
||||||
ImGui::InputTextWithHint("##LicenseText", "License plate text", m_Spawner::m_nLicenseText, 9);
|
ImGui::InputTextWithHint("##LicenseText", "License plate text", m_Spawner::m_nLicenseText, 9);
|
||||||
|
|
||||||
@ -1086,16 +1112,19 @@ void Vehicle::Draw()
|
|||||||
{
|
{
|
||||||
return GetNameFromModel(std::stoi(str));
|
return GetNameFromModel(std::stoi(str));
|
||||||
});
|
});
|
||||||
|
#elif GTAVC
|
||||||
|
Ui::DrawJSON(m_Spawner::m_VehData, SpawnVehicle, nullptr);
|
||||||
|
#endif
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
#ifdef GTASA
|
|
||||||
if (pPlayer->m_pVehicle && pPlayer->m_nPedFlags.bInVehicle)
|
if (pPlayer->m_pVehicle && Command<Commands::IS_CHAR_IN_ANY_CAR>(hplayer))
|
||||||
{
|
{
|
||||||
CVehicle* veh = FindPlayerPed()->m_pVehicle;
|
CVehicle* veh = FindPlayerPed()->m_pVehicle;
|
||||||
int hveh = CPools::GetVehicleRef(veh);
|
int hveh = CPools::GetVehicleRef(veh);
|
||||||
if (ImGui::BeginTabItem("Color"))
|
if (ImGui::BeginTabItem("Color"))
|
||||||
{
|
{
|
||||||
|
#ifdef GTASA
|
||||||
Paint::UpdateNodeListRecursive(veh);
|
Paint::UpdateNodeListRecursive(veh);
|
||||||
|
|
||||||
ImGui::Spacing();
|
ImGui::Spacing();
|
||||||
@ -1115,7 +1144,7 @@ void Vehicle::Draw()
|
|||||||
uchar b = m_Color::m_fColorPicker[2] * 255;
|
uchar b = m_Color::m_fColorPicker[2] * 255;
|
||||||
Paint::SetNodeColor(veh, Paint::veh_nodes::selected, { r, g, b, 255 }, m_Color::m_bMatFilter);
|
Paint::SetNodeColor(veh, Paint::veh_nodes::selected, { r, g, b, 255 }, m_Color::m_bMatFilter);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
ImGui::Spacing();
|
ImGui::Spacing();
|
||||||
ImGui::Columns(2, NULL, false);
|
ImGui::Columns(2, NULL, false);
|
||||||
ImGui::Checkbox("Material filter", &m_Color::m_bMatFilter);
|
ImGui::Checkbox("Material filter", &m_Color::m_bMatFilter);
|
||||||
@ -1140,14 +1169,20 @@ void Vehicle::Draw()
|
|||||||
ImGui::BeginChild("Colorss");
|
ImGui::BeginChild("Colorss");
|
||||||
|
|
||||||
if (m_Color::bShowAll)
|
if (m_Color::bShowAll)
|
||||||
|
{
|
||||||
for (int colorId = 0; colorId < count; ++colorId)
|
for (int colorId = 0; colorId < count; ++colorId)
|
||||||
{
|
{
|
||||||
if (Ui::ColorButton(colorId, m_CarcolsColorData[colorId], ImVec2(btnSize, btnSize)))
|
if (Ui::ColorButton(colorId, m_CarcolsColorData[colorId], ImVec2(btnSize, btnSize)))
|
||||||
|
{
|
||||||
*(uint8_replacement*)(int(veh) + 0x433 + m_Color::m_nRadioButton) = colorId;
|
*(uint8_replacement*)(int(veh) + 0x433 + m_Color::m_nRadioButton) = colorId;
|
||||||
|
}
|
||||||
|
|
||||||
if ((colorId + 1) % btnsInRow != 0)
|
if ((colorId + 1) % btnsInRow != 0)
|
||||||
|
{
|
||||||
ImGui::SameLine(0.0, 4.0);
|
ImGui::SameLine(0.0, 4.0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::string vehName = GetNameFromModel(pPlayer->m_pVehicle->m_nModelIndex);
|
std::string vehName = GetNameFromModel(pPlayer->m_pVehicle->m_nModelIndex);
|
||||||
@ -1160,10 +1195,14 @@ void Vehicle::Draw()
|
|||||||
{
|
{
|
||||||
if (Ui::ColorButton(colorId, m_CarcolsColorData[colorId],
|
if (Ui::ColorButton(colorId, m_CarcolsColorData[colorId],
|
||||||
ImVec2(btnSize, btnSize)))
|
ImVec2(btnSize, btnSize)))
|
||||||
|
{
|
||||||
*(uint8_replacement*)(int(veh) + 0x433 + m_Color::m_nRadioButton) = colorId;
|
*(uint8_replacement*)(int(veh) + 0x433 + m_Color::m_nRadioButton) = colorId;
|
||||||
|
}
|
||||||
|
|
||||||
if (count % btnsInRow != 0)
|
if (count % btnsInRow != 0)
|
||||||
|
{
|
||||||
ImGui::SameLine(0.0, 4.0);
|
ImGui::SameLine(0.0, 4.0);
|
||||||
|
}
|
||||||
++count;
|
++count;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1175,6 +1214,7 @@ void Vehicle::Draw()
|
|||||||
ImGui::EndChild();
|
ImGui::EndChild();
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
|
#ifdef GTASA
|
||||||
if (Globals::renderer != Render_DirectX11)
|
if (Globals::renderer != Render_DirectX11)
|
||||||
{
|
{
|
||||||
if (ImGui::BeginTabItem("Neons"))
|
if (ImGui::BeginTabItem("Neons"))
|
||||||
@ -1395,8 +1435,8 @@ void Vehicle::Draw()
|
|||||||
|
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
ImGui::EndTabBar();
|
ImGui::EndTabBar();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include "pch.h"
|
||||||
#ifdef GTASA
|
#ifdef GTASA
|
||||||
#include "Neon.h"
|
#include "Neon.h"
|
||||||
#include "Paint.h"
|
#include "Paint.h"
|
||||||
@ -20,7 +21,6 @@ private:
|
|||||||
inline static int m_nVehRemoveRadius;
|
inline static int m_nVehRemoveRadius;
|
||||||
inline static bool m_bLockSpeed;
|
inline static bool m_bLockSpeed;
|
||||||
inline static float m_fLockSpeed;
|
inline static float m_fLockSpeed;
|
||||||
inline static std::map<int, std::string> m_VehicleIDE;
|
|
||||||
inline static std::vector<std::vector<float>> m_CarcolsColorData;
|
inline static std::vector<std::vector<float>> m_CarcolsColorData;
|
||||||
inline static std::map<std::string, std::vector<int>> m_CarcolsCarData;
|
inline static std::map<std::string, std::vector<int>> m_CarcolsCarData;
|
||||||
struct m_Color
|
struct m_Color
|
||||||
@ -30,6 +30,9 @@ private:
|
|||||||
inline static bool bShowAll;
|
inline static bool bShowAll;
|
||||||
inline static float m_fColorPicker[3]{ 0, 0, 0 };
|
inline static float m_fColorPicker[3]{ 0, 0, 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef GTASA
|
||||||
|
inline static std::map<int, std::string> m_VehicleIDE;
|
||||||
struct m_Neon
|
struct m_Neon
|
||||||
{
|
{
|
||||||
inline static float m_fColorPicker[3]{ 0, 0, 0 };
|
inline static float m_fColorPicker[3]{ 0, 0, 0 };
|
||||||
@ -38,21 +41,27 @@ private:
|
|||||||
inline static bool m_bApplyOnTraffic;
|
inline static bool m_bApplyOnTraffic;
|
||||||
inline static uint m_bTrafficTimer;
|
inline static uint m_bTrafficTimer;
|
||||||
};
|
};
|
||||||
|
inline static ResourceStore m_TuneData { "components" };
|
||||||
|
#endif
|
||||||
|
|
||||||
struct m_Spawner
|
struct m_Spawner
|
||||||
{
|
{
|
||||||
inline static SSearchData m_VehData;
|
#ifdef GTASA
|
||||||
|
inline static ResourceStore m_VehData { "vehicles" };
|
||||||
|
#elif GTAVC
|
||||||
|
inline static ResourceStore m_VehData{"vehicle", eResourceType::TYPE_TEXT};
|
||||||
|
#endif
|
||||||
inline static bool m_bSpawnInside = true;
|
inline static bool m_bSpawnInside = true;
|
||||||
inline static bool m_bSpawnInAir = true;
|
inline static bool m_bSpawnInAir = true;
|
||||||
inline static char m_nLicenseText[9];
|
inline static char m_nLicenseText[9];
|
||||||
};
|
};
|
||||||
inline static SSearchData m_TuneData;
|
|
||||||
inline static bool m_bImagesLoaded;
|
|
||||||
struct m_UnlimitedNitro
|
struct m_UnlimitedNitro
|
||||||
{
|
{
|
||||||
inline static bool m_bEnabled;
|
inline static bool m_bEnabled;
|
||||||
inline static bool m_bCompAdded;
|
inline static bool m_bCompAdded;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef GTASA
|
||||||
inline static std::vector<std::string>(m_HandlingFlagNames) = // 32 flags
|
inline static std::vector<std::string>(m_HandlingFlagNames) = // 32 flags
|
||||||
{
|
{
|
||||||
"1G_BOOST", "2G_BOOST", "NPC_ANTI_ROLL", "NPC_NEUTRAL_HANDL", "NO_HANDBRAKE", "STEER_REARWHEELS",
|
"1G_BOOST", "2G_BOOST", "NPC_ANTI_ROLL", "NPC_NEUTRAL_HANDL", "NO_HANDBRAKE", "STEER_REARWHEELS",
|
||||||
@ -75,20 +84,28 @@ private:
|
|||||||
"IS_PLANE", "IS_BOAT", "BOUNCE_PANELS",
|
"IS_PLANE", "IS_BOAT", "BOUNCE_PANELS",
|
||||||
"DOUBLE_RWHEELS", "FORCE_GROUND_CLEARANCE", "IS_HATCHBAC1K"
|
"DOUBLE_RWHEELS", "FORCE_GROUND_CLEARANCE", "IS_HATCHBAC1K"
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void FixVehicle(CVehicle *pVeh);
|
static void FixVehicle(CVehicle *pVeh);
|
||||||
|
#ifdef GTASA
|
||||||
public:
|
|
||||||
static void AddComponent(const std::string& component, bool display_message = true);
|
static void AddComponent(const std::string& component, bool display_message = true);
|
||||||
static void RemoveComponent(const std::string& component, bool display_message = true);
|
static void RemoveComponent(const std::string& component, bool display_message = true);
|
||||||
static std::string GetNameFromModel(int model);
|
|
||||||
static int GetModelFromName(const char* name);
|
|
||||||
static void SpawnVehicle(std::string& name);
|
|
||||||
static int GetRandomTrainIdForModel(int model);
|
static int GetRandomTrainIdForModel(int model);
|
||||||
static void ParseVehiclesIDE();
|
static void ParseVehiclesIDE();
|
||||||
static void ParseCarcolsDAT();
|
|
||||||
static void GenerateHandlingDataFile(int phandling);
|
static void GenerateHandlingDataFile(int phandling);
|
||||||
|
#endif
|
||||||
|
static void ParseCarcolsDAT();
|
||||||
|
|
||||||
|
public:
|
||||||
|
#ifdef GTASA
|
||||||
|
static void SpawnVehicle(std::string& name);
|
||||||
|
#elif GTAVC
|
||||||
|
static void SpawnVehicle(std::string& rootkey, std::string& vehName, std::string& model);
|
||||||
|
#endif
|
||||||
|
static std::string GetNameFromModel(int model);
|
||||||
|
static int GetModelFromName(const char* name);
|
||||||
|
static void Draw();
|
||||||
Vehicle();
|
Vehicle();
|
||||||
~Vehicle();
|
~Vehicle();
|
||||||
static void Draw();
|
|
||||||
};
|
};
|
||||||
|
@ -8,12 +8,6 @@ Weapon::Weapon()
|
|||||||
{
|
{
|
||||||
Events::processScriptsEvent += []
|
Events::processScriptsEvent += []
|
||||||
{
|
{
|
||||||
if (!m_bImagesLoaded)
|
|
||||||
{
|
|
||||||
Util::LoadTextureDirectory(m_WeaponData, PLUGIN_PATH((char*)"CheatMenu\\weapons.txd"));
|
|
||||||
m_bImagesLoaded = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
CPlayerPed* player = FindPlayerPed();
|
CPlayerPed* player = FindPlayerPed();
|
||||||
if (m_bAutoAim)
|
if (m_bAutoAim)
|
||||||
{
|
{
|
||||||
@ -233,12 +227,12 @@ void Weapon::Draw()
|
|||||||
|
|
||||||
ImGui::Spacing();
|
ImGui::Spacing();
|
||||||
ImGui::Text("Current weapon: %s",
|
ImGui::Text("Current weapon: %s",
|
||||||
m_WeaponData.m_Json.m_Data[std::to_string(m_nGangWeaponList[m_nSelectedGang][m_nSelectedWeapon])].get<
|
m_WeaponData.m_pJson->m_Data[std::to_string(m_nGangWeaponList[m_nSelectedGang][m_nSelectedWeapon])].get<
|
||||||
std::string>().c_str());
|
std::string>().c_str());
|
||||||
ImGui::Spacing();
|
ImGui::Spacing();
|
||||||
Ui::DrawImages(m_WeaponData.m_ImagesList, ImVec2(65, 65), m_WeaponData.m_Categories, m_WeaponData.m_Selected,
|
Ui::DrawImages(m_WeaponData.m_ImagesList, ImVec2(65, 65), m_WeaponData.m_Categories, m_WeaponData.m_Selected,
|
||||||
m_WeaponData.m_Filter, SetGangWeapon, nullptr,
|
m_WeaponData.m_Filter, SetGangWeapon, nullptr,
|
||||||
[](std::string str) { return m_WeaponData.m_Json.m_Data[str].get<std::string>(); },
|
[](std::string str) { return m_WeaponData.m_pJson->m_Data[str].get<std::string>(); },
|
||||||
[](std::string str) { return str != "-1"; /*Jetpack*/ }
|
[](std::string str) { return str != "-1"; /*Jetpack*/ }
|
||||||
);
|
);
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
@ -253,7 +247,7 @@ void Weapon::Draw()
|
|||||||
}
|
}
|
||||||
Ui::DrawImages(m_WeaponData.m_ImagesList, ImVec2(65, 65), m_WeaponData.m_Categories, m_WeaponData.m_Selected,
|
Ui::DrawImages(m_WeaponData.m_ImagesList, ImVec2(65, 65), m_WeaponData.m_Categories, m_WeaponData.m_Selected,
|
||||||
m_WeaponData.m_Filter, GiveWeaponToPlayer, nullptr,
|
m_WeaponData.m_Filter, GiveWeaponToPlayer, nullptr,
|
||||||
[](std::string str) { return m_WeaponData.m_Json.m_Data[str].get<std::string>(); },
|
[](std::string str) { return m_WeaponData.m_pJson->m_Data[str].get<std::string>(); },
|
||||||
[](std::string str) { return str != "0"; /*Unarmed*/ }
|
[](std::string str) { return str != "0"; /*Unarmed*/ }
|
||||||
);
|
);
|
||||||
ImGui::EndTabItem();
|
ImGui::EndTabItem();
|
||||||
|
@ -3,8 +3,7 @@
|
|||||||
class Weapon
|
class Weapon
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
inline static SSearchData m_WeaponData{ "weapon" };
|
inline static ResourceStore m_WeaponData{ "weapon", eResourceType::TYPE_TEXT };
|
||||||
inline static bool m_bImagesLoaded;
|
|
||||||
inline static bool m_bAutoAim;
|
inline static bool m_bAutoAim;
|
||||||
inline static bool m_bFastReload;
|
inline static bool m_bFastReload;
|
||||||
inline static bool m_bHugeDamage;
|
inline static bool m_bHugeDamage;
|
||||||
|
57
src/header_includes.h
Normal file
57
src/header_includes.h
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
#include <d3d9.h>
|
||||||
|
#include <d3d11.h>
|
||||||
|
#include <d3d11Shader.h>
|
||||||
|
#include <filesystem>
|
||||||
|
#include <fstream>
|
||||||
|
#include <functional>
|
||||||
|
#include <memory>
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <vector>
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#include "plugin.h"
|
||||||
|
#include "CBike.h"
|
||||||
|
#include "CCamera.h"
|
||||||
|
#include "CClock.h"
|
||||||
|
#include "CCivilianPed.h"
|
||||||
|
#include "CGangs.h"
|
||||||
|
#include "cHandlingDataMgr.h"
|
||||||
|
#include "CHud.h"
|
||||||
|
#include "CMenuManager.h"
|
||||||
|
#include "CModelInfo.h"
|
||||||
|
#include "RenderWare.h"
|
||||||
|
#include "CStats.h"
|
||||||
|
#include "CStreaming.h"
|
||||||
|
#include "CTheScripts.h"
|
||||||
|
#include "CTheZones.h"
|
||||||
|
#include "CTimer.h"
|
||||||
|
#include "CTimeCycle.h"
|
||||||
|
#include "CTrain.h"
|
||||||
|
#include "CWeather.h"
|
||||||
|
#include "CWorld.h"
|
||||||
|
#include "extensions/ScriptCommands.h"
|
||||||
|
#include "extensions/Screen.h"
|
||||||
|
#include "extensions/Paths.h"
|
||||||
|
|
||||||
|
#ifdef GTASA
|
||||||
|
#include "CCheat.h"
|
||||||
|
#include "CClothes.h"
|
||||||
|
#include "CCutsceneMgr.h"
|
||||||
|
#include "CRadar.h"
|
||||||
|
#include "CShadows.h"
|
||||||
|
#include "eVehicleClass.h"
|
||||||
|
#include "CGangWars.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../Depend/fla/IDaccess.h"
|
||||||
|
#include "../Depend/imgui/imgui.h"
|
||||||
|
#include "../Depend/imgui/imgui_internal.h"
|
||||||
|
#include "../Depend/imgui/imgui_impl_dx9.h"
|
||||||
|
#include "../Depend/imgui/imgui_impl_dx11.h"
|
||||||
|
#include "../Depend/imgui/imgui_impl_win32.h"
|
||||||
|
|
||||||
|
#include "MoreEvents.h"
|
||||||
|
#include "Json.h"
|
||||||
|
#include "VKeys.h"
|
||||||
|
#include "ResourceStore.h"
|
100
src/pch.h
100
src/pch.h
@ -12,62 +12,7 @@
|
|||||||
#define BY_GAME(sa, vc) vc
|
#define BY_GAME(sa, vc) vc
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <d3d9.h>
|
#include "header_includes.h"
|
||||||
#include <d3d11.h>
|
|
||||||
#include <d3d11Shader.h>
|
|
||||||
#include <filesystem>
|
|
||||||
#include <fstream>
|
|
||||||
#include <functional>
|
|
||||||
#include <memory>
|
|
||||||
#include <iostream>
|
|
||||||
#include <sstream>
|
|
||||||
#include <vector>
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
#include "plugin.h"
|
|
||||||
#include "CBike.h"
|
|
||||||
#include "CCamera.h"
|
|
||||||
#include "CClock.h"
|
|
||||||
#include "CCivilianPed.h"
|
|
||||||
#include "CGangs.h"
|
|
||||||
#include "cHandlingDataMgr.h"
|
|
||||||
#include "CHud.h"
|
|
||||||
#include "CMenuManager.h"
|
|
||||||
#include "CModelInfo.h"
|
|
||||||
#include "RenderWare.h"
|
|
||||||
#include "CStats.h"
|
|
||||||
#include "CStreaming.h"
|
|
||||||
#include "CTheScripts.h"
|
|
||||||
#include "CTheZones.h"
|
|
||||||
#include "CTimer.h"
|
|
||||||
#include "CTimeCycle.h"
|
|
||||||
#include "CTrain.h"
|
|
||||||
#include "CWeather.h"
|
|
||||||
#include "CWorld.h"
|
|
||||||
#include "extensions/ScriptCommands.h"
|
|
||||||
#include "extensions/Screen.h"
|
|
||||||
#include "extensions/Paths.h"
|
|
||||||
|
|
||||||
#ifdef GTASA
|
|
||||||
#include "CCheat.h"
|
|
||||||
#include "CClothes.h"
|
|
||||||
#include "CCutsceneMgr.h"
|
|
||||||
#include "CRadar.h"
|
|
||||||
#include "CShadows.h"
|
|
||||||
#include "eVehicleClass.h"
|
|
||||||
#include "CGangWars.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "../Depend/fla/IDaccess.h"
|
|
||||||
#include "../Depend/imgui/imgui.h"
|
|
||||||
#include "../Depend/imgui/imgui_internal.h"
|
|
||||||
#include "../Depend/imgui/imgui_impl_dx9.h"
|
|
||||||
#include "../Depend/imgui/imgui_impl_dx11.h"
|
|
||||||
#include "../Depend/imgui/imgui_impl_win32.h"
|
|
||||||
|
|
||||||
#include "MoreEvents.h"
|
|
||||||
#include "Json.h"
|
|
||||||
#include "VKeys.h"
|
|
||||||
|
|
||||||
// Globals
|
// Globals
|
||||||
using CallbackTable = std::vector<std::pair<std::string, void(*)()>>;
|
using CallbackTable = std::vector<std::pair<std::string, void(*)()>>;
|
||||||
@ -102,49 +47,6 @@ struct HotKeyData
|
|||||||
bool m_bPressed;
|
bool m_bPressed;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RwD3D9Raster
|
|
||||||
{
|
|
||||||
union
|
|
||||||
{
|
|
||||||
IDirect3DTexture9* texture;
|
|
||||||
IDirect3DSurface9* surface;
|
|
||||||
};
|
|
||||||
unsigned char* palette;
|
|
||||||
unsigned char alpha;
|
|
||||||
unsigned char cubeTextureFlags; /* 0x01 IS_CUBEMAP_TEX */
|
|
||||||
unsigned char textureFlags; /* 0x10 IS_COMPRESSED */
|
|
||||||
unsigned char lockedLevel;
|
|
||||||
IDirect3DSurface9* lockedSurface;
|
|
||||||
D3DLOCKED_RECT lockedRect;
|
|
||||||
D3DFORMAT format;
|
|
||||||
IDirect3DSwapChain9* swapChain;
|
|
||||||
HWND* hwnd;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct RwRasterEx : public RwRaster
|
|
||||||
{
|
|
||||||
RwD3D9Raster *renderResource;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct STextureStructure
|
|
||||||
{
|
|
||||||
std::string m_FileName;
|
|
||||||
std::string m_CategoryName;
|
|
||||||
RwTexture *m_pRwTexture = nullptr;
|
|
||||||
void *m_pTexture = nullptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SSearchData
|
|
||||||
{
|
|
||||||
CJson m_Json;
|
|
||||||
RwTexDictionary txd;
|
|
||||||
ImGuiTextFilter m_Filter = "";
|
|
||||||
std::vector<std::string> m_Categories = {"All"};
|
|
||||||
std::string m_Selected = "All";
|
|
||||||
std::vector<std::unique_ptr<STextureStructure>> m_ImagesList;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// Common defines
|
// Common defines
|
||||||
static void SetHelpMessage(const char *message, bool b1, bool b2, bool b3)
|
static void SetHelpMessage(const char *message, bool b1, bool b2, bool b3)
|
||||||
{
|
{
|
||||||
|
@ -78,7 +78,9 @@ project "CheatMenuVC"
|
|||||||
"../src/Util.h",
|
"../src/Util.h",
|
||||||
"../src/Util.cpp",
|
"../src/Util.cpp",
|
||||||
"../src/Menu.h",
|
"../src/Menu.h",
|
||||||
"../src/Menu.cpp"
|
"../src/Menu.cpp",
|
||||||
|
"../src/ResourceStore.h",
|
||||||
|
"../src/ResourceStore.cpp"
|
||||||
}
|
}
|
||||||
includedirs {
|
includedirs {
|
||||||
PSDK_DIR .. "/plugin_vc/",
|
PSDK_DIR .. "/plugin_vc/",
|
||||||
|
Loading…
Reference in New Issue
Block a user