diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bd62afc..3f5ee68 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ concurrency: jobs: ci: - runs-on: windows-latest + runs-on: windows-2022 name: CI steps: - uses: actions/checkout@v4 @@ -28,7 +28,7 @@ jobs: arch: amd64 - name: Generate CMake project - run: cmake -D CMAKE_BUILD_TYPE=RelWithDebInfo -D OPTIMIZE=YES -S. -Bbuild -G Ninja + run: cmake -D CMAKE_BUILD_TYPE=RelWithDebInfo -D OPTIMIZE=YES -D CMAKE_POLICY_VERSION_MINIMUM=3.5 -S. -Bbuild -G Ninja - name: Build 64bit release DLL run: cmake --build ./build --config RelWithDebInfo --target YimMenu -- diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index c52b588..c26f01d 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -29,7 +29,7 @@ jobs: fi build_nightly: - runs-on: windows-latest + runs-on: windows-2022 name: Build Nightly needs: check_recent_commit if: needs.check_recent_commit.outputs.should_run == 'true' @@ -50,7 +50,7 @@ jobs: arch: amd64 - name: Generate CMake project - run: cmake -D CMAKE_BUILD_TYPE=RelWithDebInfo -D OPTIMIZE=YES -S. -Bbuild -G Ninja + run: cmake -D CMAKE_BUILD_TYPE=RelWithDebInfo -D OPTIMIZE=YES -D CMAKE_POLICY_VERSION_MINIMUM=3.5 -S. -Bbuild -G Ninja - name: Build 64bit release DLL run: cmake --build ./build --config RelWithDebInfo --target YimMenu -- diff --git a/cmake/gtav-classes.cmake b/cmake/gtav-classes.cmake index 5ba4dff..3c7a0d5 100644 --- a/cmake/gtav-classes.cmake +++ b/cmake/gtav-classes.cmake @@ -1,8 +1,14 @@ include(FetchContent) -message(STATUS "Fetching GTAV-Classes (Build_3751.0)") + FetchContent_Declare( gtav_classes - GIT_REPOSITORY https://github.com/Hexlane/GTAV-Classes-1.git - GIT_TAG Build_3751.0 + GIT_REPOSITORY https://github.com/Pyxalon/GTAV-Classes-1.git + GIT_TAG b3889 + GIT_PROGRESS TRUE + CONFIGURE_COMMAND "" + BUILD_COMMAND "" ) -FetchContent_MakeAvailable(gtav_classes) +message("GTAV-Classes") +if(NOT gtav_classes_POPULATED) + FetchContent_Populate(gtav_classes) +endif() diff --git a/cmake/json.cmake b/cmake/json.cmake index 014f3e7..50ce24c 100644 --- a/cmake/json.cmake +++ b/cmake/json.cmake @@ -1,12 +1,9 @@ include(FetchContent) -set(JSON_MultipleHeaders OFF) - FetchContent_Declare( json - GIT_REPOSITORY https://github.com/ArthurSonzogni/nlohmann_json_cmake_fetchcontent.git - GIT_TAG 67e6070f9d9a44b4dec79ebe6b591f39d2285593 - GIT_PROGRESS TRUE + URL https://github.com/nlohmann/json/releases/download/v3.12.0/json.tar.xz + DOWNLOAD_EXTRACT_TIMESTAMP TRUE ) -message("json") +option(JSON_MultipleHeaders "Disable nlohmann JSON multi header default." OFF) FetchContent_MakeAvailable(json) diff --git a/cmake/minhook.cmake b/cmake/minhook.cmake index 9ec3790..234d454 100644 --- a/cmake/minhook.cmake +++ b/cmake/minhook.cmake @@ -2,8 +2,8 @@ include(FetchContent) FetchContent_Declare( minhook - GIT_REPOSITORY https://github.com/YimMenu/minhook.git - GIT_TAG 902ab63e0a771547961e132ccc0700d62e2a1423 + GIT_REPOSITORY https://github.com/TsudaKageyu/minhook.git + GIT_TAG 2b003bb063d66f016cc1aef7d63951350ce60f35 GIT_PROGRESS TRUE ) message("MinHook") diff --git a/cmake/pugixml.cmake b/cmake/pugixml.cmake index 362a9e1..154bfe4 100644 --- a/cmake/pugixml.cmake +++ b/cmake/pugixml.cmake @@ -3,7 +3,7 @@ include(FetchContent) FetchContent_Declare( pugixml GIT_REPOSITORY https://github.com/zeux/pugixml.git - GIT_TAG a0e064336317c9347a91224112af9933598714e9 + GIT_TAG 27b68329de32cf9c601ca8eb6c588fd639960c40 GIT_PROGRESS TRUE ) message("pugixml") diff --git a/src/backend/commands/player/misc/enter_interior.cpp b/src/backend/commands/player/misc/enter_interior.cpp index 8939f96..f34a81d 100644 --- a/src/backend/commands/player/misc/enter_interior.cpp +++ b/src/backend/commands/player/misc/enter_interior.cpp @@ -8,44 +8,44 @@ namespace big { class enter_interior : player_command -{ - using player_command::player_command; - - virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) override { - int id = player->id(); - if (scr_globals::gpbd_fm_1.as()->Entries[id].PropertyData.Index != -1) - { - const size_t arg_count = 10; - int64_t args[arg_count] = {(int64_t)eRemoteEvent::Teleport, - self::id, - 1 << self::id, - (int64_t)player->id(), - (int64_t)(int)-1, - 1, - (int64_t)scr_globals::gpbd_fm_1.as()->Entries[id].PropertyData.Index, - 1, - 0, - 1}; + using player_command::player_command; - g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << self::id, (int)eRemoteEvent::Teleport); - } - else if (scr_globals::globalplayer_bd.as()->Entries[id].SimpleInteriorData.Index != eSimpleInteriorIndex::SIMPLE_INTERIOR_INVALID) + virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) override { - *scr_globals::interiors.at(3891).as() = - scr_globals::globalplayer_bd.as()->Entries[id].SimpleInteriorData.Owner; - *scr_globals::interiors.at(4248).as() = - scr_globals::globalplayer_bd.as()->Entries[id].SimpleInteriorData.Index; - *scr_globals::interiors.at(4247).as() = true; - scr_globals::globalplayer_bd.as()->Entries[self::id].SimpleInteriorData.InteriorSubtype = - scr_globals::globalplayer_bd.as()->Entries[id].SimpleInteriorData.InteriorSubtype; - } - else - { - ctx->report_error("BACKEND_ENTER_INTERIOR_NOT_IN_INTERIOR"_T.data()); + int id = player->id(); + if (scr_globals::gpbd_fm_1.as()->Entries[id].PropertyData.Index != -1) + { + const size_t arg_count = 10; + int64_t args[arg_count] = {(int64_t)eRemoteEvent::Teleport, + self::id, + 1 << self::id, + (int64_t)player->id(), + (int64_t)(int)-1, + 1, + (int64_t)scr_globals::gpbd_fm_1.as()->Entries[id].PropertyData.Index, + 1, + 0, + 1}; + + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << self::id, (int)eRemoteEvent::Teleport); + } + else if (scr_globals::globalplayer_bd.as()->Entries[id].SimpleInteriorData.Index != eSimpleInteriorIndex::SIMPLE_INTERIOR_INVALID) + { + *scr_globals::interiors.at(3892).as() = + scr_globals::globalplayer_bd.as()->Entries[id].SimpleInteriorData.Owner; + *scr_globals::interiors.at(4249).as() = + scr_globals::globalplayer_bd.as()->Entries[id].SimpleInteriorData.Index; + *scr_globals::interiors.at(4248).as() = true; + scr_globals::globalplayer_bd.as()->Entries[self::id].SimpleInteriorData.InteriorSubtype = + scr_globals::globalplayer_bd.as()->Entries[id].SimpleInteriorData.InteriorSubtype; + } + else + { + ctx->report_error("BACKEND_ENTER_INTERIOR_NOT_IN_INTERIOR"_T.data()); + } } - } -}; + }; enter_interior g_enter_interior("enterint", "ENTER_INTERIOR", "ENTER_INTERIOR_DESC", 0, false); } diff --git a/src/core/data/all_script_names.hpp b/src/core/data/all_script_names.hpp index 773c09f..5506c70 100644 --- a/src/core/data/all_script_names.hpp +++ b/src/core/data/all_script_names.hpp @@ -226,6 +226,11 @@ namespace big "fm_content_survival_grouping"_J, "fm_content_valentine_cheater"_J, "fm_content_survival"_J, + "fm_content_kortz_scoping"_J, + "fm_content_kortz_entry"_J, + "fm_content_kortz_equipment"_J, + "fm_content_kortz_disruption"_J, + "fm_content_kortz_task"_J, "AM_BOAT_TAXI"_J, "AM_HELI_TAXI"_J, "fm_hold_up_tut"_J, @@ -401,6 +406,7 @@ namespace big "am_mp_island", "am_mp_juggalo_hideout", "am_mp_mansion", + "am_mp_mansion_art_workshop", "am_mp_mansion_driveway", "am_mp_mansion_garage", "am_mp_multistorey_garage", @@ -712,6 +718,7 @@ namespace big "flow_help", "flyunderbridges", "fmmc_contentquicklauncher", + "fmmc_lasers", "fmmc_launcher", "fmmc_playlist_controller", "fm_bj_race_controler", @@ -768,6 +775,11 @@ namespace big "fm_content_hsw_time_trial", "fm_content_island_dj", "fm_content_island_heist", + "fm_content_kortz_disruption", + "fm_content_kortz_entry", + "fm_content_kortz_equipment", + "fm_content_kortz_scoping", + "fm_content_kortz_task", "fm_content_metal_detector", "fm_content_movie_props", "fm_content_mp_intro", @@ -827,6 +839,7 @@ namespace big "fm_main_menu", "fm_mission_controller", "fm_mission_controller_2020", + "fm_mission_controller_v3", "fm_mission_creator", "fm_race_controler", "fm_race_creator", @@ -991,6 +1004,7 @@ namespace big "josh4", "juggalo_hideout_carmod", "juggalo_hideout_seating", + "kortz_planning", "lamar1", "landing_pre_startup", "laptop_trigger", @@ -1040,6 +1054,7 @@ namespace big "maintransition", "main_install", "main_persistent", + "mansion_art_workshop_seating", "mansion_basement_seating", "mansion_carmod", "mansion_club_bar", @@ -1093,6 +1108,7 @@ namespace big "mp_registration", "mp_save_game_global_block", "mp_skycam_stuck_wiggler", + "mp_strand_f9", "mp_unlocks", "mp_weapons", "mrsphilips1", diff --git a/src/core/data/stack_sizes.hpp b/src/core/data/stack_sizes.hpp index b859eaf..31cc783 100644 --- a/src/core/data/stack_sizes.hpp +++ b/src/core/data/stack_sizes.hpp @@ -29,7 +29,7 @@ namespace big {"INGAMEHUD", 4600}, {"TRANSITION", 8032}, {"FMMC_LAUNCHER", 28000}, - {"MULTIPLAYER_FREEMODE", 89500}, + {"MULTIPLAYER_FREEMODE", 92500}, {"MISSION", 64500}, {"MP_LAUNCH_SCRIPT", 35250}, }; diff --git a/src/core/scr_globals.hpp b/src/core/scr_globals.hpp index b567e5b..688fa26 100644 --- a/src/core/scr_globals.hpp +++ b/src/core/scr_globals.hpp @@ -4,102 +4,101 @@ namespace big::scr_globals { - static inline const script_global gsbd(2649159); - static inline const script_global gsbd_kicking(1877125); - static inline const script_global gsbd_fm_events(1922477); + static inline const script_global gsbd(2649161); + static inline const script_global gsbd_kicking(1877205); + static inline const script_global gsbd_fm_events(1922845); - static inline const script_global globalplayer_bd(2658291); - static inline const script_global gpbd_fm_3(1892653); + static inline const script_global globalplayer_bd(2658293); + static inline const script_global gpbd_fm_3(1892925); + static inline const script_global gpbd_fm_1(1845298); + static inline const script_global interiors(1950702); - static inline const script_global gpbd_fm_1(1845250); - static inline const script_global interiors(1950198); - - static inline const script_global launcher_global(2699984); + static inline const script_global launcher_global(2700095); // creator globals usually remain the same after updates static inline const script_global terminate_creator(1574607); // NETWORK::NETWORK_BAIL(1, 0, 0); fm_*_creator - static inline const script_global switch_struct(1574634); + static inline const script_global switch_struct(1574635); static inline const script_global mission_creator_radar_follows_camera(2621443); static inline const script_global mission_creator_exited(1574530); - static inline const script_global transition_state(1575018); - static inline const script_global sctv_spectator(2698539); // pausemenu_multiplayer function 0xE49C42EC + static inline const script_global transition_state(1575022); + static inline const script_global sctv_spectator(2698647); // pausemenu_multiplayer function 0xE49C42EC - static inline const script_global vehicle_global(1583765); + static inline const script_global vehicle_global(1583771); - static inline const script_global freemode_properties(2673271); - static inline const script_global freemode_global(2733002); + static inline const script_global freemode_properties(2673273); + static inline const script_global freemode_global(2733190); - static inline const script_global spawn_global(2697006); + static inline const script_global spawn_global(2697114); - static inline const script_global transaction_overlimit(4516902); + static inline const script_global transaction_overlimit(4516981); static inline const script_global stats(2359296); static inline const script_global session(1574589); - static inline const script_global session2(1575042); - static inline const script_global session3(33776); - static inline const script_global session4(2686090); - static inline const script_global session5(1575017); - static inline const script_global session6(2696922); // freemode -> if (NETWORK::NETWORK_IS_GAME_IN_PROGRESS() && !NETWORK::NETWORK_IS_ACTIVITY_SESSION()) + static inline const script_global session2(1575046); + static inline const script_global session3(33816); + static inline const script_global session4(1574944); + static inline const script_global session5(1575021); + static inline const script_global session6(2697030); // freemode -> if (NETWORK::NETWORK_IS_GAME_IN_PROGRESS() && !NETWORK::NETWORK_IS_ACTIVITY_SESSION()) - static inline const script_global interaction_menu_access(2711261); // am_pi_menu -> if (NETWORK::NETWORK_IS_SIGNED_ONLINE()) first global after that + static inline const script_global interaction_menu_access(2712187); // am_pi_menu -> if (NETWORK::NETWORK_IS_SIGNED_ONLINE()) first global after that - static inline const script_global disable_wasted_sound(2708893); // freemode -> AUDIO::PLAY_SOUND_FRONTEND(-1, "Wasted", "POWER_PLAY_General_Soundset", true); + static inline const script_global disable_wasted_sound(2709004); // freemode -> AUDIO::PLAY_SOUND_FRONTEND(-1, "Wasted", "POWER_PLAY_General_Soundset", true); static inline const script_global passive(1574582); // if (((!PED::IS_PED_IN_ANY_VEHICLE(PLAYER::GET_PLAYER_PED(bVar1), false) || Global_ - static inline const script_global property_garage(1944263); + static inline const script_global property_garage(1944657); static inline const script_global property_names(1312440); - static inline const script_global reset_clothing(105008); // freemode 75, &iLocal_.*, 2\); + static inline const script_global reset_clothing(105065); // freemode 75, &iLocal_.*, 2\); - static inline const script_global gun_van(1956819); // return -29.532f, 6435.136f, 31.162f; + static inline const script_global gun_van(1957326); // return -29.532f, 6435.136f, 31.162f; - static inline const script_global disable_phone(21593); + static inline const script_global disable_phone(21632); - static inline const script_global should_reset_fm_weapons(1576473); + static inline const script_global should_reset_fm_weapons(1576478); } namespace big::scr_locals { namespace am_hunt_the_beast { - constexpr static auto broadcast_idx = 624; // (bParam0) != 0; - constexpr static auto player_broadcast_idx = 2608; // if (NETWORK::PARTICIPANT_ID_TO_INT() != -1) + constexpr static auto broadcast_idx = 633; // (bParam0) != 0; + constexpr static auto player_broadcast_idx = 2617; // if (NETWORK::PARTICIPANT_ID_TO_INT() != -1) } namespace am_criminal_damage { - constexpr static auto broadcast_idx = 119; // /* Tunable: CRIMINAL_DAMAGE_DISABLE_SHARE_CASH */) - constexpr static auto score_idx = 114; // AUDIO::PLAY_SOUND_FRONTEND(-1, "Criminal_Damage_High_Value", "GTAO_FM_Events_Soundset", false); + constexpr static auto broadcast_idx = 144; // /* Tunable: CRIMINAL_DAMAGE_DISABLE_SHARE_CASH */) + constexpr static auto score_idx = 139; // AUDIO::PLAY_SOUND_FRONTEND(-1, "Criminal_Damage_High_Value", "GTAO_FM_Events_Soundset", false); } namespace am_cp_collection { - constexpr static auto broadcast_idx = 824; // bVar1 = NETWORK::NETWORK_GET_PLAYER_INDEX(PLAYER::INT_TO_PARTICIPANTINDEX(iVar0)); - constexpr static auto player_broadcast_idx = 3465; // bVar1 = NETWORK::NETWORK_GET_PLAYER_INDEX(PLAYER::INT_TO_PARTICIPANTINDEX(iVar0)); + constexpr static auto broadcast_idx = 849; // bVar1 = NETWORK::NETWORK_GET_PLAYER_INDEX(PLAYER::INT_TO_PARTICIPANTINDEX(iVar0)); + constexpr static auto player_broadcast_idx = 3490; // bVar1 = NETWORK::NETWORK_GET_PLAYER_INDEX(PLAYER::INT_TO_PARTICIPANTINDEX(iVar0)); } namespace am_king_of_the_castle { - constexpr static auto broadcast_idx = 102; // KING_OF_THE_CASTLE_EVENT_TIME_LIMIT + constexpr static auto broadcast_idx = 127; // KING_OF_THE_CASTLE_EVENT_TIME_LIMIT } namespace fmmc_launcher { - constexpr static auto broadcast_idx = 12827; // if (NETWORK::NETWORK_IS_PLAYER_ACTIVE(PLAYER::INT_TO_PLAYERINDEX(Global_ + constexpr static auto broadcast_idx = 12988; // if (NETWORK::NETWORK_IS_PLAYER_ACTIVE(PLAYER::INT_TO_PLAYERINDEX(Global_ } namespace fm_mission_controller { - constexpr static auto mission_controller_wanted_state_flags = 60892; // if (PLAYER::GET_PLAYER_WANTED_LEVEL(bLocal_ + constexpr static auto mission_controller_wanted_state_flags = 61913; // if (PLAYER::GET_PLAYER_WANTED_LEVEL(bLocal_ } namespace freemode { // first uLocal_ in this function call // func_\d+\((&.Local_\d+(, )?){9}\); - inline static script_local mobile(19361); + inline static script_local mobile(19586); } } diff --git a/src/hooking/call_hook.cpp b/src/hooking/call_hook.cpp index e1a9805..698a237 100644 --- a/src/hooking/call_hook.cpp +++ b/src/hooking/call_hook.cpp @@ -9,10 +9,26 @@ namespace namespace big { - call_hook_memory::call_hook_memory() - { - m_memory = VirtualAlloc((void*)((uintptr_t)GetModuleHandle(0) + 0x40000000), 1024, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); - m_offset = 0; + call_hook_memory::call_hook_memory() : + m_memory(nullptr), + m_offset(0) + { + uint8_t* base = static_cast(static_cast(GetModuleHandle(0))); + uint8_t* limit = base + INT32_MAX - 1024; + + for (uint8_t* addr = base; addr < limit; addr += 0x10000) + { + if (m_memory = VirtualAlloc(addr, 1024, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE)) + { + LOGF(VERBOSE, "Allocated call hook memory at {}. Base: {}.", m_memory.as(), static_cast(base)); + break; + } + } + + if (!m_memory) + { + LOG(FATAL) << "Failed to allocate call hook memory!"; + } } call_hook_memory::~call_hook_memory() diff --git a/src/hooking/hooking.hpp b/src/hooking/hooking.hpp index bf4257f..b26ee52 100644 --- a/src/hooking/hooking.hpp +++ b/src/hooking/hooking.hpp @@ -139,7 +139,7 @@ namespace big static int nt_query_virtual_memory(void* _this, HANDLE handle, PVOID base_addr, int info_class, MEMORY_BASIC_INFORMATION* info, int size, size_t* return_len); static int queue_dependency(void* a1, int a2, int64_t dependency); - static bool prepare_metric_for_sending(rage::json_serializer* bit_buffer, int unk, int time, rage::rlMetric* metric); + static bool prepare_metric_for_sending(rage::json_serializer* bit_buffer, bool* failed, char* unk, uint64_t time, rage::rlMetric* metric); static bool http_start_request(void* request, const char* uri); static bool received_array_update(rage::netArrayHandlerBase* array, CNetGamePlayer* sender, rage::datBitBuffer* buffer, int size, int16_t cycle); diff --git a/src/hooks/info/prepare_metric_for_sending.cpp b/src/hooks/info/prepare_metric_for_sending.cpp index 82f560e..e97660c 100644 --- a/src/hooks/info/prepare_metric_for_sending.cpp +++ b/src/hooks/info/prepare_metric_for_sending.cpp @@ -86,7 +86,7 @@ namespace big return result; } - bool hooks::prepare_metric_for_sending(rage::json_serializer* serializer, int unk, int time, rage::rlMetric* metric) + bool hooks::prepare_metric_for_sending(rage::json_serializer* serializer, bool* failed, char* unk, uint64_t time, rage::rlMetric* metric) { char metric_json_buffer [256] {}; rage::json_serializer yim_serializer(metric_json_buffer, sizeof(metric_json_buffer)); @@ -117,7 +117,7 @@ namespace big if (result.size() != data.size()) LOG(INFO) << "Removed YimMenu DLL from MM metric"; strncpy(reinterpret_cast(metric) + 0x18, result.c_str(), 0x900); - return g_hooking->get_original()(serializer, unk, time, metric); + return g_hooking->get_original()(serializer, failed, unk, time, metric); } return true; } @@ -131,6 +131,6 @@ namespace big if (g.debug.block_all_metrics) [[unlikely]] return true; else - return g_hooking->get_original()(serializer, unk, time, metric); + return g_hooking->get_original()(serializer, failed, unk, time, metric); } } diff --git a/src/invoker/invoker.hpp b/src/invoker/invoker.hpp index 128aeb4..ee708f9 100644 --- a/src/invoker/invoker.hpp +++ b/src/invoker/invoker.hpp @@ -36,7 +36,6 @@ namespace big constexpr void end_call() { // TODO: try to get rid of this - [[assume((cache_handlers(), m_are_handlers_cached == true))]] if (!m_are_handlers_cached) [[unlikely]] cache_handlers(); @@ -64,7 +63,6 @@ namespace big static rage::scrNativeHandler* get_handlers() { - [[assume((cache_handlers(), m_are_handlers_cached == true))]] if (!m_are_handlers_cached) [[unlikely]] cache_handlers(); diff --git a/src/lua/lua_manager.cpp b/src/lua/lua_manager.cpp index abcebaa..5821523 100644 --- a/src/lua/lua_manager.cpp +++ b/src/lua/lua_manager.cpp @@ -1,4 +1,3 @@ - #include "lua_manager.hpp" #include "file_manager.hpp" diff --git a/src/main.cpp b/src/main.cpp index dc8ca9b..469daa7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -35,6 +35,8 @@ #include "util/is_proton.hpp" #include "version.hpp" +#include + namespace big { std::string ReadRegistryKeySZ(HKEY hKeyParent, std::string subkey, std::string valueName) @@ -90,6 +92,29 @@ namespace big GlobalFree(UTF16); return UTF8; } + + HMODULE CheckForFSL() + { + HMODULE modules[1024]; + DWORD needed; + + if (!EnumProcessModules(GetCurrentProcess(), modules, sizeof(modules), &needed)) + { + return nullptr; + } + + size_t count = needed / sizeof(HMODULE); + + for (size_t i = 0; i < count; ++i) + { + if (GetProcAddress(modules[i], "LawnchairGetVersion")) + { + return modules[i]; + } + } + + return nullptr; + } } BOOL APIENTRY DllMain(HMODULE hmod, DWORD reason, PVOID) @@ -146,12 +171,19 @@ BOOL APIENTRY DllMain(HMODULE hmod, DWORD reason, PVOID) if (!*g_pointers->m_gta.m_anticheat_initialized_hash) { *g_pointers->m_gta.m_anticheat_initialized_hash = new rage::Obf32; // this doesn't get freed so we don't have to use the game allocator - (*g_pointers->m_gta.m_anticheat_initialized_hash)->setData(0x124EA49D); - } - else - { - (*g_pointers->m_gta.m_anticheat_initialized_hash)->setData(0x124EA49D); } + (*g_pointers->m_gta.m_anticheat_initialized_hash)->setData(0x124EA49D); + + if (HMODULE FSL = CheckForFSL()) + { + LOGF(INFO, "FSL Version: {}", reinterpret_cast(GetProcAddress(FSL, "LawnchairGetVersion"))()); + LOGF(INFO, "FSL Local Saves: {}", reinterpret_cast(GetProcAddress(FSL, "LawnchairIsProvidingLocalSaves"))() ? "Enabled" : "Disabled"); + LOGF(INFO, "FSL BE Bypass: {}", reinterpret_cast(GetProcAddress(FSL, "LawnchairIsProvidingBattlEyeBypass"))() ? "Enabled" : "Disabled"); + } + else + { + LOGF(FATAL, "YimMenu requires FSL to be loaded. Please get it from UnknownCheats.me"); + } auto byte_patch_manager_instance = std::make_unique(); LOG(INFO) << "Byte Patch Manager initialized."; @@ -191,7 +223,7 @@ BOOL APIENTRY DllMain(HMODULE hmod, DWORD reason, PVOID) auto script_connection_service_instance = std::make_unique(); auto xml_vehicles_service_instance = std::make_unique(); auto xml_maps_service_instance = std::make_unique(); - auto script_function_hook_service_instance = std::make_unique(); + auto script_function_hook_service_instance = std::make_unique(); LOG(INFO) << "Registered service instances..."; g_notification_service.initialise(); @@ -285,7 +317,7 @@ BOOL APIENTRY DllMain(HMODULE hmod, DWORD reason, PVOID) LOG(INFO) << "Context Service reset."; xml_vehicles_service_instance.reset(); LOG(INFO) << "Xml Vehicles Service reset."; - script_function_hook_service_instance.reset(); + script_function_hook_service_instance.reset(); LOG(INFO) << "Script Function Hook Service reset."; LOG(INFO) << "Services uninitialized."; diff --git a/src/pointers.cpp b/src/pointers.cpp index f4a3b90..e9a61c8 100644 --- a/src/pointers.cpp +++ b/src/pointers.cpp @@ -3,7 +3,7 @@ #include "gta_pointers_layout_info.hpp" #include "sc_pointers_layout_info.hpp" -#define GTA_VERSION_TARGET "1.72-3788.0" +#define GTA_VERSION_TARGET "1.73-3889.0" namespace big { @@ -640,7 +640,7 @@ namespace big // Handle Join Request { "HJR", - "48 81 EC E8 03 00 00 4C 8B F1", + "48 81 EC 88 03 00 00 4C 8B F1", [](memory::handle ptr) { g_pointers->m_gta.m_handle_join_request = ptr.sub(0x26).as(); @@ -649,10 +649,10 @@ namespace big // Write Join Response Data { "WJRD", - "E8 ? ? ? ? 84 C0 75 0A 44 89 23", + "48 83 C2 34 4C 8B CB", [](memory::handle ptr) { - g_pointers->m_gta.m_write_join_response_data = ptr.add(1).rip().as(); + g_pointers->m_gta.m_write_join_response_data = ptr.add(8).rip().as(); } }, // Queue Packet @@ -694,10 +694,10 @@ namespace big // Serialize Join Request Message 2 { "SJRM2", - "E8 ? ? ? ? 48 8D 8D E0 01 00 00 8A D8", + "48 8D 8D ? ? ? ? 8A D8 E8 ? ? ? ? 48 8D 4D", [](memory::handle ptr) { - g_pointers->m_gta.m_serialize_join_request_message_2 = ptr.add(1).rip().as(); + g_pointers->m_gta.m_serialize_join_request_message_2 = ptr.add(4).rip().as(); } }, // Send Network Damage @@ -928,7 +928,7 @@ namespace big // Prepare Metric For Sending { "PMFS", - "48 8B C4 48 89 58 08 48 89 68 10 48 89 70 18 48 89 78 20 41 56 48 83 EC 30 49 8B F0 4C", + "48 89 5C 24 08 48 89 6C 24 18 56 57 41 56 48 83 EC 20 4D 8B F1 49 8B D8", [](memory::handle ptr) { g_pointers->m_gta.m_prepare_metric_for_sending = ptr.as(); @@ -1763,10 +1763,10 @@ namespace big // Session Request Patch { "SRP", - "41 38 9E 98 B7 00 00 0F 85 6A FE FF FF", + "83 F8 01 0F 97 44 24", [](memory::handle ptr) { - g_pointers->m_gta.m_session_request_patch = ptr.add(0x14).as(); + g_pointers->m_gta.m_session_request_patch = ptr.add(8).as(); } }, // Get Peer By Security Id @@ -1957,10 +1957,10 @@ namespace big // Anticheat Context { "AC", - "69 C9 FD 43 03 00 8B D0", + "89 42 48 89 4A 4C 48 8B 1D", [](memory::handle ptr) { - g_pointers->m_gta.m_anticheat_context = ptr.sub(4).rip().as(); + g_pointers->m_gta.m_anticheat_context = ptr.sub(9).rip().as(); } }, //Get Social Club News diff --git a/src/services/matchmaking/matchmaking_service.cpp b/src/services/matchmaking/matchmaking_service.cpp index 67f846e..31aeba1 100644 --- a/src/services/matchmaking/matchmaking_service.cpp +++ b/src/services/matchmaking/matchmaking_service.cpp @@ -122,23 +122,22 @@ namespace big if (g.session_browser.sort_method != 0) { - std::qsort(m_found_sessions, m_num_sessions_found, sizeof(session), [](const void* a1, const void* a2) -> int { - std::strong_ordering result; + std::sort(m_found_sessions, m_found_sessions + m_num_sessions_found, [](const session& a1, const session& a2) { + std::strong_ordering result = std::strong_ordering::equal; if (g.session_browser.sort_method == 1) { - result = (((session*)(a1))->attributes.player_count <=> ((session*)(a2))->attributes.player_count); + result = a1.attributes.player_count <=> a2.attributes.player_count; } if (result == 0) - return 0; + return false; if (result > 0) - return g.session_browser.sort_direction ? -1 : 1; + return g.session_browser.sort_direction ? true : false; if (result < 0) - return g.session_browser.sort_direction ? 1 : -1; - + return g.session_browser.sort_direction ? false : true; std::unreachable(); }); diff --git a/src/services/mobile/mobile_service.cpp b/src/services/mobile/mobile_service.cpp index b1b5a90..d05b926 100644 --- a/src/services/mobile/mobile_service.cpp +++ b/src/services/mobile/mobile_service.cpp @@ -13,42 +13,45 @@ namespace big { switch (property) { - case 0: return 13 * 0; - case 1: return 13 * 1; - case 2: return 13 * 2; - case 3: return 13 * 3; - case 4: return 13 * 4; - //Property 5 is not used. - case 6: return 65; - case 7: return 75; - case 8: return 88; - case 9: return 108; - case 10: return 128; - case 11: return 148; - case 12: return 159; - case 13: return 179; - case 14: return 191; - case 15: return 192; - case 16: return 202; - case 17: return 212; - case 18: return 227; - case 19: return 237; - case 20: return 247; - case 21: return 258; - case 22: return 268; - case 23: return 281; - case 24: return 294; - case 25: return 307; - case 26: return 317; - case 27: return 337; - case 28: return 350; - case 29: return 363; - case 31: return 515; - case 32: return 537; - case MAX_GARAGE_NUM + 0: return 156; //Mobile Operations Center - case MAX_GARAGE_NUM + 1: return 224; //Nightclub B1 - case MAX_GARAGE_NUM + 2: return 223; //Terrorbyte - case MAX_GARAGE_NUM + 3: return 278; //Kosatka + case 0: return 13 * 0; + case 1: return 13 * 1; + case 2: return 13 * 2; + case 3: return 13 * 3; + case 4: return 13 * 4; + //Property 5 is not used. + case 6: return 65; + case 7: return 75; + case 8: return 88; + case 9: return 108; + case 10: return 128; + case 11: return 148; + case 12: return 159; + case 13: return 179; + case 14: return 191; + case 15: return 192; + case 16: return 202; + case 17: return 212; + case 18: return 227; + case 19: return 237; + case 20: return 247; + case 21: return 258; + case 22: return 268; + case 23: return 281; + case 24: return 294; + case 25: return 307; + case 26: return 317; + case 27: return 337; + case 28: return 350; + case 29: return 363; + case 31: return 515; + case 32: return 537; + case 33: return 547; + case 34: return 567; + case 35: return 587; + case MAX_GARAGE_NUM+0: return 156; //Mobile Operations Center + case MAX_GARAGE_NUM+1: return 224; //Nightclub B1 + case MAX_GARAGE_NUM+2: return 223; //Terrorbyte + case MAX_GARAGE_NUM+3: return 278; //Kosatka } return -1; } @@ -57,41 +60,45 @@ namespace big { switch (property) { - case MAX_GARAGE_NUM + 0: //Mobile Operations Center - case MAX_GARAGE_NUM + 2: //Terrorbyte - case MAX_GARAGE_NUM + 3: //Kosatka - case 14: return 1; - case 31: return 2; - case MAX_GARAGE_NUM + 1: return 3; //Nightclub B1 - case 11: return 8; - case 6: - case 15: - case 16: - case 17: - case 18: - case 19: - case 20: - case 21: - case 22: - case 32: - case 25: return 10; - case 13: return 11; - case 0: - case 1: - case 2: - case 3: - case 4: - case 7: - case 23: - case 24: - case 27: - case 28: return 13; - case 8: - case 9: - case 10: - case 12: - case 26: return 20; - case 29: return 50; + case MAX_GARAGE_NUM+0: //Mobile Operations Center + case MAX_GARAGE_NUM+2: //Terrorbyte + case MAX_GARAGE_NUM+3: //Kosatka + case 14: return 1; + case 31: return 2; + case MAX_GARAGE_NUM+1: return 3; //Nightclub B1 + case 11: return 8; + case 6: + case 15: + case 16: + case 17: + case 18: + case 19: + case 20: + case 21: + case 22: + case 32: + case 25: return 10; + case 13: return 11; + case 0: + case 1: + case 2: + case 3: + case 4: + case 7: + case 23: + case 24: + case 27: + case 28: return 13; + case 8: + case 9: + case 10: + case 12: + case 26: return 20; + case 29: return 50; + // mansions + case 33: + case 34: + case 35: return 20; } return -1; } @@ -101,43 +108,46 @@ namespace big Hash stat = NULL; switch (property) { - case 0: stat = self::char_index ? "MP1_PROPERTY_HOUSE"_J : "MP0_PROPERTY_HOUSE"_J; break; - case 1: stat = self::char_index ? "MP1_MULTI_PROPERTY_1"_J : "MP0_MULTI_PROPERTY_1"_J; break; - case 2: stat = self::char_index ? "MP1_MULTI_PROPERTY_2"_J : "MP0_MULTI_PROPERTY_2"_J; break; - case 3: stat = self::char_index ? "MP1_MULTI_PROPERTY_3"_J : "MP0_MULTI_PROPERTY_3"_J; break; - case 4: stat = self::char_index ? "MP1_MULTI_PROPERTY_4"_J : "MP0_MULTI_PROPERTY_4"_J; break; - case 5: stat = self::char_index ? "MP1_PROP_OFFICE"_J : "MP0_PROP_OFFICE"_J; break; - case 6: stat = self::char_index ? "MP1_PROP_CLUBHOUSE"_J : "MP0_PROP_CLUBHOUSE"_J; break; - case 7: stat = self::char_index ? "MP1_MULTI_PROPERTY_5"_J : "MP0_MULTI_PROPERTY_5"_J; break; - case 8: stat = self::char_index ? "MP1_PROP_OFFICE_GAR1"_J : "MP0_PROP_OFFICE_GAR1"_J; break; - case 9: stat = self::char_index ? "MP1_PROP_OFFICE_GAR2"_J : "MP0_PROP_OFFICE_GAR2"_J; break; - case 10: stat = self::char_index ? "MP1_PROP_OFFICE_GAR3"_J : "MP0_PROP_OFFICE_GAR3"_J; break; - case 11: stat = self::char_index ? "MP1_PROP_IE_WAREHOUSE"_J : "MP0_PROP_IE_WAREHOUSE"_J; break; - case 12: stat = self::char_index ? "MP1_PROP_HANGAR"_J : "MP0_PROP_HANGAR"_J; break; - case 13: stat = self::char_index ? "MP1_PROP_DEFUNCBASE"_J : "MP0_PROP_DEFUNCBASE"_J; break; - case 14: stat = self::char_index ? "MP1_PROP_NIGHTCLUB"_J : "MP0_PROP_NIGHTCLUB"_J; break; - case 15: stat = self::char_index ? "MP1_PROP_MEGAWARE_GAR1"_J : "MP0_PROP_MEGAWARE_GAR1"_J; break; - case 16: stat = self::char_index ? "MP1_PROP_MEGAWARE_GAR2"_J : "MP0_PROP_MEGAWARE_GAR2"_J; break; - case 17: stat = self::char_index ? "MP1_PROP_MEGAWARE_GAR3"_J : "MP0_PROP_MEGAWARE_GAR3"_J; break; - case 18: stat = self::char_index ? "MP1_PROP_ARENAWARS_GAR1"_J : "MP0_PROP_ARENAWARS_GAR1"_J; break; - case 19: stat = self::char_index ? "MP1_PROP_ARENAWARS_GAR2"_J : "MP0_PROP_ARENAWARS_GAR2"_J; break; - case 20: stat = self::char_index ? "MP1_PROP_ARENAWARS_GAR3"_J : "MP0_PROP_ARENAWARS_GAR3"_J; break; - case 21: stat = self::char_index ? "MP1_PROP_CASINO_GAR1"_J : "MP0_PROP_CASINO_GAR1"_J; break; - case 22: stat = self::char_index ? "MP1_PROP_ARCADE_GAR1"_J : "MP0_PROP_ARCADE_GAR1"_J; break; - case 23: stat = self::char_index ? "MP1_MULTI_PROPERTY_6"_J : "MP0_MULTI_PROPERTY_6"_J; break; - case 24: stat = self::char_index ? "MP1_MULTI_PROPERTY_7"_J : "MP0_MULTI_PROPERTY_7"_J; break; - case 25: stat = self::char_index ? "MP1_PROP_AUTO_SHOP"_J : "MP0_PROP_AUTO_SHOP"_J; break; - case 26: stat = self::char_index ? "MP1_PROP_SECURITY_OFFICE_GAR"_J : "MP0_PROP_SECURITY_OFFICE_GAR"_J; break; - case 27: stat = self::char_index ? "MP1_MULTI_PROPERTY_8"_J : "MP0_MULTI_PROPERTY_8"_J; break; - case 28: stat = self::char_index ? "MP1_MULTI_PROPERTY_9"_J : "MP0_MULTI_PROPERTY_9"_J; break; - case 29: stat = self::char_index ? "MP1_MULTSTOREY_GAR_OWNED"_J : "MP0_MULTSTOREY_GAR_OWNED"_J; break; - case 31: stat = self::char_index ? "MP1_PROP_BAIL_OFFICE"_J : "MP0_PROP_BAIL_OFFICE"_J; break; - case 32: stat = self::char_index ? "MP1_PROP_HACKER_DEN"_J : "MP0_PROP_HACKER_DEN"_J; break; - case MAX_GARAGE_NUM + 0: - case MAX_GARAGE_NUM + 1: - case MAX_GARAGE_NUM + 2: - case MAX_GARAGE_NUM + 3: return 1; - default: return -1; + case 0: stat = self::char_index ? "MP1_PROPERTY_HOUSE"_J : "MP0_PROPERTY_HOUSE"_J; break; + case 1: stat = self::char_index ? "MP1_MULTI_PROPERTY_1"_J : "MP0_MULTI_PROPERTY_1"_J; break; + case 2: stat = self::char_index ? "MP1_MULTI_PROPERTY_2"_J : "MP0_MULTI_PROPERTY_2"_J; break; + case 3: stat = self::char_index ? "MP1_MULTI_PROPERTY_3"_J : "MP0_MULTI_PROPERTY_3"_J; break; + case 4: stat = self::char_index ? "MP1_MULTI_PROPERTY_4"_J : "MP0_MULTI_PROPERTY_4"_J; break; + case 5: stat = self::char_index ? "MP1_PROP_OFFICE"_J : "MP0_PROP_OFFICE"_J; break; + case 6: stat = self::char_index ? "MP1_PROP_CLUBHOUSE"_J : "MP0_PROP_CLUBHOUSE"_J; break; + case 7: stat = self::char_index ? "MP1_MULTI_PROPERTY_5"_J : "MP0_MULTI_PROPERTY_5"_J; break; + case 8: stat = self::char_index ? "MP1_PROP_OFFICE_GAR1"_J : "MP0_PROP_OFFICE_GAR1"_J; break; + case 9: stat = self::char_index ? "MP1_PROP_OFFICE_GAR2"_J : "MP0_PROP_OFFICE_GAR2"_J; break; + case 10: stat = self::char_index ? "MP1_PROP_OFFICE_GAR3"_J : "MP0_PROP_OFFICE_GAR3"_J; break; + case 11: stat = self::char_index ? "MP1_PROP_IE_WAREHOUSE"_J : "MP0_PROP_IE_WAREHOUSE"_J; break; + case 12: stat = self::char_index ? "MP1_PROP_HANGAR"_J : "MP0_PROP_HANGAR"_J; break; + case 13: stat = self::char_index ? "MP1_PROP_DEFUNCBASE"_J : "MP0_PROP_DEFUNCBASE"_J; break; + case 14: stat = self::char_index ? "MP1_PROP_NIGHTCLUB"_J : "MP0_PROP_NIGHTCLUB"_J; break; + case 15: stat = self::char_index ? "MP1_PROP_MEGAWARE_GAR1"_J : "MP0_PROP_MEGAWARE_GAR1"_J; break; + case 16: stat = self::char_index ? "MP1_PROP_MEGAWARE_GAR2"_J : "MP0_PROP_MEGAWARE_GAR2"_J; break; + case 17: stat = self::char_index ? "MP1_PROP_MEGAWARE_GAR3"_J : "MP0_PROP_MEGAWARE_GAR3"_J; break; + case 18: stat = self::char_index ? "MP1_PROP_ARENAWARS_GAR1"_J : "MP0_PROP_ARENAWARS_GAR1"_J; break; + case 19: stat = self::char_index ? "MP1_PROP_ARENAWARS_GAR2"_J : "MP0_PROP_ARENAWARS_GAR2"_J; break; + case 20: stat = self::char_index ? "MP1_PROP_ARENAWARS_GAR3"_J : "MP0_PROP_ARENAWARS_GAR3"_J; break; + case 21: stat = self::char_index ? "MP1_PROP_CASINO_GAR1"_J : "MP0_PROP_CASINO_GAR1"_J; break; + case 22: stat = self::char_index ? "MP1_PROP_ARCADE_GAR1"_J : "MP0_PROP_ARCADE_GAR1"_J; break; + case 23: stat = self::char_index ? "MP1_MULTI_PROPERTY_6"_J : "MP0_MULTI_PROPERTY_6"_J; break; + case 24: stat = self::char_index ? "MP1_MULTI_PROPERTY_7"_J : "MP0_MULTI_PROPERTY_7"_J; break; + case 25: stat = self::char_index ? "MP1_PROP_AUTO_SHOP"_J : "MP0_PROP_AUTO_SHOP"_J; break; + case 26: stat = self::char_index ? "MP1_PROP_SECURITY_OFFICE_GAR"_J : "MP0_PROP_SECURITY_OFFICE_GAR"_J; break; + case 27: stat = self::char_index ? "MP1_MULTI_PROPERTY_8"_J : "MP0_MULTI_PROPERTY_8"_J; break; + case 28: stat = self::char_index ? "MP1_MULTI_PROPERTY_9"_J : "MP0_MULTI_PROPERTY_9"_J; break; + case 29: stat = self::char_index ? "MP1_MULTSTOREY_GAR_OWNED"_J : "MP0_MULTSTOREY_GAR_OWNED"_J; break; + case 31: stat = self::char_index ? "MP1_PROP_BAIL_OFFICE"_J : "MP0_PROP_BAIL_OFFICE"_J; break; + case 32: stat = self::char_index ? "MP1_PROP_HACKER_DEN"_J : "MP0_PROP_HACKER_DEN"_J; break; + case 33: stat = self::char_index ? "MP1_MANSION_TH_OWNED"_J : "MP0_MANSION_TH_OWNED"_J; break; + case 34: stat = self::char_index ? "MP1_MANSION_AJ_OWNED"_J : "MP0_MANSION_AJ_OWNED"_J; break; + case 35: stat = self::char_index ? "MP1_MANSION_MD_OWNED"_J : "MP0_MANSION_MD_OWNED"_J; break; + case MAX_GARAGE_NUM+0: + case MAX_GARAGE_NUM+1: + case MAX_GARAGE_NUM+2: + case MAX_GARAGE_NUM+3: return 1; + default: return -1; } if (stat == NULL) { @@ -155,77 +165,80 @@ namespace big { switch (property) { - case 12: //Hangar - { - auto hangar_id = *scr_globals::gpbd_fm_1.at(self::id, 880).at(260).at(304).as(); - switch (hangar_id) + case 12: //Hangar { - case 1: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_HANGAR_1"); //LSIA Hangar 1 - case 2: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_HANGAR_2"); //LSIA Hangar A17 - case 3: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_HANGAR_3"); //Fort Zancudo Hangar A2 - case 4: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_HANGAR_4"); //Fort Zancudo Hangar 3497 - case 5: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_HANGAR_5"); //Fort Zancudo Hangar 3499 + auto hangar_id = *scr_globals::gpbd_fm_1.at(self::id, 881).at(260).at(304).as(); + switch (hangar_id) + { + case 1: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_HANGAR_1"); //LSIA Hangar 1 + case 2: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_HANGAR_2"); //LSIA Hangar A17 + case 3: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_HANGAR_3"); //Fort Zancudo Hangar A2 + case 4: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_HANGAR_4"); //Fort Zancudo Hangar 3497 + case 5: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_HANGAR_5"); //Fort Zancudo Hangar 3499 + } + break; } - break; - } - case 13: //Facility - { - auto facility_id = *scr_globals::gpbd_fm_1.at(self::id, 880).at(260).at(311).as(); - switch (facility_id) + case 13: //Facility { - case 1: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_DBASE_1"); //Grand Senora Desert Facility - case 2: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_DBASE_2"); //Route 68 Facility - case 3: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_DBASE_3"); //Sandy Shores Facility - case 4: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_DBASE_4"); //Mount Gordo Facility - case 5: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_DBASE_6"); //Paleto Bay Facility - case 6: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_DBASE_7"); //Lago Zancudo Facility - case 7: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_DBASE_8"); //Zancudo River Facility - case 8: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_DBASE_9"); //Ron Alternates Wind Farm Facility - case 9: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_DBASE_10"); //Land Act Reservoir Facility + auto facility_id = *scr_globals::gpbd_fm_1.at(self::id, 881).at(260).at(311).as(); + switch (facility_id) + { + case 1: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_DBASE_1"); //Grand Senora Desert Facility + case 2: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_DBASE_2"); //Route 68 Facility + case 3: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_DBASE_3"); //Sandy Shores Facility + case 4: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_DBASE_4"); //Mount Gordo Facility + case 5: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_DBASE_6"); //Paleto Bay Facility + case 6: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_DBASE_7"); //Lago Zancudo Facility + case 7: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_DBASE_8"); //Zancudo River Facility + case 8: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_DBASE_9"); //Ron Alternates Wind Farm Facility + case 9: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_DBASE_10"); //Land Act Reservoir Facility + } + break; } - break; - } - case 14: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_BHUB_CLUBG"); //Nightclub Service Entrance - case 15: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_BHUB_GAR1"); //Nightclub B2 - case 16: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_BHUB_GAR2"); //Nightclub B3 - case 17: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_BHUB_GAR3"); //Nightclub B4 - case 18: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("ARENA_GAR_F0"); //Arena Workshop - case 19: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("ARENA_GAR_F1"); //Arena Workshop B1 - case 20: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("ARENA_GAR_F2"); //Arena Workshop B2 - case 21: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("CASINO_GARNAME"); //Casino Penthouse - case 22: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("ARCADE_GARNAME"); //Arcade - case 25: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("AUT_SHP_GAR"); //Auto Shop - case 26: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("FIXER_GARNAME"); //Agency - case 29: - { - int garage_level = (garage_slot_iterator - 1) / 10; - switch (garage_level) + case 14: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_BHUB_CLUBG"); //Nightclub Service Entrance + case 15: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_BHUB_GAR1"); //Nightclub B2 + case 16: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_BHUB_GAR2"); //Nightclub B3 + case 17: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_BHUB_GAR3"); //Nightclub B4 + case 18: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("ARENA_GAR_F0"); //Arena Workshop + case 19: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("ARENA_GAR_F1"); //Arena Workshop B1 + case 20: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("ARENA_GAR_F2"); //Arena Workshop B2 + case 21: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("CASINO_GARNAME"); //Casino Penthouse + case 22: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("ARCADE_GARNAME"); //Arcade + case 25: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("AUT_SHP_GAR"); //Auto Shop + case 26: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("FIXER_GARNAME"); //Agency + case 29: { - case 0: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MSG_B1"); //Eclipse Blvd Garage B1 - case 1: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MSG_B2"); //Eclipse Blvd Garage B2 - case 2: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MSG_B3"); //Eclipse Blvd Garage B3 - case 3: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MSG_B4"); //Eclipse Blvd Garage B4 - case 4: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MSG_B5"); //Eclipse Blvd Garage B5 + int garage_level = (garage_slot_iterator - 1) / 10; + switch (garage_level) + { + case 0: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MSG_B1"); //Eclipse Blvd Garage B1 + case 1: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MSG_B2"); //Eclipse Blvd Garage B2 + case 2: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MSG_B3"); //Eclipse Blvd Garage B3 + case 3: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MSG_B4"); //Eclipse Blvd Garage B4 + case 4: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MSG_B5"); //Eclipse Blvd Garage B5 + } } - } - case 31: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("BO_GARNAME"); //Bail Office - case 32: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("HD_GARNAME"); //Garment Factory - case MAX_GARAGE_NUM + 0: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("GRTRUCK"); //Mobile Operations Center - case MAX_GARAGE_NUM + 1: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_BHUB_GAR0"); //Nightclub B1 - case MAX_GARAGE_NUM + 2: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_BHUB_CLUBT"); //Terrorbyte - case MAX_GARAGE_NUM + 3: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_BHUB_SUB"); //Kosatka + case 31: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("BO_GARNAME"); //Bail Office + case 32: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("HD_GARNAME"); //Garment Factory + case 33: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MG1_GARNAME"); //The Tongva Estate + case 34: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MG2_GARNAME"); //Richman Villa + case 35: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MG3_GARNAME"); //The Vinewood Residence + case MAX_GARAGE_NUM+0: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("GRTRUCK"); //Mobile Operations Center + case MAX_GARAGE_NUM+1: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_BHUB_GAR0"); //Nightclub B1 + case MAX_GARAGE_NUM+2: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_BHUB_CLUBT"); //Terrorbyte + case MAX_GARAGE_NUM+3: return HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION("MP_BHUB_SUB"); //Kosatka } return std::string(); } void personal_vehicle::set_garage() { - for (int property_iterator = 0; property_iterator < MAX_GARAGE_NUM + 4; property_iterator++) + for (int property_iterator = 0; property_iterator < MAX_GARAGE_NUM+4; property_iterator++) { auto property_stat_state = get_property_stat_state(property_iterator); if (property_stat_state > 0) //Check if the player owns the property { - auto garage_size = get_property_garage_size(property_iterator); + auto garage_size = get_property_garage_size(property_iterator); auto garage_offset = get_property_garage_offset(property_iterator); for (int garage_slot_iterator = 1; garage_slot_iterator <= garage_size; garage_slot_iterator++) { @@ -235,8 +248,7 @@ namespace big auto static_property_string = get_static_property_name(property_iterator, garage_slot_iterator); if (static_property_string.empty()) { - m_garage = HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION( - scr_globals::property_names.at(property_stat_state, 1951).at(16).as()); + m_garage = HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION(scr_globals::property_names.at(property_stat_state, 1951).at(16).as()); } else { @@ -250,11 +262,11 @@ namespace big } personal_vehicle::personal_vehicle(int idx, script_global vehicle_idx) : - m_id(idx), - m_vehicle_idx(vehicle_idx) + m_id(idx), + m_vehicle_idx(vehicle_idx) { - m_plate = m_vehicle_idx.at(1).as(); - m_hash = *m_vehicle_idx.at(66).as(); + m_plate = m_vehicle_idx.at(1).as(); + m_hash = *m_vehicle_idx.at(66).as(); set_garage(); m_name = std::format("{} ({})", HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION(VEHICLE::GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(m_hash)), m_plate); @@ -304,23 +316,24 @@ namespace big { switch (m_hash) { - case "avenger"_J: - case "avenger3"_J: - case "hauler2"_J: - case "phantom3"_J: - case "trailersmall2"_J: - case "khanjali"_J: - case "chernobog"_J: - case "riot2"_J: - case "thruster"_J: - case "brickade2"_J: - case "manchez3"_J: - case "terbyte"_J: - case "speedo4"_J: - case "mule4"_J: - case "pounder2"_J: - case "rcbandito"_J: - case "minitank"_J: return !g.clone_pv.spawn_clone; + case "avenger"_J: + case "avenger3"_J: + case "hauler2"_J: + case "phantom3"_J: + case "trailersmall2"_J: + case "khanjali"_J: + case "chernobog"_J: + case "riot2"_J: + case "thruster"_J: + case "brickade2"_J: + case "manchez3"_J: + case "terbyte"_J: + case "speedo4"_J: + case "mule4"_J: + case "pounder2"_J: + case "rcbandito"_J: + case "minitank"_J: + return !g.clone_pv.spawn_clone; } return false; } @@ -339,9 +352,7 @@ namespace big { const auto now = std::chrono::high_resolution_clock::now(); if (std::chrono::duration_cast(now - m_last_update) < 10s) - { return; - } m_last_update = std::chrono::high_resolution_clock::now(); g_fiber_pool->queue_job([this] { @@ -356,9 +367,7 @@ namespace big for (int i = 0; i < array_size; i++) { if (i % 100 == 0) - { script::get_current()->yield(); - } auto veh_idx_global = scr_globals::vehicle_global.at(i, 143); @@ -389,8 +398,8 @@ namespace big continue; } - m_pv_lookup.emplace(i, veh->get_display_name()); // update lookup table - m_personal_vehicles.emplace(veh->get_display_name(), std::move(veh)); // add new vehicle + m_pv_lookup.emplace(i, veh->get_display_name()); // update lookup table + m_personal_vehicles.emplace(veh->get_display_name(), std::move(veh));// add new vehicle continue; }