fix(GtaDataService): Rebuild Cache button not working (#3411)

Changes:
- Switch from pointer singleton to pre-instanced singleton
- Added default constructor to cache_file object
- Fixed an issue where maps and vectors would not be cleared before (re)generating a cache.
This commit is contained in:
Andreas Maerten 2024-07-23 20:15:19 +02:00 committed by GitHub
parent f23078c9ea
commit 40bf403500
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
25 changed files with 235 additions and 214 deletions

View File

@ -16,7 +16,7 @@ namespace big
virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr<command_context> ctx) override virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr<command_context> ctx) override
{ {
for (auto& weapon : g_gta_data_service->weapons()) for (auto& weapon : g_gta_data_service.weapons())
WEAPON::GIVE_WEAPON_TO_PED(PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()), weapon.second.m_hash, 9999, FALSE, FALSE); WEAPON::GIVE_WEAPON_TO_PED(PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()), weapon.second.m_hash, 9999, FALSE, FALSE);
} }
}; };
@ -33,7 +33,7 @@ namespace big
virtual void execute(const command_arguments& _args, const std::shared_ptr<command_context> ctx) override virtual void execute(const command_arguments& _args, const std::shared_ptr<command_context> ctx) override
{ {
g_player_service->iterate([](auto& plyr) { g_player_service->iterate([](auto& plyr) {
for (auto& weapon : g_gta_data_service->weapons()) for (auto& weapon : g_gta_data_service.weapons())
WEAPON::GIVE_WEAPON_TO_PED(PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(plyr.second->id()), weapon.second.m_hash, 9999, FALSE, FALSE); WEAPON::GIVE_WEAPON_TO_PED(PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(plyr.second->id()), weapon.second.m_hash, 9999, FALSE, FALSE);
script::get_current()->yield(500ms); script::get_current()->yield(500ms);
}); });

View File

@ -42,7 +42,7 @@ namespace big
} }
else if (arg == 3) else if (arg == 3)
{ {
for (auto& item : g_gta_data_service->vehicles()) for (auto& item : g_gta_data_service.vehicles())
{ {
suggestions.push_back(item.second.m_name); suggestions.push_back(item.second.m_name);
} }
@ -92,7 +92,7 @@ namespace big
std::string item_name_lower, args_lower; std::string item_name_lower, args_lower;
args_lower = args[2]; args_lower = args[2];
string::operations::to_lower(args_lower); string::operations::to_lower(args_lower);
for (auto& item : g_gta_data_service->vehicles()) for (auto& item : g_gta_data_service.vehicles())
{ {
item_name_lower = item.second.m_name; item_name_lower = item.second.m_name;
string::operations::to_lower(item_name_lower); string::operations::to_lower(item_name_lower);

View File

@ -15,7 +15,7 @@ namespace big
virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr<command_context> ctx) override virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr<command_context> ctx) override
{ {
for (auto& [_, weapon] : g_gta_data_service->weapons()) for (auto& [_, weapon] : g_gta_data_service.weapons())
WEAPON::REMOVE_WEAPON_FROM_PED(PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()), weapon.m_hash); WEAPON::REMOVE_WEAPON_FROM_PED(PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()), weapon.m_hash);
} }
}; };

View File

