Added ped model preview. (#375)
This commit is contained in:
parent
136efc3af8
commit
9d48b02d63
@ -140,7 +140,7 @@ namespace big
|
||||
bool off_radar = false;
|
||||
bool super_run = false;
|
||||
int wanted_level = 0;
|
||||
|
||||
bool preview_ped = false;
|
||||
bool god_mode = false;
|
||||
bool proof_bullet = false;
|
||||
bool proof_fire = false;
|
||||
@ -520,6 +520,7 @@ namespace big
|
||||
this->self.no_ragdoll = j["self"]["no_ragdoll"];
|
||||
this->self.off_radar = j["self"]["off_radar"];
|
||||
this->self.super_run = j["self"]["super_run"];
|
||||
this->self.preview_ped = j["self"]["preview_ped"];
|
||||
|
||||
this->settings.hotkeys.menu_toggle = j["settings"]["hotkeys"]["menu_toggle"];
|
||||
|
||||
@ -772,6 +773,7 @@ namespace big
|
||||
{ "no_ragdoll", this->self.no_ragdoll },
|
||||
{ "off_radar", this->self.off_radar },
|
||||
{ "super_run", this->self.super_run },
|
||||
{ "preview_ped", this->self.preview_ped }
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -20,7 +20,7 @@
|
||||
#include "services/pickups/pickup_service.hpp"
|
||||
#include "services/players/player_service.hpp"
|
||||
#include "services/notifications/notification_service.hpp"
|
||||
#include "services/vehicle_preview/vehicle_preview_service.hpp"
|
||||
#include "services/model_preview/model_preview_service.hpp"
|
||||
#include "services/vehicle/vehicle_service.hpp"
|
||||
|
||||
BOOL APIENTRY DllMain(HMODULE hmod, DWORD reason, PVOID)
|
||||
@ -80,7 +80,7 @@ BOOL APIENTRY DllMain(HMODULE hmod, DWORD reason, PVOID)
|
||||
auto pickup_service_instance = std::make_unique<pickup_service>();
|
||||
auto player_service_instance = std::make_unique<player_service>();
|
||||
auto gta_data_service_instance = std::make_unique<gta_data_service>();
|
||||
auto vehicle_preview_service_instance = std::make_unique<vehicle_preview_service>();
|
||||
auto model_preview_service_instance = std::make_unique<model_preview_service>();
|
||||
auto vehicle_service_instance = std::make_unique<vehicle_service>();
|
||||
auto gui_service_instance = std::make_unique<gui_service>();
|
||||
LOG(INFO) << "Registered service instances...";
|
||||
@ -128,8 +128,8 @@ BOOL APIENTRY DllMain(HMODULE hmod, DWORD reason, PVOID)
|
||||
LOG(INFO) << "GTA Data Service reset.";
|
||||
vehicle_service_instance.reset();
|
||||
LOG(INFO) << "Vehicle Service reset.";
|
||||
vehicle_preview_service_instance.reset();
|
||||
LOG(INFO) << "Vehicle Preview Service reset.";
|
||||
model_preview_service_instance.reset();
|
||||
LOG(INFO) << "Model Preview Service reset.";
|
||||
mobile_service_instance.reset();
|
||||
LOG(INFO) << "Mobile Service reset.";
|
||||
player_service_instance.reset();
|
||||
|
190
BigBaseV2/src/services/model_preview/model_preview_service.cpp
Normal file
190
BigBaseV2/src/services/model_preview/model_preview_service.cpp
Normal file
@ -0,0 +1,190 @@
|
||||
#include "fiber_pool.hpp"
|
||||
#include "gui.hpp"
|
||||
#include "thread_pool.hpp"
|
||||
#include "util/ped.hpp"
|
||||
#include "util/vehicle.hpp"
|
||||
#include "model_preview_service.hpp"
|
||||
|
||||
namespace big
|
||||
{
|
||||
model_preview_service::model_preview_service()
|
||||
{
|
||||
g_model_preview_service = this;
|
||||
}
|
||||
|
||||
model_preview_service::~model_preview_service()
|
||||
{
|
||||
g_model_preview_service = nullptr;
|
||||
}
|
||||
|
||||
void model_preview_service::show_ped(Hash hash)
|
||||
{
|
||||
m_veh_model_hash = 0;
|
||||
m_veh_owned_mods.clear();
|
||||
|
||||
if (m_ped_model_hash != hash)
|
||||
{
|
||||
m_ped_model_hash = hash;
|
||||
|
||||
if (m_ped_model_hash != 0)
|
||||
{
|
||||
m_new_model = true;
|
||||
|
||||
preview_loop();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void model_preview_service::show_vehicle(Hash hash, bool spawn_max)
|
||||
{
|
||||
m_ped_model_hash = 0;
|
||||
m_veh_owned_mods.clear();
|
||||
|
||||
if (m_veh_model_hash != hash || m_veh_spawn_max != spawn_max)
|
||||
{
|
||||
m_veh_model_hash = hash;
|
||||
|
||||
if (m_veh_model_hash != 0)
|
||||
{
|
||||
m_veh_spawn_max = spawn_max;
|
||||
m_new_model = true;
|
||||
|
||||
preview_loop();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void model_preview_service::show_vehicle(const std::map<int, int32_t>& owned_mods, bool spawn_max)
|
||||
{
|
||||
m_ped_model_hash = 0;
|
||||
|
||||
if (
|
||||
m_veh_spawn_max != spawn_max ||
|
||||
m_veh_owned_mods.size() != owned_mods.size() ||
|
||||
!std::equal(m_veh_owned_mods.begin(), m_veh_owned_mods.end(), owned_mods.begin())
|
||||
) {
|
||||
m_veh_owned_mods.clear();
|
||||
|
||||
auto hash_item = owned_mods.find(MOD_MODEL_HASH);
|
||||
|
||||
m_veh_model_hash = hash_item->second;
|
||||
|
||||
if (m_veh_model_hash != 0)
|
||||
{
|
||||
m_veh_owned_mods.insert(owned_mods.begin(), owned_mods.end());
|
||||
m_veh_spawn_max = spawn_max;
|
||||
m_new_model = true;
|
||||
|
||||
preview_loop();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void model_preview_service::preview_loop()
|
||||
{
|
||||
if (m_running || m_loop_running)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
m_running = true;
|
||||
|
||||
g_fiber_pool->queue_job([this] {
|
||||
m_loop_running = true;
|
||||
|
||||
while (
|
||||
g_running && m_running && g_gui.m_opened &&
|
||||
(m_ped_model_hash|| m_veh_model_hash)
|
||||
) {
|
||||
Vector3 location;
|
||||
|
||||
if (m_ped_model_hash)
|
||||
{
|
||||
location = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(self::ped, 0.f, 5.f, -.5f);
|
||||
}
|
||||
else if (m_veh_model_hash)
|
||||
{
|
||||
location = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(self::ped, 0.f, 10.f, .5f);
|
||||
}
|
||||
|
||||
if (m_current_ent == 0)
|
||||
{
|
||||
m_new_model = false;
|
||||
location.z = -10.f;
|
||||
|
||||
if (m_ped_model_hash)
|
||||
{
|
||||
m_current_ent = ped::spawn(ePedType::PED_TYPE_ARMY, m_ped_model_hash, location, 0.f, false);
|
||||
ENTITY::SET_ENTITY_HEALTH(m_current_ent, 0, 0);
|
||||
script::get_current()->yield(20ms);
|
||||
PED::RESURRECT_PED(m_current_ent);
|
||||
TASK::CLEAR_PED_TASKS(m_current_ent);
|
||||
}
|
||||
else if (m_veh_model_hash)
|
||||
{
|
||||
if (m_veh_owned_mods.empty())
|
||||
{
|
||||
m_current_ent = vehicle::spawn(m_veh_model_hash, location, 0.f, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_current_ent = vehicle::clone_from_owned_mods(m_veh_owned_mods, location, 0.f, false);
|
||||
}
|
||||
}
|
||||
|
||||
if (m_current_ent)
|
||||
{
|
||||
if (m_veh_model_hash && m_veh_spawn_max)
|
||||
{
|
||||
vehicle::max_vehicle(m_current_ent);
|
||||
}
|
||||
|
||||
ENTITY::FREEZE_ENTITY_POSITION(m_current_ent, true);
|
||||
ENTITY::SET_ENTITY_ALPHA(m_current_ent, 0, false);
|
||||
ENTITY::SET_ENTITY_COLLISION(m_current_ent, false, false);
|
||||
ENTITY::SET_CAN_CLIMB_ON_ENTITY(m_current_ent, false);
|
||||
OBJECT::SET_OBJECT_ALLOW_LOW_LOD_BUOYANCY(m_current_ent, false);
|
||||
}
|
||||
}
|
||||
else if (m_new_model)
|
||||
{
|
||||
ENTITY::DETACH_ENTITY(m_current_ent, 1, 1);
|
||||
ENTITY::DELETE_ENTITY(&m_current_ent);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (const int alpha = ENTITY::GET_ENTITY_ALPHA(m_current_ent); alpha < 255)
|
||||
{
|
||||
ENTITY::SET_ENTITY_ALPHA(m_current_ent, std::min<int>(255, alpha + 20), false);
|
||||
}
|
||||
|
||||
ENTITY::SET_ENTITY_HEADING(m_current_ent, m_heading);
|
||||
ENTITY::SET_ENTITY_COORDS(m_current_ent, location.x, location.y, location.z, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
if (m_heading += 0.5f; m_heading > 359)
|
||||
{
|
||||
m_heading = 0;
|
||||
}
|
||||
|
||||
script::get_current()->yield(15ms);
|
||||
}
|
||||
|
||||
ENTITY::DETACH_ENTITY(m_current_ent, 1, 1);
|
||||
ENTITY::DELETE_ENTITY(&m_current_ent);
|
||||
|
||||
m_current_ent = 0;
|
||||
m_ped_model_hash = 0;
|
||||
m_veh_model_hash = 0;
|
||||
m_veh_owned_mods.clear();
|
||||
m_running = false;
|
||||
m_loop_running = false;
|
||||
});
|
||||
}
|
||||
|
||||
void model_preview_service::stop_preview()
|
||||
{
|
||||
m_veh_owned_mods.clear();
|
||||
m_running = false;
|
||||
}
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
#pragma once
|
||||
#include "file_manager/file.hpp"
|
||||
|
||||
namespace big
|
||||
{
|
||||
class model_preview_service
|
||||
{
|
||||
std::condition_variable m_cond;
|
||||
std::mutex m_mutex;
|
||||
|
||||
Entity m_current_ent = 0;
|
||||
|
||||
Hash m_veh_model_hash = 0;
|
||||
std::map<int, int32_t> m_veh_owned_mods;
|
||||
bool m_veh_spawn_max = false;
|
||||
|
||||
Hash m_ped_model_hash = 0;
|
||||
|
||||
bool m_new_model = false;
|
||||
float m_heading = 0.f;
|
||||
bool m_loop_running = false;
|
||||
bool m_running = false;
|
||||
public:
|
||||
model_preview_service();
|
||||
~model_preview_service();
|
||||
|
||||
void show_ped(Hash hash);
|
||||
|
||||
void show_vehicle(Hash hash, bool spawn_max);
|
||||
void show_vehicle(const std::map<int, int32_t>& owned_mods, bool spawn_max);
|
||||
|
||||
void preview_loop();
|
||||
void stop_preview();
|
||||
};
|
||||
|
||||
inline model_preview_service* g_model_preview_service{};
|
||||
}
|
@ -1,142 +0,0 @@
|
||||
#include "fiber_pool.hpp"
|
||||
#include "gui.hpp"
|
||||
#include "thread_pool.hpp"
|
||||
#include "util/entity.hpp"
|
||||
#include "util/vehicle.hpp"
|
||||
#include "vehicle_preview_service.hpp"
|
||||
|
||||
namespace big
|
||||
{
|
||||
vehicle_preview_service::vehicle_preview_service()
|
||||
{
|
||||
g_vehicle_preview_service = this;
|
||||
}
|
||||
|
||||
vehicle_preview_service::~vehicle_preview_service()
|
||||
{
|
||||
g_vehicle_preview_service = nullptr;
|
||||
}
|
||||
|
||||
void vehicle_preview_service::set_preview_vehicle(const vehicle_item& item, bool spawn_max)
|
||||
{
|
||||
if (item.hash != 0)
|
||||
{
|
||||
m_owned_mods.clear();
|
||||
|
||||
if (m_model_hash != item.hash || m_spawn_max != spawn_max)
|
||||
{
|
||||
m_spawn_max = spawn_max;
|
||||
m_model_hash = item.hash;
|
||||
m_new_model = true;
|
||||
}
|
||||
|
||||
preview_loop();
|
||||
}
|
||||
}
|
||||
|
||||
void vehicle_preview_service::set_preview_vehicle(const std::map<int, int32_t>& owned_mods, bool spawn_max)
|
||||
{
|
||||
auto hash_item = owned_mods.find(MOD_MODEL_HASH);
|
||||
|
||||
if (
|
||||
m_spawn_max != spawn_max ||
|
||||
m_owned_mods.size() != owned_mods.size() ||
|
||||
!std::equal(m_owned_mods.begin(), m_owned_mods.end(), owned_mods.begin())
|
||||
) {
|
||||
m_owned_mods.clear();
|
||||
m_owned_mods.insert(owned_mods.begin(), owned_mods.end());
|
||||
|
||||
auto hash_item = owned_mods.find(MOD_MODEL_HASH);
|
||||
|
||||
m_spawn_max = spawn_max;
|
||||
m_model_hash = hash_item->second;
|
||||
m_new_model = true;
|
||||
|
||||
preview_loop();
|
||||
}
|
||||
}
|
||||
|
||||
void vehicle_preview_service::preview_loop()
|
||||
{
|
||||
if (m_running || m_loop_running)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
m_running = true;
|
||||
|
||||
g_fiber_pool->queue_job([this] {
|
||||
m_loop_running = true;
|
||||
|
||||
while (
|
||||
g_running && m_running && g_gui.m_opened &&
|
||||
(g->spawn.preview_vehicle || g->clone_pv.preview_vehicle)
|
||||
) {
|
||||
auto location = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(self::ped, 0.f, 10.f, .5f);
|
||||
if (m_current_veh == 0)
|
||||
{
|
||||
m_new_model = false;
|
||||
location.z = -10.f;
|
||||
|
||||
if (m_owned_mods.empty())
|
||||
{
|
||||
m_current_veh = vehicle::spawn(m_model_hash, location, 0.f, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_current_veh = vehicle::clone_from_owned_mods(m_owned_mods, location, 0.f, false);
|
||||
}
|
||||
|
||||
if (m_current_veh)
|
||||
{
|
||||
if (m_spawn_max)
|
||||
{
|
||||
vehicle::max_vehicle(m_current_veh);
|
||||
}
|
||||
|
||||
ENTITY::FREEZE_ENTITY_POSITION(m_current_veh, true);
|
||||
ENTITY::SET_ENTITY_ALPHA(m_current_veh, 0, 0);
|
||||
ENTITY::SET_ENTITY_COLLISION(m_current_veh, false, false);
|
||||
ENTITY::SET_CAN_CLIMB_ON_ENTITY(m_current_veh, false);
|
||||
OBJECT::SET_OBJECT_ALLOW_LOW_LOD_BUOYANCY(m_current_veh, false);
|
||||
}
|
||||
}
|
||||
else if (m_new_model)
|
||||
{
|
||||
ENTITY::DETACH_ENTITY(m_current_veh, 1, 1);
|
||||
ENTITY::DELETE_ENTITY(&m_current_veh);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (const int alpha = ENTITY::GET_ENTITY_ALPHA(m_current_veh); alpha < 250)
|
||||
{
|
||||
ENTITY::SET_ENTITY_ALPHA(m_current_veh, std::min<int>(255, alpha + 10), 0);
|
||||
}
|
||||
|
||||
ENTITY::SET_ENTITY_HEADING(m_current_veh, m_heading);
|
||||
ENTITY::SET_ENTITY_COORDS(m_current_veh, location.x, location.y, location.z, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
if (m_heading += 0.5f; m_heading > 359)
|
||||
{
|
||||
m_heading = 0;
|
||||
}
|
||||
|
||||
script::get_current()->yield(15ms);
|
||||
}
|
||||
|
||||
entity::delete_entity(m_current_veh);
|
||||
m_current_veh = 0;
|
||||
m_model_hash = 0;
|
||||
m_owned_mods.clear();
|
||||
m_running = false;
|
||||
m_loop_running = false;
|
||||
});
|
||||
}
|
||||
|
||||
void vehicle_preview_service::stop_preview()
|
||||
{
|
||||
m_owned_mods.clear();
|
||||
m_running = false;
|
||||
}
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
#pragma once
|
||||
#include "file_manager/file.hpp"
|
||||
#include "services/gta_data/gta_data_service.hpp"
|
||||
|
||||
namespace big
|
||||
{
|
||||
class vehicle_preview_service
|
||||
{
|
||||
std::condition_variable m_cond;
|
||||
std::mutex m_mutex;
|
||||
|
||||
Vehicle m_current_veh = 0;
|
||||
Hash m_model_hash;
|
||||
std::map<int, int32_t> m_owned_mods;
|
||||
|
||||
bool m_new_model = false;
|
||||
float m_heading = 0.f;
|
||||
bool m_spawn_max = false;
|
||||
bool m_loop_running = false;
|
||||
bool m_running = false;
|
||||
public:
|
||||
vehicle_preview_service();
|
||||
~vehicle_preview_service();
|
||||
|
||||
void set_preview_vehicle(const vehicle_item& item, bool spawn_max);
|
||||
void set_preview_vehicle(const std::map<int, int32_t>& owned_mods, bool spawn_max);
|
||||
|
||||
void preview_loop();
|
||||
void stop_preview();
|
||||
};
|
||||
|
||||
inline vehicle_preview_service* g_vehicle_preview_service{};
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
#include "natives.hpp"
|
||||
#include "script.hpp"
|
||||
#include "pointers.hpp"
|
||||
|
||||
namespace big::ped
|
||||
{
|
||||
@ -37,4 +38,28 @@ namespace big::ped
|
||||
ENTITY::SET_ENTITY_HEALTH(self::ped, current_health, 0);
|
||||
PED::SET_PED_ARMOUR(self::ped, current_armor);
|
||||
}
|
||||
|
||||
inline Ped spawn(ePedType pedType, Hash hash, Vector3 location, float heading, bool is_networked = true)
|
||||
{
|
||||
for (uint8_t i = 0; !STREAMING::HAS_MODEL_LOADED(hash) && i < 100; i++)
|
||||
{
|
||||
STREAMING::REQUEST_MODEL(hash);
|
||||
script::get_current()->yield();
|
||||
}
|
||||
|
||||
if (!STREAMING::HAS_MODEL_LOADED(hash))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
*(unsigned short*)g_pointers->m_model_spawn_bypass = 0x9090;
|
||||
auto ped = PED::CREATE_PED(pedType, hash, location.x, location.y, location.z, heading, is_networked, false);
|
||||
*(unsigned short*)g_pointers->m_model_spawn_bypass = 0x0574;
|
||||
|
||||
script::get_current()->yield();
|
||||
|
||||
STREAMING::SET_MODEL_AS_NO_LONGER_NEEDED(hash);
|
||||
|
||||
return ped;
|
||||
}
|
||||
}
|
@ -3,6 +3,7 @@
|
||||
#include "util/local_player.hpp"
|
||||
#include "views/view.hpp"
|
||||
#include "services/gta_data/gta_data_service.hpp"
|
||||
#include "services/model_preview/model_preview_service.hpp"
|
||||
#include <imgui_internal.h>
|
||||
|
||||
namespace big
|
||||
@ -44,30 +45,30 @@ namespace big
|
||||
|
||||
components::small_text("Player Model Changer");
|
||||
|
||||
static int selected_player_ped_type = -1;
|
||||
static bool player_model_open = false;
|
||||
static char player_model_name[64];
|
||||
static int selected_ped_type = -1;
|
||||
static bool ped_model_dropdown_open = false;
|
||||
static char ped_model_buf[64];
|
||||
|
||||
auto ped_type_arr = g_gta_data_service->get_ped_type_arr();
|
||||
auto ped_arr = g_gta_data_service->get_ped_arr();
|
||||
|
||||
ImGui::SetNextItemWidth(300.f);
|
||||
if (ImGui::BeginCombo("Ped Type", selected_player_ped_type == -1 ? "ALL" : ped_type_arr[selected_player_ped_type].c_str()))
|
||||
if (ImGui::BeginCombo("Ped Type", selected_ped_type == -1 ? "ALL" : ped_type_arr[selected_ped_type].c_str()))
|
||||
{
|
||||
if (ImGui::Selectable("ALL", selected_player_ped_type == -1))
|
||||
if (ImGui::Selectable("ALL", selected_ped_type == -1))
|
||||
{
|
||||
selected_player_ped_type = -1;
|
||||
selected_ped_type = -1;
|
||||
}
|
||||
|
||||
for (int i = 0; i < ped_type_arr.size(); i++)
|
||||
{
|
||||
if (ImGui::Selectable(ped_type_arr[i].c_str(), selected_player_ped_type == i))
|
||||
if (ImGui::Selectable(ped_type_arr[i].c_str(), selected_ped_type == i))
|
||||
{
|
||||
selected_player_ped_type = i;
|
||||
player_model_name[0] = 0;
|
||||
selected_ped_type = i;
|
||||
ped_model_buf[0] = 0;
|
||||
}
|
||||
|
||||
if (selected_player_ped_type == i)
|
||||
if (selected_ped_type == i)
|
||||
{
|
||||
ImGui::SetItemDefaultFocus();
|
||||
}
|
||||
@ -77,22 +78,24 @@ namespace big
|
||||
}
|
||||
|
||||
ImGui::SetNextItemWidth(300.f);
|
||||
components::input_text_with_hint("Model Name##player_model_name", "Model Name", player_model_name, sizeof(player_model_name), ImGuiInputTextFlags_EnterReturnsTrue, [] {
|
||||
player_model_open = false;
|
||||
|
||||
components::input_text_with_hint("Model Name##player_model_name", "Model Name", ped_model_buf, sizeof(ped_model_buf), ImGuiInputTextFlags_EnterReturnsTrue, [] {
|
||||
ped_model_dropdown_open = false;
|
||||
});
|
||||
|
||||
bool player_model_focused = ImGui::IsItemActive();
|
||||
bool ped_model_dropdown_focused = ImGui::IsItemActive();
|
||||
|
||||
if (ImGui::IsItemActivated())
|
||||
{
|
||||
player_model_open = true;
|
||||
ped_model_dropdown_open = true;
|
||||
}
|
||||
|
||||
if (player_model_open)
|
||||
if (ped_model_dropdown_open)
|
||||
{
|
||||
bool is_open = true;
|
||||
bool item_hovered = false;
|
||||
|
||||
std::string lower_search = player_model_name;
|
||||
std::string lower_search = ped_model_buf;
|
||||
std::transform(lower_search.begin(), lower_search.end(), lower_search.begin(), tolower);
|
||||
|
||||
ImGui::SetNextWindowPos({ ImGui::GetItemRectMin().x, ImGui::GetItemRectMax().y });
|
||||
@ -100,7 +103,7 @@ namespace big
|
||||
if (ImGui::Begin("##player_model_popup", &is_open, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_Tooltip))
|
||||
{
|
||||
ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow());
|
||||
player_model_focused |= ImGui::IsWindowFocused();
|
||||
ped_model_dropdown_focused |= ImGui::IsWindowFocused();
|
||||
|
||||
for (auto& item : ped_arr)
|
||||
{
|
||||
@ -110,36 +113,55 @@ namespace big
|
||||
std::transform(name.begin(), name.end(), name.begin(), tolower);
|
||||
|
||||
if ((
|
||||
selected_player_ped_type == -1 || ped_type_arr[selected_player_ped_type] == ped_type
|
||||
selected_ped_type == -1 || ped_type_arr[selected_ped_type] == ped_type
|
||||
) && (
|
||||
name.find(lower_search) != std::string::npos
|
||||
)) {
|
||||
|
||||
bool selectable_highlighted = lower_search == name;
|
||||
bool selectable_clicked = ImGui::Selectable(item.name.c_str(), selectable_highlighted);
|
||||
player_model_focused |= ImGui::IsItemFocused();
|
||||
ped_model_dropdown_focused |= ImGui::IsItemFocused();
|
||||
|
||||
if (selectable_clicked)
|
||||
{
|
||||
strncpy(player_model_name, item.name.c_str(), 64);
|
||||
player_model_open = false;
|
||||
player_model_focused = false;
|
||||
strncpy(ped_model_buf, item.name.c_str(), 64);
|
||||
ped_model_dropdown_open = false;
|
||||
ped_model_dropdown_focused = false;
|
||||
}
|
||||
|
||||
if (selectable_highlighted)
|
||||
{
|
||||
ImGui::SetItemDefaultFocus();
|
||||
}
|
||||
|
||||
if (ImGui::IsItemHovered())
|
||||
{
|
||||
item_hovered = true;
|
||||
g_model_preview_service->show_ped(item.hash);
|
||||
}
|
||||
}
|
||||
}
|
||||
ImGui::End();
|
||||
}
|
||||
|
||||
player_model_open = player_model_focused;
|
||||
ped_model_dropdown_open = ped_model_dropdown_focused;
|
||||
|
||||
if (!g->self.preview_ped || (g->self.preview_ped && (!item_hovered || !ped_model_dropdown_open)))
|
||||
{
|
||||
g_model_preview_service->stop_preview();
|
||||
}
|
||||
}
|
||||
|
||||
if (ImGui::Checkbox("Preview", &g->self.preview_ped))
|
||||
{
|
||||
if (!g->self.preview_ped)
|
||||
{
|
||||
g_model_preview_service->stop_preview();
|
||||
}
|
||||
}
|
||||
ImGui::SameLine();
|
||||
components::button("Change Player Model", [] {
|
||||
const Hash hash = rage::joaat(player_model_name);
|
||||
const Hash hash = rage::joaat(ped_model_buf);
|
||||
|
||||
for (uint8_t i = 0; !STREAMING::HAS_MODEL_LOADED(hash) && i < 100; i++)
|
||||
{
|
||||
|
@ -2,7 +2,8 @@
|
||||
#include "fiber_pool.hpp"
|
||||
#include "natives.hpp"
|
||||
#include "services/mobile/mobile_service.hpp"
|
||||
#include "services/vehicle_preview/vehicle_preview_service.hpp"
|
||||
#include "services/gta_data/gta_data_service.hpp"
|
||||
#include "services/model_preview/model_preview_service.hpp"
|
||||
#include "util/vehicle.hpp"
|
||||
|
||||
namespace big
|
||||
@ -10,12 +11,18 @@ namespace big
|
||||
void view::pv() {
|
||||
ImGui::SetWindowSize({ 0.f, (float)*g_pointers->m_resolution_y }, ImGuiCond_Always);
|
||||
|
||||
ImGui::Checkbox("Preview", &g->clone_pv.preview_vehicle);
|
||||
if (ImGui::Checkbox("Preview", &g->clone_pv.preview_vehicle))
|
||||
{
|
||||
if (!g->clone_pv.preview_vehicle)
|
||||
{
|
||||
g_model_preview_service->stop_preview();
|
||||
}
|
||||
}
|
||||
ImGui::SameLine();
|
||||
ImGui::Checkbox("Spawn In", &g->clone_pv.spawn_inside);
|
||||
ImGui::SameLine();
|
||||
|
||||
static char plate[9] = { 0 };
|
||||
static char plate_buf[9] = { 0 };
|
||||
int num_of_rows = 3;
|
||||
|
||||
ImGui::Checkbox("Spawn Clone", &g->clone_pv.spawn_clone);
|
||||
@ -26,7 +33,6 @@ namespace big
|
||||
ImGui::Checkbox("Spawn Maxed", &g->clone_pv.spawn_maxed);
|
||||
|
||||
ImGui::SameLine();
|
||||
strncpy(plate, g->clone_pv.plate.c_str(), 9);
|
||||
ImGui::Checkbox("Clone PV Plate", &g->clone_pv.clone_plate);
|
||||
if (g->clone_pv.clone_plate)
|
||||
{
|
||||
@ -36,8 +42,9 @@ namespace big
|
||||
{
|
||||
ImGui::SetNextItemWidth(300.f);
|
||||
|
||||
components::input_text_with_hint("Plate", "Plate Number", plate, sizeof(plate), ImGuiInputTextFlags_None, [] {
|
||||
g->clone_pv.plate = plate;
|
||||
strncpy(plate_buf, g->clone_pv.plate.c_str(), 9);
|
||||
components::input_text_with_hint("Plate", "Plate Number", plate_buf, sizeof(plate_buf), ImGuiInputTextFlags_None, [] {
|
||||
g->clone_pv.plate = plate_buf;
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -117,10 +124,10 @@ namespace big
|
||||
auto vehicle_idx = personal_veh->get_vehicle_idx();
|
||||
auto owned_mods = vehicle::get_owned_mods_from_vehicle_idx(vehicle_idx);
|
||||
|
||||
const char* spawn_plate = plate;
|
||||
const char* spawn_plate_buf = plate_buf;
|
||||
if (g->clone_pv.clone_plate)
|
||||
{
|
||||
spawn_plate = personal_veh->get_plate();
|
||||
spawn_plate_buf = personal_veh->get_plate();
|
||||
}
|
||||
|
||||
auto veh = vehicle::clone_from_owned_mods(owned_mods, spawn_location, spawn_heading);
|
||||
@ -136,7 +143,7 @@ namespace big
|
||||
vehicle::max_vehicle(veh);
|
||||
}
|
||||
|
||||
vehicle::set_plate(veh, plate);
|
||||
vehicle::set_plate(veh, spawn_plate_buf);
|
||||
|
||||
if (g->clone_pv.spawn_inside)
|
||||
{
|
||||
@ -150,23 +157,23 @@ namespace big
|
||||
personal_veh->summon();
|
||||
}
|
||||
|
||||
g_vehicle_preview_service->stop_preview();
|
||||
g_model_preview_service->stop_preview();
|
||||
});
|
||||
ImGui::PopID();
|
||||
|
||||
if (g->clone_pv.preview_vehicle && ImGui::IsItemHovered())
|
||||
if (!g->spawn.preview_vehicle || (g->spawn.preview_vehicle && !ImGui::IsAnyItemHovered()))
|
||||
{
|
||||
g_model_preview_service->stop_preview();
|
||||
}
|
||||
else if (ImGui::IsItemHovered())
|
||||
{
|
||||
g_fiber_pool->queue_job([&personal_veh] {
|
||||
g_vehicle_preview_service->set_preview_vehicle(
|
||||
g_model_preview_service->show_vehicle(
|
||||
vehicle::get_owned_mods_from_vehicle_idx(personal_veh->get_vehicle_idx()),
|
||||
g->clone_pv.spawn_maxed
|
||||
);
|
||||
});
|
||||
}
|
||||
else if (g->clone_pv.preview_vehicle && !ImGui::IsAnyItemHovered())
|
||||
{
|
||||
g_vehicle_preview_service->stop_preview();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,8 @@
|
||||
#include "views/view.hpp"
|
||||
#include "fiber_pool.hpp"
|
||||
#include "natives.hpp"
|
||||
#include "services/vehicle_preview/vehicle_preview_service.hpp"
|
||||
#include "services/gta_data/gta_data_service.hpp"
|
||||
#include "services/model_preview/model_preview_service.hpp"
|
||||
#include "util/vehicle.hpp"
|
||||
|
||||
namespace big
|
||||
@ -10,18 +11,24 @@ namespace big
|
||||
{
|
||||
ImGui::SetWindowSize({ 0.f, (float)*g_pointers->m_resolution_y }, ImGuiCond_Always);
|
||||
|
||||
ImGui::Checkbox("Preview", &g->spawn.preview_vehicle);
|
||||
if (ImGui::Checkbox("Preview", &g->spawn.preview_vehicle))
|
||||
{
|
||||
if (!g->spawn.preview_vehicle)
|
||||
{
|
||||
g_model_preview_service->stop_preview();
|
||||
}
|
||||
}
|
||||
ImGui::SameLine();
|
||||
ImGui::Checkbox("Spawn In", &g->spawn.spawn_inside);
|
||||
ImGui::SameLine();
|
||||
ImGui::Checkbox("Spawn Maxed", &g->spawn.spawn_maxed);
|
||||
|
||||
static char plate[9] = { 0 };
|
||||
strncpy(plate, g->spawn.plate.c_str(), 9);
|
||||
static char plate_buf[9] = { 0 };
|
||||
strncpy(plate_buf, g->spawn.plate.c_str(), 9);
|
||||
|
||||
ImGui::SetNextItemWidth(300.f);
|
||||
components::input_text_with_hint("Plate", "Plate Number", plate, sizeof(plate), ImGuiInputTextFlags_None, [] {
|
||||
g->spawn.plate = plate;
|
||||
components::input_text_with_hint("Plate", "Plate Number", plate_buf, sizeof(plate_buf), ImGuiInputTextFlags_None, [] {
|
||||
g->spawn.plate = plate_buf;
|
||||
});
|
||||
|
||||
|
||||
@ -94,7 +101,7 @@ namespace big
|
||||
vehicle::max_vehicle(veh);
|
||||
}
|
||||
|
||||
vehicle::set_plate(veh, plate);
|
||||
vehicle::set_plate(veh, plate_buf);
|
||||
|
||||
if (g->spawn.spawn_inside)
|
||||
{
|
||||
@ -103,22 +110,22 @@ namespace big
|
||||
}
|
||||
}
|
||||
|
||||
g_vehicle_preview_service->stop_preview();
|
||||
g_model_preview_service->stop_preview();
|
||||
});
|
||||
|
||||
if (g->spawn.preview_vehicle && ImGui::IsItemHovered())
|
||||
if (!g->spawn.preview_vehicle || (g->spawn.preview_vehicle && !ImGui::IsAnyItemHovered()))
|
||||
{
|
||||
g_model_preview_service->stop_preview();
|
||||
}
|
||||
else if (ImGui::IsItemHovered())
|
||||
{
|
||||
g_fiber_pool->queue_job([] {
|
||||
g_vehicle_preview_service->set_preview_vehicle(
|
||||
g_model_preview_service->show_vehicle(
|
||||
vehicle::get_owned_mods_from_vehicle(self::veh),
|
||||
g->spawn.spawn_maxed
|
||||
);
|
||||
});
|
||||
}
|
||||
else if (g->spawn.preview_vehicle && !ImGui::IsAnyItemHovered())
|
||||
{
|
||||
g_vehicle_preview_service->stop_preview();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -162,7 +169,7 @@ namespace big
|
||||
vehicle::max_vehicle(veh);
|
||||
}
|
||||
|
||||
vehicle::set_plate(veh, plate);
|
||||
vehicle::set_plate(veh, plate_buf);
|
||||
|
||||
if (g->spawn.spawn_inside)
|
||||
{
|
||||
@ -170,17 +177,17 @@ namespace big
|
||||
}
|
||||
}
|
||||
|
||||
g_vehicle_preview_service->stop_preview();
|
||||
g_model_preview_service->stop_preview();
|
||||
});
|
||||
ImGui::PopID();
|
||||
|
||||
if (g->spawn.preview_vehicle && ImGui::IsItemHovered())
|
||||
if (!g->spawn.preview_vehicle || (g->spawn.preview_vehicle && !ImGui::IsAnyItemHovered()))
|
||||
{
|
||||
g_vehicle_preview_service->set_preview_vehicle(item, g->spawn.spawn_maxed);
|
||||
g_model_preview_service->stop_preview();
|
||||
}
|
||||
else if (g->spawn.preview_vehicle && !ImGui::IsAnyItemHovered())
|
||||
else if (ImGui::IsItemHovered())
|
||||
{
|
||||
g_vehicle_preview_service->stop_preview();
|
||||
g_model_preview_service->show_vehicle(item.hash, g->spawn.spawn_maxed);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user