@ -10,7 +10,7 @@ namespace big
virtual void execute(const command_arguments&, const std::shared_ptr<command_context> ctx) override virtual void execute(const command_arguments&, const std::shared_ptr<command_context> ctx) override
{ {
for (const auto& [_, weapon] : g_gta_data_service->weapons()) for (const auto& [_, weapon] : g_gta_data_service.weapons())
{ {
int ammo_in; int ammo_in;
WEAPON::GET_MAX_AMMO(self::ped, weapon.m_hash, &ammo_in); WEAPON::GET_MAX_AMMO(self::ped, weapon.m_hash, &ammo_in);

View File

@ -17,7 +17,7 @@ namespace big
if (arg == 1) if (arg == 1)
{ {
std::vector<std::string> suggestions; std::vector<std::string> suggestions;
for (auto& item : g_gta_data_service->vehicles()) for (auto& item : g_gta_data_service.vehicles())
{ {
suggestions.push_back(item.second.m_name); suggestions.push_back(item.second.m_name);
} }
@ -31,13 +31,13 @@ namespace big
{ {
command_arguments result(1); command_arguments result(1);
if (g_gta_data_service->vehicle_by_hash(rage::joaat(args[0])).m_hash != 0) if (g_gta_data_service.vehicle_by_hash(rage::joaat(args[0])).m_hash != 0)
{ {
result.push(rage::joaat(args[0])); result.push(rage::joaat(args[0]));
return result; return result;
} }
for (auto& item : g_gta_data_service->vehicles()) for (auto& item : g_gta_data_service.vehicles())
{ {
std::string item_name_lower, args_lower; std::string item_name_lower, args_lower;
item_name_lower = item.second.m_name; item_name_lower = item.second.m_name;
@ -70,8 +70,7 @@ namespace big
auto id = ctx->get_sender()->id(); auto id = ctx->get_sender()->id();
const auto spawn_location = vehicle::get_spawn_location(id == self::id ? g.spawn_vehicle.spawn_inside : false, const auto spawn_location = vehicle::get_spawn_location(id == self::id ? g.spawn_vehicle.spawn_inside : false, hash, PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(id));
hash, PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(id));
const auto spawn_heading = ENTITY::GET_ENTITY_HEADING(PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(id)); const auto spawn_heading = ENTITY::GET_ENTITY_HEADING(PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(id));
auto veh = vehicle::spawn(hash, spawn_location, spawn_heading); auto veh = vehicle::spawn(hash, spawn_location, spawn_heading);

View File

@ -10,7 +10,7 @@ namespace big
static void resolve_weapon_hotkey(Hash weapon) static void resolve_weapon_hotkey(Hash weapon)
{ {
if (g_gta_data_service->weapon_by_hash(weapon).m_name.empty()) if (g_gta_data_service.weapon_by_hash(weapon).m_name.empty())
{ {
WEAPON::SET_CURRENT_PED_VEHICLE_WEAPON(self::ped, weapon); WEAPON::SET_CURRENT_PED_VEHICLE_WEAPON(self::ped, weapon);
} }

View File

@ -21,8 +21,8 @@
#include "netsync/nodes/ped/CPedCreationDataNode.hpp" #include "netsync/nodes/ped/CPedCreationDataNode.hpp"
#include "netsync/nodes/ped/CPedGameStateDataNode.hpp" #include "netsync/nodes/ped/CPedGameStateDataNode.hpp"
#include "netsync/nodes/ped/CPedHealthDataNode.hpp" #include "netsync/nodes/ped/CPedHealthDataNode.hpp"
#include "netsync/nodes/ped/CPedMovementGroupDataNode.hpp"
#include "netsync/nodes/ped/CPedMovementDataNode.hpp" #include "netsync/nodes/ped/CPedMovementDataNode.hpp"
#include "netsync/nodes/ped/CPedMovementGroupDataNode.hpp"
#include "netsync/nodes/ped/CPedOrientationDataNode.hpp" #include "netsync/nodes/ped/CPedOrientationDataNode.hpp"
#include "netsync/nodes/ped/CPedScriptCreationDataNode.hpp" #include "netsync/nodes/ped/CPedScriptCreationDataNode.hpp"
#include "netsync/nodes/ped/CPedTaskSequenceDataNode.hpp" #include "netsync/nodes/ped/CPedTaskSequenceDataNode.hpp"
@ -206,7 +206,7 @@ namespace big
if (info->m_model_type == eModelType::Vehicle) if (info->m_model_type == eModelType::Vehicle)
{ {
for (auto& [name, data] : g_gta_data_service->vehicles()) for (auto& [name, data] : g_gta_data_service.vehicles())
{ {
if (data.m_hash == model) if (data.m_hash == model)
{ {
@ -217,7 +217,7 @@ namespace big
} }
else if (info->m_model_type == eModelType::Ped || info->m_model_type == eModelType::OnlineOnlyPed) else if (info->m_model_type == eModelType::Ped || info->m_model_type == eModelType::OnlineOnlyPed)
{ {
for (auto& [name, data] : g_gta_data_service->peds()) for (auto& [name, data] : g_gta_data_service.peds())
{ {
if (data.m_hash == model) if (data.m_hash == model)
{ {
@ -1262,8 +1262,7 @@ namespace big
return true; return true;
} }
if (attach_node->m_attached if (attach_node->m_attached && object->m_object_type == (int16_t)eNetObjType::NET_OBJ_TYPE_TRAILER)
&& object->m_object_type == (int16_t)eNetObjType::NET_OBJ_TYPE_TRAILER)
{ {
if (auto net_obj = if (auto net_obj =
g_pointers->m_gta.m_get_net_object(*g_pointers->m_gta.m_network_object_mgr, attach_node->m_attached_to, false)) g_pointers->m_gta.m_get_net_object(*g_pointers->m_gta.m_network_object_mgr, attach_node->m_attached_to, false))

View File

@ -103,7 +103,11 @@ namespace big
if (!is_valid_weapon(weaponType)) if (!is_valid_weapon(weaponType))
{ {
notify::crash_blocked(player, "invalid weapon type"); notify::crash_blocked(player, "invalid weapon type");
LOGF(stream::net_events, WARNING, "Blocked WEAPON_DAMAGE_EVENT from {} with invalid weapon hash {:X}", player->get_name(), weaponType); LOGF(stream::net_events,
WARNING,
"Blocked WEAPON_DAMAGE_EVENT from {} with invalid weapon hash {:X}",
player->get_name(),
weaponType);
g_pointers->m_gta.m_send_event_ack(event_manager, player, target_player, event_index, event_handled_bitset); g_pointers->m_gta.m_send_event_ack(event_manager, player, target_player, event_index, event_handled_bitset);
return true; return true;
} }
@ -424,7 +428,8 @@ namespace big
static const std::unordered_set<uint32_t> blocked_script_hashes = {"main_persistent"_J, "shop_controller"_J}; static const std::unordered_set<uint32_t> blocked_script_hashes = {"main_persistent"_J, "shop_controller"_J};
bool should_block = [&] { bool should_block = [&] {
if (blocked_ref_hashes.contains(ref_hash) || blocked_sound_hashes.contains(sound_hash) || blocked_script_hashes.contains(script_hash)) if (blocked_ref_hashes.contains(ref_hash) || blocked_sound_hashes.contains(sound_hash)
|| blocked_script_hashes.contains(script_hash))
return true; return true;
switch (sound_hash) switch (sound_hash)
@ -769,7 +774,7 @@ namespace big
if (g_local_player && g_local_player->m_net_object && g_local_player->m_net_object->m_object_id == net_id) if (g_local_player && g_local_player->m_net_object && g_local_player->m_net_object->m_object_id == net_id)
{ {
weapon_item weapon = g_gta_data_service->weapon_by_hash(hash); weapon_item weapon = g_gta_data_service.weapon_by_hash(hash);
g_notification_service.push_warning("PROTECTIONS"_T.data(), g_notification_service.push_warning("PROTECTIONS"_T.data(),
std::format("{} {} {}.", source_player->get_name(), "REMOVE_WEAPON_ATTEMPT_MESSAGE"_T, weapon.m_display_name)); std::format("{} {} {}.", source_player->get_name(), "REMOVE_WEAPON_ATTEMPT_MESSAGE"_T, weapon.m_display_name));
g_pointers->m_gta.m_send_event_ack(event_manager, source_player, target_player, event_index, event_handled_bitset); g_pointers->m_gta.m_send_event_ack(event_manager, source_player, target_player, event_index, event_handled_bitset);
@ -786,7 +791,7 @@ namespace big
if (g_local_player && g_local_player->m_net_object && g_local_player->m_net_object->m_object_id == net_id) if (g_local_player && g_local_player->m_net_object && g_local_player->m_net_object->m_object_id == net_id)
{ {
weapon_item weapon = g_gta_data_service->weapon_by_hash(hash); weapon_item weapon = g_gta_data_service.weapon_by_hash(hash);
g_notification_service.push_warning("PROTECTIONS"_T.data(), g_notification_service.push_warning("PROTECTIONS"_T.data(),
std::format("{} {} {}.", source_player->get_name(), "GIVE_WEAPON_ATTEMPT_MESSAGE"_T, weapon.m_display_name)); std::format("{} {} {}.", source_player->get_name(), "GIVE_WEAPON_ATTEMPT_MESSAGE"_T, weapon.m_display_name));
g_pointers->m_gta.m_send_event_ack(event_manager, source_player, target_player, event_index, event_handled_bitset); g_pointers->m_gta.m_send_event_ack(event_manager, source_player, target_player, event_index, event_handled_bitset);

View File

@ -18,7 +18,7 @@ namespace lua::vehicles
//``` //```
static std::string get_vehicle_display_name(Hash vehicle_hash) static std::string get_vehicle_display_name(Hash vehicle_hash)
{ {
return big::g_gta_data_service->vehicle_by_hash(vehicle_hash).m_display_name; return big::g_gta_data_service.vehicle_by_hash(vehicle_hash).m_display_name;
} }
// Lua API: Function // Lua API: Function
@ -32,7 +32,7 @@ namespace lua::vehicles
//``` //```
static std::string get_vehicle_display_name_string(std::string vehicle_name) static std::string get_vehicle_display_name_string(std::string vehicle_name)
{ {
return big::g_gta_data_service->vehicle_by_hash(rage::joaat(vehicle_name)).m_display_name; return big::g_gta_data_service.vehicle_by_hash(rage::joaat(vehicle_name)).m_display_name;
} }
// Lua API: Function // Lua API: Function
@ -50,7 +50,7 @@ namespace lua::vehicles
static std::vector<std::string> get_all_vehicles_by_class(std::string vehicle_class) static std::vector<std::string> get_all_vehicles_by_class(std::string vehicle_class)
{ {
std::vector<std::string> return_value; std::vector<std::string> return_value;
for (auto& [name, vehicle] : big::g_gta_data_service->vehicles()) for (auto& [name, vehicle] : big::g_gta_data_service.vehicles())
{ {
if (vehicle.m_vehicle_class == vehicle_class) if (vehicle.m_vehicle_class == vehicle_class)
{ {
@ -76,7 +76,7 @@ namespace lua::vehicles
static std::vector<std::string> get_all_vehicles_by_mfr(std::string manufacturer) static std::vector<std::string> get_all_vehicles_by_mfr(std::string manufacturer)
{ {
std::vector<std::string> return_value; std::vector<std::string> return_value;
for (auto& [name, vehicle] : big::g_gta_data_service->vehicles()) for (auto& [name, vehicle] : big::g_gta_data_service.vehicles())
{ {
if (vehicle.m_display_manufacturer == manufacturer) if (vehicle.m_display_manufacturer == manufacturer)
{ {

View File

@ -18,7 +18,7 @@ namespace lua::weapons
//``` //```
static std::string get_weapon_display_name(Hash weapon_hash) static std::string get_weapon_display_name(Hash weapon_hash)
{ {
return big::g_gta_data_service->weapon_by_hash(weapon_hash).m_display_name; return big::g_gta_data_service.weapon_by_hash(weapon_hash).m_display_name;
} }
// Lua API: Function // Lua API: Function
@ -32,7 +32,7 @@ namespace lua::weapons
//``` //```
static std::string get_weapon_display_name_string(std::string weapon_name) static std::string get_weapon_display_name_string(std::string weapon_name)
{ {
return big::g_gta_data_service->weapon_by_hash(rage::joaat(weapon_name)).m_display_name; return big::g_gta_data_service.weapon_by_hash(rage::joaat(weapon_name)).m_display_name;
} }
// Lua API: Function // Lua API: Function
@ -50,7 +50,7 @@ namespace lua::weapons
static std::vector<std::string> get_all_weapons_of_group_type(Hash group_hash) static std::vector<std::string> get_all_weapons_of_group_type(Hash group_hash)
{ {
std::vector<std::string> return_value; std::vector<std::string> return_value;
for (auto& [name, weapon] : big::g_gta_data_service->weapons()) for (auto& [name, weapon] : big::g_gta_data_service.weapons())
{ {
if (rage::joaat("GROUP_" + weapon.m_weapon_type) == group_hash) if (rage::joaat("GROUP_" + weapon.m_weapon_type) == group_hash)
{ {
@ -85,7 +85,7 @@ namespace lua::weapons
group_name.erase(0, 6); group_name.erase(0, 6);
} }
std::vector<std::string> return_value; std::vector<std::string> return_value;
for (auto& [name, weapon] : big::g_gta_data_service->weapons()) for (auto& [name, weapon] : big::g_gta_data_service.weapons())
{ {
if (weapon.m_weapon_type == group_name) if (weapon.m_weapon_type == group_name)
{ {
@ -109,7 +109,7 @@ namespace lua::weapons
//``` //```
static std::vector<std::string> get_all_weapon_components(Hash weapon_hash) static std::vector<std::string> get_all_weapon_components(Hash weapon_hash)
{ {
return big::g_gta_data_service->weapon_by_hash(weapon_hash).m_attachments; return big::g_gta_data_service.weapon_by_hash(weapon_hash).m_attachments;
} }
// Lua API: Function // Lua API: Function
@ -126,7 +126,7 @@ namespace lua::weapons
//``` //```
static std::vector<std::string> get_all_weapon_components_string(std::string weapon_name) static std::vector<std::string> get_all_weapon_components_string(std::string weapon_name)
{ {
return big::g_gta_data_service->weapon_by_hash(rage::joaat(weapon_name)).m_attachments; return big::g_gta_data_service.weapon_by_hash(rage::joaat(weapon_name)).m_attachments;
} }
// Lua API: Function // Lua API: Function
@ -140,7 +140,7 @@ namespace lua::weapons
//``` //```
static std::string get_weapon_component_display_name(Hash weapon_component_hash) static std::string get_weapon_component_display_name(Hash weapon_component_hash)
{ {
return big::g_gta_data_service->weapon_component_by_hash(weapon_component_hash).m_display_name; return big::g_gta_data_service.weapon_component_by_hash(weapon_component_hash).m_display_name;
} }
// Lua API: Function // Lua API: Function
@ -154,7 +154,7 @@ namespace lua::weapons
//``` //```
static std::string get_weapon_component_display_name_string(std::string weapon_component) static std::string get_weapon_component_display_name_string(std::string weapon_component)
{ {
return big::g_gta_data_service->weapon_component_by_hash(rage::joaat(weapon_component)).m_display_name; return big::g_gta_data_service.weapon_component_by_hash(rage::joaat(weapon_component)).m_display_name;
} }
// Lua API: Function // Lua API: Function
@ -168,7 +168,7 @@ namespace lua::weapons
//``` //```
static std::string get_weapon_component_display_desc(Hash weapon_component_hash) static std::string get_weapon_component_display_desc(Hash weapon_component_hash)
{ {
return big::g_gta_data_service->weapon_component_by_hash(weapon_component_hash).m_display_desc; return big::g_gta_data_service.weapon_component_by_hash(weapon_component_hash).m_display_desc;
} }
// Lua API: Function // Lua API: Function
@ -182,7 +182,7 @@ namespace lua::weapons
//``` //```
static std::string get_weapon_component_display_desc_string(std::string weapon_component) static std::string get_weapon_component_display_desc_string(std::string weapon_component)
{ {
return big::g_gta_data_service->weapon_component_by_hash(rage::joaat(weapon_component)).m_display_desc; return big::g_gta_data_service.weapon_component_by_hash(rage::joaat(weapon_component)).m_display_desc;
} }
void bind(sol::state& state) void bind(sol::state& state)

View File

@ -204,12 +204,13 @@ BOOL APIENTRY DllMain(HMODULE hmod, DWORD reason, PVOID)
auto hooking_instance = std::make_unique<hooking>(); auto hooking_instance = std::make_unique<hooking>();
LOG(INFO) << "Hooking initialized."; LOG(INFO) << "Hooking initialized.";
g_gta_data_service.init();
auto context_menu_service_instance = std::make_unique<context_menu_service>(); auto context_menu_service_instance = std::make_unique<context_menu_service>();
auto custom_text_service_instance = std::make_unique<custom_text_service>(); auto custom_text_service_instance = std::make_unique<custom_text_service>();
auto mobile_service_instance = std::make_unique<mobile_service>(); auto mobile_service_instance = std::make_unique<mobile_service>();
auto pickup_service_instance = std::make_unique<pickup_service>(); auto pickup_service_instance = std::make_unique<pickup_service>();
auto player_service_instance = std::make_unique<player_service>(); auto player_service_instance = std::make_unique<player_service>();
auto gta_data_service_instance = std::make_unique<gta_data_service>();
auto model_preview_service_instance = std::make_unique<model_preview_service>(); auto model_preview_service_instance = std::make_unique<model_preview_service>();
auto handling_service_instance = std::make_unique<handling_service>(); auto handling_service_instance = std::make_unique<handling_service>();
auto gui_service_instance = std::make_unique<gui_service>(); auto gui_service_instance = std::make_unique<gui_service>();
@ -300,8 +301,6 @@ BOOL APIENTRY DllMain(HMODULE hmod, DWORD reason, PVOID)
LOG(INFO) << "Script Patcher Service reset."; LOG(INFO) << "Script Patcher Service reset.";
gui_service_instance.reset(); gui_service_instance.reset();
LOG(INFO) << "Gui Service reset."; LOG(INFO) << "Gui Service reset.";
gta_data_service_instance.reset();
LOG(INFO) << "GTA Data Service reset.";
handling_service_instance.reset(); handling_service_instance.reset();
LOG(INFO) << "Vehicle Service reset."; LOG(INFO) << "Vehicle Service reset.";
model_preview_service_instance.reset(); model_preview_service_instance.reset();

View File

@ -3,11 +3,11 @@
#include "backend/player_command.hpp" #include "backend/player_command.hpp"
#include "natives.hpp" #include "natives.hpp"
#include "services/gta_data/gta_data_service.hpp" #include "services/gta_data/gta_data_service.hpp"
#include "services/ped_animations/ped_animations_service.hpp"
#include "services/vehicle/persist_car_service.hpp" #include "services/vehicle/persist_car_service.hpp"
#include "util/entity.hpp" #include "util/entity.hpp"
#include "util/ped.hpp" #include "util/ped.hpp"
#include "util/teleport.hpp" #include "util/teleport.hpp"
#include "services/ped_animations/ped_animations_service.hpp"
namespace big namespace big
@ -62,8 +62,7 @@ namespace big
s_context_menu vehicle_menu{ContextEntityType::VEHICLE, s_context_menu vehicle_menu{ContextEntityType::VEHICLE,
0, 0,
{}, {},
{ {{"KILL ENGINE",
{"KILL ENGINE",
[this] { [this] {
if (entity::take_control_of(m_handle)) if (entity::take_control_of(m_handle))
{ {
@ -141,16 +140,14 @@ namespace big
}}, }},
{"TP INTO", [this] { {"TP INTO", [this] {
teleport::into_vehicle(m_handle); teleport::into_vehicle(m_handle);
}} }}}};
}};
s_context_menu ped_menu{ContextEntityType::PED, s_context_menu ped_menu{ContextEntityType::PED,
0, 0,
{}, {},
{ {{"DISARM",
{"DISARM",
[this] { [this] {
for (auto& [_, weapon] : g_gta_data_service->weapons()) for (auto& [_, weapon] : g_gta_data_service.weapons())
WEAPON::REMOVE_WEAPON_FROM_PED(m_handle, weapon.m_hash); WEAPON::REMOVE_WEAPON_FROM_PED(m_handle, weapon.m_hash);
}}, }},
{"KILL", {"KILL",
@ -186,16 +183,14 @@ namespace big
WEAPON::GIVE_WEAPON_TO_PED(m_handle, "weapon_microsmg"_J, 9999, false, false); WEAPON::GIVE_WEAPON_TO_PED(m_handle, "weapon_microsmg"_J, 9999, false, false);
WEAPON::GIVE_WEAPON_TO_PED(m_handle, "weapon_carbinerifle"_J, 9999, false, true); WEAPON::GIVE_WEAPON_TO_PED(m_handle, "weapon_carbinerifle"_J, 9999, false, true);
TASK::TASK_COMBAT_HATED_TARGETS_AROUND_PED(self::ped, 100, 67108864); TASK::TASK_COMBAT_HATED_TARGETS_AROUND_PED(self::ped, 100, 67108864);
}} }}}};
}};
s_context_menu object_menu{ContextEntityType::OBJECT, 0, {}, {}}; s_context_menu object_menu{ContextEntityType::OBJECT, 0, {}, {}};
s_context_menu player_menu{ContextEntityType::PLAYER, s_context_menu player_menu{ContextEntityType::PLAYER,
0, 0,
{}, {},
{ {{"SET SELECTED",
{"SET SELECTED",
[this] { [this] {
g_player_service->set_selected(ped::get_player_from_ped(m_handle)); g_player_service->set_selected(ped::get_player_from_ped(m_handle));
}}, }},
@ -217,14 +212,13 @@ namespace big
{"RAGDOLL", [this] { {"RAGDOLL", [this] {
static player_command* command = player_command::get("ragdoll"_J); static player_command* command = player_command::get("ragdoll"_J);
command->call(ped::get_player_from_ped(m_handle), {}); command->call(ped::get_player_from_ped(m_handle), {});
}} }}}};
}};
s_context_menu shared_menu{ContextEntityType::SHARED, s_context_menu shared_menu{ContextEntityType::SHARED,
0, 0,
{}, {},
{ {{"COPY HASH",
{"COPY HASH", [this] { [this] {
ImGui::SetClipboardText(std::format("0x{:08X}", (rage::joaat_t)m_pointer->m_model_info->m_hash).c_str()); ImGui::SetClipboardText(std::format("0x{:08X}", (rage::joaat_t)m_pointer->m_model_info->m_hash).c_str());
g_notification_service.push("Context Menu", g_notification_service.push("Context Menu",
std::format("Copy hash 0x{:08X}", (rage::joaat_t)m_pointer->m_model_info->m_hash).c_str()); std::format("Copy hash 0x{:08X}", (rage::joaat_t)m_pointer->m_model_info->m_hash).c_str());
@ -269,14 +263,12 @@ namespace big
FIRE::START_SCRIPT_FIRE(pos.x, pos.y, pos.z, 25, TRUE); FIRE::START_SCRIPT_FIRE(pos.x, pos.y, pos.z, 25, TRUE);
FIRE::ADD_EXPLOSION(pos.x, pos.y, pos.z, eExplosionTag::MOLOTOV, 1, false, false, 0, false); FIRE::ADD_EXPLOSION(pos.x, pos.y, pos.z, eExplosionTag::MOLOTOV, 1, false, false, 0, false);
}}, }},
{"DELETE", {"DELETE", [this] {
[this] {
if (entity::take_control_of(m_handle)) if (entity::take_control_of(m_handle))
{ {
entity::delete_entity(m_handle); entity::delete_entity(m_handle);
} }
}} }}}};
}};
std::unordered_map<ContextEntityType, s_context_menu> options = {{ContextEntityType::VEHICLE, vehicle_menu}, {ContextEntityType::PLAYER, player_menu}, {ContextEntityType::PED, ped_menu}, {ContextEntityType::SHARED, shared_menu}, {ContextEntityType::OBJECT, object_menu}}; std::unordered_map<ContextEntityType, s_context_menu> options = {{ContextEntityType::VEHICLE, vehicle_menu}, {ContextEntityType::PLAYER, player_menu}, {ContextEntityType::PED, ped_menu}, {ContextEntityType::SHARED, shared_menu}, {ContextEntityType::OBJECT, object_menu}};
}; };

View File

@ -15,6 +15,7 @@ namespace big
class cache_file final class cache_file final
{ {
public: public:
cache_file() = default;
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>

View File

@ -28,21 +28,21 @@ namespace big
} }
gta_data_service::gta_data_service() : gta_data_service::gta_data_service() :
m_peds_cache(g_file_manager.get_project_file("./cache/peds.bin"), 5),
m_vehicles_cache(g_file_manager.get_project_file("./cache/vehicles.bin"), 6),
m_update_state(eGtaDataUpdateState::IDLE) m_update_state(eGtaDataUpdateState::IDLE)
{ {
}
bool gta_data_service::init()
{
m_peds_cache = {g_file_manager.get_project_file("./cache/peds.bin"), 5};
m_vehicles_cache = {g_file_manager.get_project_file("./cache/vehicles.bin"), 6};
if (!is_cache_up_to_date()) if (!is_cache_up_to_date())
m_update_state = eGtaDataUpdateState::NEEDS_UPDATE; m_update_state = eGtaDataUpdateState::NEEDS_UPDATE;
else else
load_data(); load_data();
g_gta_data_service = this; return true;
}
gta_data_service::~gta_data_service()
{
g_gta_data_service = nullptr;
} }
bool gta_data_service::cache_needs_update() const bool gta_data_service::cache_needs_update() const
@ -171,6 +171,10 @@ namespace big
const auto ped_count = m_peds_cache.data_size() / sizeof(ped_item); const auto ped_count = m_peds_cache.data_size() / sizeof(ped_item);
LOG(INFO) << "Loading " << ped_count << " peds from cache."; LOG(INFO) << "Loading " << ped_count << " peds from cache.";
m_ped_types.clear();
m_ped_types.reserve(ped_count);
m_peds.clear();
auto cached_peds = reinterpret_cast<const ped_item*>(m_peds_cache.data()); auto cached_peds = reinterpret_cast<const ped_item*>(m_peds_cache.data());
for (size_t i = 0; i < ped_count; i++) for (size_t i = 0; i < ped_count; i++)
{ {
@ -189,6 +193,10 @@ namespace big
const auto vehicle_count = m_vehicles_cache.data_size() / sizeof(vehicle_item); const auto vehicle_count = m_vehicles_cache.data_size() / sizeof(vehicle_item);
LOG(INFO) << "Loading " << vehicle_count << " vehicles from cache."; LOG(INFO) << "Loading " << vehicle_count << " vehicles from cache.";
m_vehicle_classes.clear();
m_vehicle_classes.reserve(vehicle_count);
m_vehicles.clear();
auto cached_vehicles = reinterpret_cast<const vehicle_item*>(m_vehicles_cache.data()); auto cached_vehicles = reinterpret_cast<const vehicle_item*>(m_vehicles_cache.data());
for (size_t i = 0; i < vehicle_count; i++) for (size_t i = 0; i < vehicle_count; i++)
{ {
@ -207,6 +215,9 @@ namespace big
LOG(INFO) << "Loading " << m_weapons_cache.weapon_map.size() << " weapons from cache."; LOG(INFO) << "Loading " << m_weapons_cache.weapon_map.size() << " weapons from cache.";
LOG(INFO) << "Loading " << m_weapons_cache.weapon_components.size() << " weapon components from cache."; LOG(INFO) << "Loading " << m_weapons_cache.weapon_components.size() << " weapon components from cache.";
m_weapon_types.clear();
m_weapon_types.reserve(m_weapons_cache.weapon_map.size());
for (const auto& [_, weapon] : m_weapons_cache.weapon_map) for (const auto& [_, weapon] : m_weapons_cache.weapon_map)
{ {
add_if_not_exists(m_weapon_types, weapon.m_weapon_type); add_if_not_exists(m_weapon_types, weapon.m_weapon_type);

View File

@ -22,7 +22,9 @@ namespace big
{ {
public: public:
gta_data_service(); gta_data_service();
~gta_data_service(); ~gta_data_service() = default;
bool init();
bool cache_needs_update() const; bool cache_needs_update() const;
eGtaDataUpdateState state() const; eGtaDataUpdateState state() const;
@ -88,5 +90,5 @@ namespace big
static constexpr weapon_component empty_component{}; static constexpr weapon_component empty_component{};
}; };
inline gta_data_service* g_gta_data_service{}; inline gta_data_service g_gta_data_service{};
} }

View File

@ -1,7 +1,8 @@
#include "persist_weapons.hpp" #include "persist_weapons.hpp"
#include "services/gta_data/gta_data_service.hpp"
#include "gta/weapons.hpp" #include "gta/weapons.hpp"
#include "natives.hpp" #include "natives.hpp"
#include "services/gta_data/gta_data_service.hpp"
namespace big namespace big
{ {
@ -12,7 +13,7 @@ namespace big
Player player = self::id; Player player = self::id;
Ped player_ped = self::ped; Ped player_ped = self::ped;
weaponloadout_json weapon_json{}; weaponloadout_json weapon_json{};
for (const auto& [name, weapon] : g_gta_data_service->weapons()) for (const auto& [name, weapon] : g_gta_data_service.weapons())
{ {
Hash weapon_hash = weapon.m_hash; Hash weapon_hash = weapon.m_hash;
if (weapon_hash != WEAPON_UNARMED && WEAPON::HAS_PED_GOT_WEAPON(player_ped, weapon_hash, FALSE)) if (weapon_hash != WEAPON_UNARMED && WEAPON::HAS_PED_GOT_WEAPON(player_ped, weapon_hash, FALSE))
@ -167,7 +168,7 @@ namespace big
if (weapon.group != GROUP_MELEE) if (weapon.group != GROUP_MELEE)
{ {
WEAPON::SET_PED_WEAPON_TINT_INDEX(player_ped, weapon_hash, weapon.tint); WEAPON::SET_PED_WEAPON_TINT_INDEX(player_ped, weapon_hash, weapon.tint);
for (auto component : g_gta_data_service->weapon_by_hash(weapon_hash).m_attachments) for (auto component : g_gta_data_service.weapon_by_hash(weapon_hash).m_attachments)
WEAPON::REMOVE_WEAPON_COMPONENT_FROM_PED(player_ped, weapon_hash, rage::joaat(component)); WEAPON::REMOVE_WEAPON_COMPONENT_FROM_PED(player_ped, weapon_hash, rage::joaat(component));
for (auto component : weapon.component_array) for (auto component : weapon.component_array)
WEAPON::GIVE_WEAPON_COMPONENT_TO_PED(player_ped, weapon_hash, component); WEAPON::GIVE_WEAPON_COMPONENT_TO_PED(player_ped, weapon_hash, component);

View File

@ -39,7 +39,7 @@ namespace big
void pickup_service::give_ammo(const int targets) const void pickup_service::give_ammo(const int targets) const
{ {
for (const auto& [_, weapon] : g_gta_data_service->weapons()) for (const auto& [_, weapon] : g_gta_data_service.weapons())
{ {
if (weapon.m_reward_ammo_hash != 0 || weapon.m_throwable) if (weapon.m_reward_ammo_hash != 0 || weapon.m_throwable)
{ {
@ -65,7 +65,7 @@ namespace big
void pickup_service::give_weapons(const int targets) const void pickup_service::give_weapons(const int targets) const
{ {
for (const auto& [_, weapon] : g_gta_data_service->weapons()) for (const auto& [_, weapon] : g_gta_data_service.weapons())
{ {
if (weapon.m_reward_hash != 0) if (weapon.m_reward_hash != 0)
{ {

View File

@ -246,7 +246,7 @@ namespace big
if (CVehicleModelInfo* vehicle_model_info = static_cast<CVehicleModelInfo*>(vehicle->m_model_info)) if (CVehicleModelInfo* vehicle_model_info = static_cast<CVehicleModelInfo*>(vehicle->m_model_info))
{ {
vehicle_name = g_gta_data_service->vehicles()[vehicle_model_info->m_name].m_display_name; // TODO vehicle_name = g_gta_data_service.vehicles()[vehicle_model_info->m_name].m_display_name; // TODO
} }
if (veh_damage_bits & (uint32_t)eEntityProofs::GOD) if (veh_damage_bits & (uint32_t)eEntityProofs::GOD)

View File

@ -103,7 +103,7 @@ namespace big
components::command_checkbox<"nosway">(); components::command_checkbox<"nosway">();
components::button("GET_ALL_WEAPONS"_T, [] { components::button("GET_ALL_WEAPONS"_T, [] {
for (const auto& [_, weapon] : g_gta_data_service->weapons()) for (const auto& [_, weapon] : g_gta_data_service.weapons())
{ {
WEAPON::GIVE_DELAYED_WEAPON_TO_PED(self::ped, weapon.m_hash, 9999, false); WEAPON::GIVE_DELAYED_WEAPON_TO_PED(self::ped, weapon.m_hash, 9999, false);
} }
@ -236,7 +236,7 @@ namespace big
if (ImGui::BeginCombo("GUI_TAB_WEAPONS"_T.data(), selected_weapon.c_str())) if (ImGui::BeginCombo("GUI_TAB_WEAPONS"_T.data(), selected_weapon.c_str()))
{ {
std::map<std::string, weapon_item> sorted_map; std::map<std::string, weapon_item> sorted_map;
for (const auto& [_, weapon] : g_gta_data_service->weapons()) for (const auto& [_, weapon] : g_gta_data_service.weapons())
{ {
sorted_map.emplace(weapon.m_display_name, weapon); sorted_map.emplace(weapon.m_display_name, weapon);
} }
@ -270,12 +270,12 @@ namespace big
ImGui::PushItemWidth(250); ImGui::PushItemWidth(250);
if (ImGui::BeginCombo("VIEW_WEAPON_ATTACHMENTS"_T.data(), selected_weapon_attachment.c_str())) if (ImGui::BeginCombo("VIEW_WEAPON_ATTACHMENTS"_T.data(), selected_weapon_attachment.c_str()))
{ {
weapon_item weapon = g_gta_data_service->weapon_by_hash(selected_weapon_hash); weapon_item weapon = g_gta_data_service.weapon_by_hash(selected_weapon_hash);
if (!weapon.m_attachments.empty()) if (!weapon.m_attachments.empty())
{ {
for (std::string attachment : weapon.m_attachments) for (std::string attachment : weapon.m_attachments)
{ {
weapon_component attachment_component = g_gta_data_service->weapon_component_by_name(attachment); weapon_component attachment_component = g_gta_data_service.weapon_component_by_name(attachment);
std::string attachment_name = attachment_component.m_display_name; std::string attachment_name = attachment_component.m_display_name;
Hash attachment_hash = attachment_component.m_hash; Hash attachment_hash = attachment_component.m_hash;
if (attachment_hash == NULL) if (attachment_hash == NULL)
@ -389,16 +389,16 @@ namespace big
for (auto& weapon_hash : g.weapons.weapon_hotkeys[selected_key]) for (auto& weapon_hash : g.weapons.weapon_hotkeys[selected_key])
{ {
ImGui::PushID(counter); ImGui::PushID(counter);
weapon_item weapon = g_gta_data_service->weapon_by_hash(weapon_hash); weapon_item weapon = g_gta_data_service.weapon_by_hash(weapon_hash);
ImGui::PushItemWidth(300); ImGui::PushItemWidth(300);
if (ImGui::BeginCombo("GUI_TAB_WEAPONS"_T.data(), weapon.m_display_name.c_str())) if (ImGui::BeginCombo("GUI_TAB_WEAPONS"_T.data(), weapon.m_display_name.c_str()))
{ {
std::map<std::string, weapon_item> sorted_map; std::map<std::string, weapon_item> sorted_map;
for (const auto& [_, weapon_iter] : g_gta_data_service->weapons()) for (const auto& [_, weapon_iter] : g_gta_data_service.weapons())
{ {
sorted_map.emplace(weapon_iter.m_display_name, weapon_iter); sorted_map.emplace(weapon_iter.m_display_name, weapon_iter);
} }
for (const auto& [_, weapon_iter] : g_gta_data_service->weapons()) for (const auto& [_, weapon_iter] : g_gta_data_service.weapons())
{ {
if (weapon_iter.m_display_name == "NULL") if (weapon_iter.m_display_name == "NULL")
{ {

View File

@ -5,17 +5,18 @@ namespace big
{ {
void view::gta_cache() void view::gta_cache()
{ {
auto ped_count = g_gta_data_service->peds().size(); auto ped_count = g_gta_data_service.peds().size();
auto veh_count = g_gta_data_service->vehicles().size(); auto veh_count = g_gta_data_service.vehicles().size();
auto wep_count = g_gta_data_service->weapons().size(); auto wep_count = g_gta_data_service.weapons().size();
auto wep_comp_count = g_gta_data_service->weapon_components().size(); auto wep_comp_count = g_gta_data_service.weapon_components().size();
ImGui::Text(std::format("{}: {}\n{}: {}\n{}: {}\n{}: {}", "VIEW_GTA_CACHE_PEDS_CACHED"_T, ped_count, "VIEW_GTA_CACHE_VEHICLES_CACHED"_T, veh_count, "VIEW_GTA_CACHE_WEAPONS_CACHED"_T, wep_count, "VIEW_GTA_CACHE_WEAPON_COMPONENTS_CACHED"_T, wep_comp_count).c_str()); ImGui::Text(std::format("{}: {}\n{}: {}\n{}: {}\n{}: {}", "VIEW_GTA_CACHE_PEDS_CACHED"_T, ped_count, "VIEW_GTA_CACHE_VEHICLES_CACHED"_T, veh_count, "VIEW_GTA_CACHE_WEAPONS_CACHED"_T, wep_count, "VIEW_GTA_CACHE_WEAPON_COMPONENTS_CACHED"_T, wep_comp_count)
.c_str());
if (components::button("VIEW_GTA_CACHE_REBUILD_CACHE"_T)) if (components::button("VIEW_GTA_CACHE_REBUILD_CACHE"_T))
{ {
g_gta_data_service->set_state(eGtaDataUpdateState::NEEDS_UPDATE); g_gta_data_service.set_state(eGtaDataUpdateState::NEEDS_UPDATE);
g_gta_data_service->update_now(); g_gta_data_service.update_now();
} }
} }
} }

View File

@ -55,7 +55,7 @@ namespace big
static int selected_class = -1; static int selected_class = -1;
const auto& class_arr = g_gta_data_service->vehicle_classes(); const auto& class_arr = g_gta_data_service.vehicle_classes();
ImGui::SetNextItemWidth(300.f); ImGui::SetNextItemWidth(300.f);
if (ImGui::BeginCombo("VEHICLE_CLASS"_T.data(), if (ImGui::BeginCombo("VEHICLE_CLASS"_T.data(),
@ -125,7 +125,7 @@ namespace big
{ {
const auto& label = it.first; const auto& label = it.first;
const auto& personal_veh = it.second; const auto& personal_veh = it.second;
const auto& item = g_gta_data_service->vehicle_by_hash(personal_veh->get_hash()); const auto& item = g_gta_data_service.vehicle_by_hash(personal_veh->get_hash());
std::string vehicle_class = item.m_vehicle_class; std::string vehicle_class = item.m_vehicle_class;
std::string display_name = label; std::string display_name = label;

View File

@ -32,7 +32,7 @@ namespace big
}); });
static int selected_class = -1; static int selected_class = -1;
const auto& class_arr = g_gta_data_service->vehicle_classes(); const auto& class_arr = g_gta_data_service.vehicle_classes();
ImGui::SetNextItemWidth(300.f); ImGui::SetNextItemWidth(300.f);
if (ImGui::BeginCombo("VEHICLE_CLASS"_T.data(), if (ImGui::BeginCombo("VEHICLE_CLASS"_T.data(),
@ -66,9 +66,9 @@ namespace big
vehicle_map calculated_map{}; vehicle_map calculated_map{};
if (g_gta_data_service->vehicles().size() > 0) if (g_gta_data_service.vehicles().size() > 0)
{ {
for (auto& item : g_gta_data_service->vehicles()) for (auto& item : g_gta_data_service.vehicles())
{ {
const auto& vehicle = item.second; const auto& vehicle = item.second;
@ -82,7 +82,8 @@ namespace big
std::string lower_search = search; std::string lower_search = search;
std::transform(lower_search.begin(), lower_search.end(), lower_search.begin(), tolower); std::transform(lower_search.begin(), lower_search.end(), lower_search.begin(), tolower);
if ((selected_class == -1 || class_arr[selected_class] == clazz) && (display_name.find(lower_search) != std::string::npos || display_manufacturer.find(lower_search) != std::string::npos)) if ((selected_class == -1 || class_arr[selected_class] == clazz)
&& (display_name.find(lower_search) != std::string::npos || display_manufacturer.find(lower_search) != std::string::npos))
{ {
calculated_map.emplace(item); calculated_map.emplace(item);
} }
@ -112,7 +113,7 @@ namespace big
if (veh_hash) if (veh_hash)
{ {
const auto& item = g_gta_data_service->vehicle_by_hash(veh_hash); const auto& item = g_gta_data_service.vehicle_by_hash(veh_hash);
components::selectable(std::vformat("SPAWN_VEHICLE_CURRENT_VEHICLE"_T, std::make_format_args(item.m_display_name)), false, [] { components::selectable(std::vformat("SPAWN_VEHICLE_CURRENT_VEHICLE"_T, std::make_format_args(item.m_display_name)), false, [] {
if (self::veh) if (self::veh)
@ -166,8 +167,7 @@ namespace big
const auto& vehicle = item.second; const auto& vehicle = item.second;
ImGui::PushID(vehicle.m_hash); ImGui::PushID(vehicle.m_hash);
components::selectable(vehicle.m_display_name, false, [&vehicle] { components::selectable(vehicle.m_display_name, false, [&vehicle] {
const auto spawn_location = const auto spawn_location = vehicle::get_spawn_location(g.spawn_vehicle.spawn_inside, vehicle.m_hash);
vehicle::get_spawn_location(g.spawn_vehicle.spawn_inside, vehicle.m_hash);
const auto spawn_heading = ENTITY::GET_ENTITY_HEADING(self::ped); const auto spawn_heading = ENTITY::GET_ENTITY_HEADING(self::ped);
auto veh = vehicle::spawn(vehicle.m_hash, spawn_location, spawn_heading); auto veh = vehicle::spawn(vehicle.m_hash, spawn_location, spawn_heading);

View File

@ -6,10 +6,10 @@ namespace big
{ {
void view::gta_data() void view::gta_data()
{ {
if (!g_gta_data_service || !g.settings.onboarding_complete) if (!g.settings.onboarding_complete)
return; return;
if (g_gta_data_service->cache_needs_update()) if (g_gta_data_service.cache_needs_update())
{ {
g_gui->toggle(true); g_gui->toggle(true);
ImGui::OpenPopup("GAME_CACHE"_T.data()); ImGui::OpenPopup("GAME_CACHE"_T.data());
@ -19,7 +19,7 @@ namespace big
ImGui::SetNextWindowPos({200, 200}, ImGuiCond_FirstUseEver); ImGui::SetNextWindowPos({200, 200}, ImGuiCond_FirstUseEver);
if (ImGui::BeginPopupModal("GAME_CACHE"_T.data())) if (ImGui::BeginPopupModal("GAME_CACHE"_T.data()))
{ {
switch (g_gta_data_service->state()) switch (g_gta_data_service.state())
{ {
case eGtaDataUpdateState::NEEDS_UPDATE: case eGtaDataUpdateState::NEEDS_UPDATE:
{ {
@ -27,7 +27,7 @@ namespace big
if (ImGui::Button("GAME_CACHE_UPDATE_CACHE"_T.data())) if (ImGui::Button("GAME_CACHE_UPDATE_CACHE"_T.data()))
{ {
g_gta_data_service->update_now(); g_gta_data_service.update_now();
} }
break; break;

View File

@ -28,8 +28,8 @@ namespace big
return; return;
} }
const auto& weapon_type_arr = g_gta_data_service->weapon_types(); const auto& weapon_type_arr = g_gta_data_service.weapon_types();
for (auto& [_, weapon] : g_gta_data_service->weapons()) for (auto& [_, weapon] : g_gta_data_service.weapons())
{ {
if (selected_ped_weapon_type == SPAWN_PED_ALL_WEAPONS || weapon.m_weapon_type == weapon_type_arr[selected_ped_weapon_type]) if (selected_ped_weapon_type == SPAWN_PED_ALL_WEAPONS || weapon.m_weapon_type == weapon_type_arr[selected_ped_weapon_type])
{ {
@ -194,11 +194,11 @@ namespace big
static char ped_model_buf[64]; static char ped_model_buf[64];
static Player selected_ped_player_id = -1; static Player selected_ped_player_id = -1;
auto& ped_type_arr = g_gta_data_service->ped_types(); auto& ped_type_arr = g_gta_data_service.ped_types();
auto& ped_arr = g_gta_data_service->peds(); auto& ped_arr = g_gta_data_service.peds();
auto& weapon_type_arr = g_gta_data_service->weapon_types(); auto& weapon_type_arr = g_gta_data_service.weapon_types();
auto& weapon_arr = g_gta_data_service->weapons(); auto& weapon_arr = g_gta_data_service.weapons();
static Player selected_ped_for_player_id = -1; static Player selected_ped_for_player_id = -1;
auto& player_arr = g_player_service->players(); auto& player_arr = g_player_service->players();
@ -489,7 +489,7 @@ namespace big
"NO_WEAPONS"_T.data() : "NO_WEAPONS"_T.data() :
selected_ped_weapon_hash == 0 ? selected_ped_weapon_hash == 0 ?
"ALL"_T.data() : "ALL"_T.data() :
g_gta_data_service->weapon_by_hash(selected_ped_weapon_hash).m_display_name.c_str())) g_gta_data_service.weapon_by_hash(selected_ped_weapon_hash).m_display_name.c_str()))
{ {
if (selected_ped_weapon_type != SPAWN_PED_NO_WEAPONS) if (selected_ped_weapon_type != SPAWN_PED_NO_WEAPONS)
{ {

View File

@ -9,8 +9,14 @@ namespace big
void view::squad_spawner() void view::squad_spawner()
{ {
const char* const spawn_distance_modes[5]{"CUSTOM"_T.data(), "VIEW_SQUAD_SPAWNER_ON_TARGET"_T.data(), "VIEW_SQUAD_SPAWNER_NEARBY"_T.data(), "VIEW_SQUAD_SPAWNER_MODERATELY_DISTANCED"_T.data(), "VIEW_SQUAD_SPAWNER_FAR_AWAY"_T.data()}; const char* const spawn_distance_modes[5]{"CUSTOM"_T.data(),
const char* const combat_ability_levels[3]{"VIEW_SQUAD_SPAWNER_POOR"_T.data(), "VIEW_SQUAD_SPAWNER_AVERAGE"_T.data(), "VIEW_SQUAD_SPAWNER_PROFESSIONAL"_T.data()}; "VIEW_SQUAD_SPAWNER_ON_TARGET"_T.data(),
"VIEW_SQUAD_SPAWNER_NEARBY"_T.data(),
"VIEW_SQUAD_SPAWNER_MODERATELY_DISTANCED"_T.data(),
"VIEW_SQUAD_SPAWNER_FAR_AWAY"_T.data()};
const char* const combat_ability_levels[3]{"VIEW_SQUAD_SPAWNER_POOR"_T.data(),
"VIEW_SQUAD_SPAWNER_AVERAGE"_T.data(),
"VIEW_SQUAD_SPAWNER_PROFESSIONAL"_T.data()};
static squad new_template{}; static squad new_template{};
static player_ptr victim = g_player_service->get_selected(); static player_ptr victim = g_player_service->get_selected();
@ -115,15 +121,15 @@ namespace big
components::input_text_with_hint("##name", "NAME"_T, new_template.m_name); components::input_text_with_hint("##name", "NAME"_T, new_template.m_name);
components::input_text_with_hint("##pedmodel", "PED_MODEL"_T, new_template.m_ped_model); components::input_text_with_hint("##pedmodel", "PED_MODEL"_T, new_template.m_ped_model);
auto ped_found = std::find_if(g_gta_data_service->peds().begin(), g_gta_data_service->peds().end(), [=](const auto& pair) { auto ped_found = std::find_if(g_gta_data_service.peds().begin(), g_gta_data_service.peds().end(), [=](const auto& pair) {
return pair.second.m_name == new_template.m_ped_model; return pair.second.m_name == new_template.m_ped_model;
}); });
if (!new_template.m_ped_model.empty() && ped_found == g_gta_data_service->peds().end()) if (!new_template.m_ped_model.empty() && ped_found == g_gta_data_service.peds().end())
{ {
if (ImGui::BeginListBox("##pedlist", ImVec2(250, 200))) if (ImGui::BeginListBox("##pedlist", ImVec2(250, 200)))
{ {
for (auto& p : g_gta_data_service->peds() | std::ranges::views::values) for (auto& p : g_gta_data_service.peds() | std::ranges::views::values)
{ {
std::string p_model = p.m_name; std::string p_model = p.m_name;
std::string filter = new_template.m_ped_model; std::string filter = new_template.m_ped_model;
@ -143,15 +149,15 @@ namespace big
if (ImGui::IsItemHovered()) if (ImGui::IsItemHovered())
ImGui::SetTooltip("VIEW_SQUAD_SPAWNER_VEHICLE_TOOLTIP"_T.data()); ImGui::SetTooltip("VIEW_SQUAD_SPAWNER_VEHICLE_TOOLTIP"_T.data());
auto veh_found = std::find_if(g_gta_data_service->vehicles().begin(), g_gta_data_service->vehicles().end(), [=](const auto& pair) { auto veh_found = std::find_if(g_gta_data_service.vehicles().begin(), g_gta_data_service.vehicles().end(), [=](const auto& pair) {
return pair.second.m_name == new_template.m_vehicle_model; return pair.second.m_name == new_template.m_vehicle_model;
}); });
if (!new_template.m_vehicle_model.empty() && veh_found == g_gta_data_service->vehicles().end()) if (!new_template.m_vehicle_model.empty() && veh_found == g_gta_data_service.vehicles().end())
{ {
if (ImGui::BeginListBox("##vehlist", ImVec2(250, 200))) if (ImGui::BeginListBox("##vehlist", ImVec2(250, 200)))
{ {
for (auto& p : g_gta_data_service->vehicles() | std::ranges::views::values) for (auto& p : g_gta_data_service.vehicles() | std::ranges::views::values)
{ {
std::string p_model = p.m_name; std::string p_model = p.m_name;
std::string filter = new_template.m_vehicle_model; std::string filter = new_template.m_vehicle_model;
@ -171,15 +177,15 @@ namespace big
if (ImGui::IsItemHovered()) if (ImGui::IsItemHovered())
ImGui::SetTooltip("VIEW_SQUAD_SPAWNER_WEAPON_MODEL_TOOLTIP"_T.data()); ImGui::SetTooltip("VIEW_SQUAD_SPAWNER_WEAPON_MODEL_TOOLTIP"_T.data());
auto weap_found = std::find_if(g_gta_data_service->weapons().begin(), g_gta_data_service->weapons().end(), [=](const auto& pair) { auto weap_found = std::find_if(g_gta_data_service.weapons().begin(), g_gta_data_service.weapons().end(), [=](const auto& pair) {
return pair.second.m_name == new_template.m_weapon_model; return pair.second.m_name == new_template.m_weapon_model;
}); });
if (!new_template.m_weapon_model.empty() && weap_found == g_gta_data_service->weapons().end()) if (!new_template.m_weapon_model.empty() && weap_found == g_gta_data_service.weapons().end())
{ {
if (ImGui::BeginListBox("##weaplist", ImVec2(250, 200))) if (ImGui::BeginListBox("##weaplist", ImVec2(250, 200)))
{ {
for (auto& p : g_gta_data_service->weapons() | std::ranges::views::values) for (auto& p : g_gta_data_service.weapons() | std::ranges::views::values)
{ {
std::string p_model = p.m_name; std::string p_model = p.m_name;
std::string filter = new_template.m_weapon_model; std::string filter = new_template.m_weapon_model;
@ -216,7 +222,9 @@ namespace big
ImGui::Text("VIEW_SQUAD_SPAWNER_ACTIONS"_T.data()); ImGui::Text("VIEW_SQUAD_SPAWNER_ACTIONS"_T.data());
ImGui::Spacing(); ImGui::Spacing();
components::button(std::format("{} {} {}", "SETTINGS_NOTIFY_GTA_THREADS_TERMINATE"_T, g_squad_spawner_service.m_active_squads.size(), "VIEW_SQUAD_SPAWNER_SQUADS"_T), [] { components::button(
std::format("{} {} {}", "SETTINGS_NOTIFY_GTA_THREADS_TERMINATE"_T, g_squad_spawner_service.m_active_squads.size(), "VIEW_SQUAD_SPAWNER_SQUADS"_T),
[] {
g_squad_spawner_service.terminate_squads(); g_squad_spawner_service.terminate_squads();
}); });
@ -312,7 +320,8 @@ namespace big
ImGui::Text("VIEW_SQUAD_SPAWN_PERSISTENT_VEHICLE"_T.data()); ImGui::Text("VIEW_SQUAD_SPAWN_PERSISTENT_VEHICLE"_T.data());
if (ImGui::BeginCombo("##persistent_vehicle", new_template.m_persistent_vehicle.data())) if (ImGui::BeginCombo("##persistent_vehicle", new_template.m_persistent_vehicle.data()))
{ {
if (ImGui::Selectable("VIEW_SQUAD_SPAWN_PERSISTENT_VEHICLE_NONE"_T.data(), new_template.m_persistent_vehicle == "VIEW_SQUAD_SPAWN_PERSISTENT_VEHICLE_NONE"_T.data())) if (ImGui::Selectable("VIEW_SQUAD_SPAWN_PERSISTENT_VEHICLE_NONE"_T.data(),
new_template.m_persistent_vehicle == "VIEW_SQUAD_SPAWN_PERSISTENT_VEHICLE_NONE"_T.data()))
new_template.m_persistent_vehicle = "VIEW_SQUAD_SPAWN_PERSISTENT_VEHICLE_NONE"_T.data(); new_template.m_persistent_vehicle = "VIEW_SQUAD_SPAWN_PERSISTENT_VEHICLE_NONE"_T.data();
for (auto& p : persist_car_service::list_files()) for (auto& p : persist_car_service::list_files())
{ {
@ -324,7 +333,9 @@ namespace big
ImGui::PopItemWidth(); ImGui::PopItemWidth();
ImGui::EndGroup(); ImGui::EndGroup();
components::input_text_with_hint("##new_template.m_description", "VIEW_SQUAD_SPAWN_DESCRIPTION"_T, new_template.m_description); components::input_text_with_hint("##new_template.m_description",
"VIEW_SQUAD_SPAWN_DESCRIPTION"_T,
new_template.m_description);
ImGui::TreePop(); ImGui::TreePop();
} }