From 74c39312097761270535e682da655137109a9143 Mon Sep 17 00:00:00 2001 From: "Quentin E. / iDeath" Date: Fri, 14 Apr 2023 18:54:07 +0200 Subject: [PATCH] Feat ptr cache continued (#1227) --- .../commands/player/kick/bail_kick.cpp | 2 +- .../commands/player/kick/breakup_kick.cpp | 12 +- .../player/kick/null_function_kick.cpp | 2 +- .../commands/player/misc/enter_interior.cpp | 2 +- .../commands/player/toxic/ceo_kick.cpp | 4 +- .../player/toxic/force_into_mission.cpp | 2 +- .../player/toxic/kick_from_interior.cpp | 2 +- .../player/toxic/kick_from_vehicle.cpp | 4 +- .../commands/player/toxic/kill_player.cpp | 2 +- .../commands/player/toxic/ragdoll_player.cpp | 2 +- .../player/toxic/send_fake_ban_message.cpp | 2 +- .../commands/player/toxic/send_sext.cpp | 2 +- .../player/toxic/send_to_apartment.cpp | 2 +- .../player/toxic/send_to_interior.cpp | 2 +- .../commands/player/toxic/send_to_island.cpp | 2 +- .../player/toxic/send_to_warehouse.cpp | 2 +- .../player/toxic/show_transaction_error.cpp | 2 +- .../commands/player/toxic/start_script.cpp | 4 +- .../player/toxic/trigger_ceo_raid.cpp | 2 +- .../teleport/teleport_to_last_vehicle.cpp | 2 +- src/backend/context/chat_command_context.cpp | 2 +- src/backend/looped/player/good_options.cpp | 10 +- src/backend/looped/player/toxic_options.cpp | 10 +- src/backend/looped/self/dance_mode.cpp | 2 +- src/backend/looped/self/police.cpp | 9 +- src/backend/looped/session/auto_kick_host.cpp | 2 +- src/backend/looped/session/block_jobs.cpp | 4 +- src/backend/looped/session/force_thunder.cpp | 4 +- .../looped/session/pop_multiplier_areas.cpp | 2 +- .../looped/session/randomize_ceo_colors.cpp | 2 +- .../looped/system/desync_kick_protection.cpp | 4 +- src/backend/looped/system/self_globals.cpp | 6 +- src/backend/looped/system/spoofing.cpp | 12 +- .../looped/system/voice_chat_audio.cpp | 4 +- src/backend/looped/vehicle/no_collision.cpp | 5 +- src/backend/looped/world/spawn_ped.cpp | 6 +- src/backend/reactions/interloper_reaction.cpp | 2 +- src/backend/reactions/reaction.cpp | 2 +- src/backend/script_patches.hpp | 2 +- src/byte_patch_manager.cpp | 83 + src/byte_patch_manager.hpp | 15 + src/gta/fidevice.cpp | 4 +- src/gta/fidevice.hpp | 2 +- src/gta/net_array.hpp | 11 +- src/gta/net_game_event.hpp | 28 +- src/gta/net_object_mgr.hpp | 2 +- src/gta/script_handler.cpp | 2 +- src/gta_pointers.hpp | 260 ++ src/gta_pointers_layout_info.hpp | 13 + src/gta_util.hpp | 16 +- src/gui/components/nav_button.cpp | 2 +- src/hooking.cpp | 120 +- src/hooks/info/get_network_event_data.cpp | 4 +- src/hooks/misc/queue_dependency.cpp | 2 +- .../assign_physical_index.cpp | 2 +- src/hooks/protections/can_apply_data.cpp | 4 +- src/hooks/protections/handle_join_request.cpp | 2 +- .../protections/infinite_train_crash.cpp | 4 +- src/hooks/protections/receive_net_message.cpp | 2 +- src/hooks/protections/received_clone_sync.cpp | 2 +- src/hooks/protections/received_event.cpp | 40 +- .../serialize_vehicle_gadget_data_node.cpp | 2 +- src/hooks/script/script_vm.cpp | 4 +- src/hooks/toxic/broadcast_net_array.cpp | 16 +- src/invoker.cpp | 6 +- src/main.cpp | 10 +- src/memory/all.hpp | 1 + src/memory/batch.cpp | 60 - src/memory/batch.hpp | 123 +- src/memory/fwddec.hpp | 1 + src/memory/signature.hpp | 11 + src/native_hooks/native_hooks.cpp | 4 +- src/native_hooks/network_session_host.hpp | 2 +- src/packet.cpp | 6 +- src/pointers.cpp | 2356 ++++++++++------- src/pointers.hpp | 364 +-- src/renderer.cpp | 2 +- src/sc_pointers.hpp | 15 + src/sc_pointers_layout_info.hpp | 13 + src/script_function.cpp | 4 +- src/script_global.cpp | 2 +- src/services/api/api_service.hpp | 2 +- .../context_menu/context_menu_service.cpp | 10 +- .../creator_storage_service.cpp | 6 +- src/services/friends/friends_service.cpp | 4 +- src/services/gta_data/cache_file.cpp | 15 +- src/services/gta_data/cache_file.hpp | 10 +- src/services/gta_data/gta_data_service.cpp | 4 +- src/services/gta_data/yim_fipackfile.cpp | 12 +- src/services/hotkey/hotkey_service.cpp | 2 +- src/services/orbital_drone/orbital_drone.cpp | 8 +- src/services/pickups/pickup_service.cpp | 12 +- .../player_database_service.cpp | 2 +- src/services/players/player.cpp | 4 +- src/services/vehicle/persist_car_service.cpp | 12 +- .../vehicle/vehicle_control_service.cpp | 4 +- src/util/compile_time_helpers.hpp | 16 + src/util/entity.hpp | 18 +- src/util/globals.hpp | 4 +- src/util/math.hpp | 2 +- src/util/model_info.hpp | 2 +- src/util/notify.hpp | 2 +- src/util/ped.hpp | 2 +- src/util/police.hpp | 10 + src/util/session.hpp | 4 +- src/util/system.hpp | 2 +- src/util/teleport.hpp | 8 +- src/util/toxic.hpp | 39 +- src/util/train.hpp | 4 +- src/util/troll.hpp | 2 +- src/util/vehicle.hpp | 11 +- src/util/world_model.hpp | 6 +- src/views/core/view_active_view.cpp | 2 +- src/views/core/view_cmd_executor.cpp | 4 +- src/views/core/view_notifications.cpp | 10 +- src/views/core/view_overlay.cpp | 5 +- src/views/debug/view_debug_misc.cpp | 6 +- src/views/debug/view_debug_script_events.cpp | 2 +- src/views/debug/view_debug_threads.cpp | 6 +- src/views/esp/view_esp.cpp | 10 +- src/views/network/view_player_database.cpp | 4 +- src/views/network/view_session.cpp | 10 +- src/views/network/view_session_browser.cpp | 6 +- src/views/network/view_spoofing.cpp | 6 +- src/views/players/view_players.cpp | 4 +- src/views/self/view_mobile.cpp | 2 +- src/views/self/view_outfit_slots.cpp | 2 +- src/views/settings/view_gta_cache.cpp | 2 +- src/views/vehicle/view_pv.cpp | 4 +- src/views/vehicle/view_spawn_vehicle.cpp | 4 +- src/views/view_context_menu.cpp | 6 +- src/views/view_gta_data.cpp | 4 +- src/views/world/view_model_swapper.cpp | 2 +- src/views/world/view_spawn_ped.cpp | 6 +- 134 files changed, 2490 insertions(+), 1624 deletions(-) create mode 100644 src/byte_patch_manager.cpp create mode 100644 src/byte_patch_manager.hpp create mode 100644 src/gta_pointers.hpp create mode 100644 src/gta_pointers_layout_info.hpp delete mode 100644 src/memory/batch.cpp create mode 100644 src/memory/signature.hpp create mode 100644 src/sc_pointers.hpp create mode 100644 src/sc_pointers_layout_info.hpp create mode 100644 src/util/compile_time_helpers.hpp create mode 100644 src/util/police.hpp diff --git a/src/backend/commands/player/kick/bail_kick.cpp b/src/backend/commands/player/kick/bail_kick.cpp index cd29a0be..4ae9fb34 100644 --- a/src/backend/commands/player/kick/bail_kick.cpp +++ b/src/backend/commands/player/kick/bail_kick.cpp @@ -23,7 +23,7 @@ namespace big (int64_t)self::id, scr_globals::gpbd_fm_3.as()->Entries[player->id()].ScriptEventReplayProtectionCounter}; - g_pointers->m_trigger_script_event(1, args, arg_count, 1 << player->id()); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << player->id()); } }; diff --git a/src/backend/commands/player/kick/breakup_kick.cpp b/src/backend/commands/player/kick/breakup_kick.cpp index d55e716f..b0df8308 100644 --- a/src/backend/commands/player/kick/breakup_kick.cpp +++ b/src/backend/commands/player/kick/breakup_kick.cpp @@ -30,22 +30,22 @@ namespace big if (gta_util::get_network()->m_game_session.is_host()) { - g_pointers->m_handle_remove_gamer_cmd(gta_util::get_network()->m_game_session_ptr, player->get_session_player(), &cmd); + g_pointers->m_gta.m_handle_remove_gamer_cmd(gta_util::get_network()->m_game_session_ptr, player->get_session_player(), &cmd); } else if (player->is_host()) { for (auto& [_, plyr] : g_player_service->players()) { if (plyr->id() != player->id()) - g_pointers->m_send_remove_gamer_cmd(gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr, - g_pointers->m_get_connection_peer(gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr, + g_pointers->m_gta.m_send_remove_gamer_cmd(gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr, + g_pointers->m_gta.m_get_connection_peer(gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr, (int)plyr->get_session_player()->m_player_data.m_peer_id_2), gta_util::get_network()->m_game_session_ptr->m_connection_identifier, &cmd, 0x1000000); } - g_pointers->m_handle_remove_gamer_cmd(gta_util::get_network()->m_game_session_ptr, player->get_session_player(), &cmd); + g_pointers->m_gta.m_handle_remove_gamer_cmd(gta_util::get_network()->m_game_session_ptr, player->get_session_player(), &cmd); } else { @@ -53,8 +53,8 @@ namespace big { if (plyr->is_host()) { - g_pointers->m_send_remove_gamer_cmd(gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr, - g_pointers->m_get_connection_peer(gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr, + g_pointers->m_gta.m_send_remove_gamer_cmd(gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr, + g_pointers->m_gta.m_get_connection_peer(gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr, (int)plyr->get_session_player()->m_player_data.m_peer_id_2), gta_util::get_network()->m_game_session_ptr->m_connection_identifier, &cmd, diff --git a/src/backend/commands/player/kick/null_function_kick.cpp b/src/backend/commands/player/kick/null_function_kick.cpp index 58d07bc2..69a90a83 100644 --- a/src/backend/commands/player/kick/null_function_kick.cpp +++ b/src/backend/commands/player/kick/null_function_kick.cpp @@ -19,7 +19,7 @@ namespace big const size_t arg_count = 15; int64_t args[arg_count] = {(int64_t)eRemoteEvent::InteriorControl, (int64_t)self::id, (int64_t)(int)-1}; - g_pointers->m_trigger_script_event(1, args, arg_count, 1 << player->id()); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << player->id()); } }; diff --git a/src/backend/commands/player/misc/enter_interior.cpp b/src/backend/commands/player/misc/enter_interior.cpp index 0cbea117..2a3e1429 100644 --- a/src/backend/commands/player/misc/enter_interior.cpp +++ b/src/backend/commands/player/misc/enter_interior.cpp @@ -29,7 +29,7 @@ namespace big 0, 1}; - g_pointers->m_trigger_script_event(1, args, arg_count, 1 << self::id); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << self::id); } else if (scr_globals::globalplayer_bd.as()->Entries[id].SimpleInteriorData.Index != eSimpleInteriorIndex::SIMPLE_INTERIOR_INVALID) { diff --git a/src/backend/commands/player/toxic/ceo_kick.cpp b/src/backend/commands/player/toxic/ceo_kick.cpp index 5e5d8244..b7f8a459 100644 --- a/src/backend/commands/player/toxic/ceo_kick.cpp +++ b/src/backend/commands/player/toxic/ceo_kick.cpp @@ -26,7 +26,7 @@ namespace big const size_t arg_count = 2; int64_t args[arg_count] = {(int64_t)eRemoteEvent::CeoKick, (int64_t)self::id}; - g_pointers->m_trigger_script_event(1, args, arg_count, 1 << player->id()); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << player->id()); return; } else @@ -35,7 +35,7 @@ namespace big const size_t arg_count = 3; int64_t args[arg_count] = {(int64_t)eRemoteEvent::MarkPlayerAsBeast, (int64_t)self::id, leader}; - g_pointers->m_trigger_script_event(1, args, arg_count, 1 << player->id()); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << player->id()); } } }; diff --git a/src/backend/commands/player/toxic/force_into_mission.cpp b/src/backend/commands/player/toxic/force_into_mission.cpp index cc21eeb4..4f9bdef4 100644 --- a/src/backend/commands/player/toxic/force_into_mission.cpp +++ b/src/backend/commands/player/toxic/force_into_mission.cpp @@ -19,7 +19,7 @@ namespace big const size_t arg_count = 3; int64_t args[arg_count] = {(int64_t)eRemoteEvent::ForceMission, (int64_t)self::id, 0}; - g_pointers->m_trigger_script_event(1, args, arg_count, 1 << player->id()); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << player->id()); } }; diff --git a/src/backend/commands/player/toxic/kick_from_interior.cpp b/src/backend/commands/player/toxic/kick_from_interior.cpp index 7977889c..a81c0bb8 100644 --- a/src/backend/commands/player/toxic/kick_from_interior.cpp +++ b/src/backend/commands/player/toxic/kick_from_interior.cpp @@ -138,7 +138,7 @@ namespace big *scr_globals::globalplayer_bd.at(player->id(), scr_globals::size::globalplayer_bd).at(321).at(8).as(), }; - g_pointers->m_trigger_script_event(1, args, arg_count, 1 << player->id()); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << player->id()); } } }; diff --git a/src/backend/commands/player/toxic/kick_from_vehicle.cpp b/src/backend/commands/player/toxic/kick_from_vehicle.cpp index ce254d91..2da8a3cf 100644 --- a/src/backend/commands/player/toxic/kick_from_vehicle.cpp +++ b/src/backend/commands/player/toxic/kick_from_vehicle.cpp @@ -24,12 +24,12 @@ namespace big const size_t arg_count = 9; int64_t args[arg_count] = {(int64_t)eRemoteEvent::VehicleKick, self::id, 0, 0, 0, 0, 0, 0, 0}; - g_pointers->m_trigger_script_event(1, args, arg_count, 1 << player->id()); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << player->id()); } else { // use a private method to kick player from vehicle - (*g_pointers->m_network_object_mgr)->ChangeOwner(vehicle->m_net_object, g_player_service->get_self()->get_net_game_player(), 0); + (*g_pointers->m_gta.m_network_object_mgr)->ChangeOwner(vehicle->m_net_object, g_player_service->get_self()->get_net_game_player(), 0); } } }; diff --git a/src/backend/commands/player/toxic/kill_player.cpp b/src/backend/commands/player/toxic/kill_player.cpp index bc0fffc8..439ff3b4 100644 --- a/src/backend/commands/player/toxic/kill_player.cpp +++ b/src/backend/commands/player/toxic/kill_player.cpp @@ -18,7 +18,7 @@ namespace big if (!player->get_ped()) return; - g_pointers->m_send_network_damage(g_player_service->get_self()->get_ped(), + g_pointers->m_gta.m_send_network_damage(g_player_service->get_self()->get_ped(), player->get_ped(), player->get_ped()->m_navigation->get_position(), 0, diff --git a/src/backend/commands/player/toxic/ragdoll_player.cpp b/src/backend/commands/player/toxic/ragdoll_player.cpp index 2f704156..67266c6e 100644 --- a/src/backend/commands/player/toxic/ragdoll_player.cpp +++ b/src/backend/commands/player/toxic/ragdoll_player.cpp @@ -17,7 +17,7 @@ namespace big { if (auto ped = player->get_ped()) if (auto net_object = ped->m_net_object) - g_pointers->m_request_ragdoll(net_object->m_object_id); + g_pointers->m_gta.m_request_ragdoll(net_object->m_object_id); } }; diff --git a/src/backend/commands/player/toxic/send_fake_ban_message.cpp b/src/backend/commands/player/toxic/send_fake_ban_message.cpp index f4702019..0ac28bbf 100644 --- a/src/backend/commands/player/toxic/send_fake_ban_message.cpp +++ b/src/backend/commands/player/toxic/send_fake_ban_message.cpp @@ -23,7 +23,7 @@ namespace big strcpy((char*)&args[2], "HUD_ROSBANPERM"); - g_pointers->m_trigger_script_event(1, args, arg_count, 1 << player->id()); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << player->id()); } }; diff --git a/src/backend/commands/player/toxic/send_sext.cpp b/src/backend/commands/player/toxic/send_sext.cpp index f6746db0..4bba99c4 100644 --- a/src/backend/commands/player/toxic/send_sext.cpp +++ b/src/backend/commands/player/toxic/send_sext.cpp @@ -28,7 +28,7 @@ namespace big strcpy((char*)&args[2], (std::string("SXT_") + strippers[rand() % strippers.size()] + "_" + sext_types[rand() % sext_types.size()]) .data()); - g_pointers->m_trigger_script_event(1, args, arg_count, 1 << player->id()); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << player->id()); } }; diff --git a/src/backend/commands/player/toxic/send_to_apartment.cpp b/src/backend/commands/player/toxic/send_to_apartment.cpp index 33199289..6770bda9 100644 --- a/src/backend/commands/player/toxic/send_to_apartment.cpp +++ b/src/backend/commands/player/toxic/send_to_apartment.cpp @@ -24,7 +24,7 @@ namespace big const size_t arg_count = 9; int64_t args[arg_count] = {(int64_t)eRemoteEvent::Teleport, self::id, (int64_t)player->id(), (int64_t)(int)-1, 1, (int64_t)_args[0], 1, 1, 1}; - g_pointers->m_trigger_script_event(1, args, arg_count, 1 << player->id()); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << player->id()); } }; diff --git a/src/backend/commands/player/toxic/send_to_interior.cpp b/src/backend/commands/player/toxic/send_to_interior.cpp index c6066ee2..af68b620 100644 --- a/src/backend/commands/player/toxic/send_to_interior.cpp +++ b/src/backend/commands/player/toxic/send_to_interior.cpp @@ -39,7 +39,7 @@ namespace big (int64_t) true, -1}; - g_pointers->m_trigger_script_event(1, args, arg_count, 1 << player->id()); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << player->id()); } }; diff --git a/src/backend/commands/player/toxic/send_to_island.cpp b/src/backend/commands/player/toxic/send_to_island.cpp index 4e208c42..35802386 100644 --- a/src/backend/commands/player/toxic/send_to_island.cpp +++ b/src/backend/commands/player/toxic/send_to_island.cpp @@ -22,7 +22,7 @@ namespace big (int64_t)self::id, }; - g_pointers->m_trigger_script_event(1, args, arg_count, 1 << player->id()); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << player->id()); } }; diff --git a/src/backend/commands/player/toxic/send_to_warehouse.cpp b/src/backend/commands/player/toxic/send_to_warehouse.cpp index 7baf8af8..138a144d 100644 --- a/src/backend/commands/player/toxic/send_to_warehouse.cpp +++ b/src/backend/commands/player/toxic/send_to_warehouse.cpp @@ -24,7 +24,7 @@ namespace big const size_t arg_count = 6; int64_t args[arg_count] = {(int64_t)eRemoteEvent::TeleportToWarehouse, self::id, (int64_t)player->id(), 1, (int64_t)_args[0]}; - g_pointers->m_trigger_script_event(1, args, arg_count, 1 << player->id()); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << player->id()); } }; diff --git a/src/backend/commands/player/toxic/show_transaction_error.cpp b/src/backend/commands/player/toxic/show_transaction_error.cpp index 6b29dfd6..5d94e807 100644 --- a/src/backend/commands/player/toxic/show_transaction_error.cpp +++ b/src/backend/commands/player/toxic/show_transaction_error.cpp @@ -28,7 +28,7 @@ namespace big *scr_globals::gsbd_fm_events.at(9).as(), *scr_globals::gsbd_fm_events.at(10).as()}; - g_pointers->m_trigger_script_event(1, args, arg_count, 1 << player->id()); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << player->id()); } }; diff --git a/src/backend/commands/player/toxic/start_script.cpp b/src/backend/commands/player/toxic/start_script.cpp index 29a7d371..73254423 100644 --- a/src/backend/commands/player/toxic/start_script.cpp +++ b/src/backend/commands/player/toxic/start_script.cpp @@ -30,14 +30,14 @@ namespace big args[2 + 19] = arg19; args[24] = scr_globals::gpbd_fm_3.as()->Entries[player->id()].ScriptEventReplayProtectionCounter; - g_pointers->m_trigger_script_event(1, args, arg_count, 1 << player->id()); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << player->id()); for (int i = 0; i < 2; i++) { const size_t arg_count_2 = 25; int64_t args_2[arg_count_2] = {(int64_t)eRemoteEvent::StartScriptProceed, (int64_t)self::id}; args_2[2 + 17] = 1337; - g_pointers->m_trigger_script_event(1, args_2, arg_count_2, 1 << player->id()); + g_pointers->m_gta.m_trigger_script_event(1, args_2, arg_count_2, 1 << player->id()); script::get_current()->yield(20ms); } diff --git a/src/backend/commands/player/toxic/trigger_ceo_raid.cpp b/src/backend/commands/player/toxic/trigger_ceo_raid.cpp index 91c5d0c9..566f5042 100644 --- a/src/backend/commands/player/toxic/trigger_ceo_raid.cpp +++ b/src/backend/commands/player/toxic/trigger_ceo_raid.cpp @@ -18,7 +18,7 @@ namespace big const size_t arg_count = 3; int64_t args[arg_count] = {(int64_t)eRemoteEvent::TriggerCEORaid, (int64_t)self::id, 0}; - g_pointers->m_trigger_script_event(1, args, arg_count, 1 << player->id()); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << player->id()); } }; diff --git a/src/backend/commands/teleport/teleport_to_last_vehicle.cpp b/src/backend/commands/teleport/teleport_to_last_vehicle.cpp index 0e8a5476..a20fd02e 100644 --- a/src/backend/commands/teleport/teleport_to_last_vehicle.cpp +++ b/src/backend/commands/teleport/teleport_to_last_vehicle.cpp @@ -12,7 +12,7 @@ namespace big { if (g_local_player && g_local_player->m_vehicle) { - const Vehicle veh = g_pointers->m_ptr_to_handle(g_local_player->m_vehicle); + const Vehicle veh = g_pointers->m_gta.m_ptr_to_handle(g_local_player->m_vehicle); teleport::into_vehicle(veh); } } diff --git a/src/backend/context/chat_command_context.cpp b/src/backend/context/chat_command_context.cpp index 2a3e6b76..02d1439d 100644 --- a/src/backend/context/chat_command_context.cpp +++ b/src/backend/context/chat_command_context.cpp @@ -31,7 +31,7 @@ namespace big msg[1] = ' '; strncpy(msg + 2, output.c_str(), sizeof(msg) - 2); - if (g_hooking->get_original()(*g_pointers->m_send_chat_ptr, + if (g_hooking->get_original()(*g_pointers->m_gta.m_send_chat_ptr, g_player_service->get_self()->get_net_data(), msg, false)) diff --git a/src/backend/looped/player/good_options.cpp b/src/backend/looped/player/good_options.cpp index bf66dbb0..ad3a676b 100644 --- a/src/backend/looped/player/good_options.cpp +++ b/src/backend/looped/player/good_options.cpp @@ -11,7 +11,7 @@ namespace big static int neverWantedPlayer = 0; void looped::player_good_options() { - if (!*g_pointers->m_is_session_started) + if (!*g_pointers->m_gta.m_is_session_started) return; offRadarPlayer++; @@ -35,8 +35,8 @@ namespace big if (g.session.semi_godmode_all) { - g_pointers->m_give_pickup_rewards(-1, REWARD_HEALTH); - g_pointers->m_give_pickup_rewards(-1, REWARD_ARMOUR); + g_pointers->m_gta.m_give_pickup_rewards(-1, REWARD_HEALTH); + g_pointers->m_gta.m_give_pickup_rewards(-1, REWARD_ARMOUR); } else { @@ -50,12 +50,12 @@ namespace big if (ped->m_health < ped->m_maxhealth) { - g_pointers->m_give_pickup_rewards(1 << entry.second->id(), REWARD_HEALTH); + g_pointers->m_gta.m_give_pickup_rewards(1 << entry.second->id(), REWARD_HEALTH); } if (ped->m_armor < 50.0f) { - g_pointers->m_give_pickup_rewards(1 << entry.second->id(), REWARD_ARMOUR); + g_pointers->m_gta.m_give_pickup_rewards(1 << entry.second->id(), REWARD_ARMOUR); } } } diff --git a/src/backend/looped/player/toxic_options.cpp b/src/backend/looped/player/toxic_options.cpp index bdd49315..eab67a9b 100644 --- a/src/backend/looped/player/toxic_options.cpp +++ b/src/backend/looped/player/toxic_options.cpp @@ -9,7 +9,7 @@ namespace big { void looped::player_toxic_options() { - if (!*g_pointers->m_is_session_started) + if (!*g_pointers->m_gta.m_is_session_started) return; int rotate_cam_bits = 0; @@ -18,7 +18,7 @@ namespace big if (g_player_service->get_self()->get_ped() && entry.second->get_ped() && entry.second->get_ped()->m_health > 0) { if (entry.second->kill_loop && !(entry.second->get_ped()->m_damage_bits & (1 << 8))) - g_pointers->m_send_network_damage(g_player_service->get_self()->get_ped(), + g_pointers->m_gta.m_send_network_damage(g_player_service->get_self()->get_ped(), entry.second->get_ped(), entry.second->get_ped()->m_navigation->get_position(), 0, @@ -41,10 +41,10 @@ namespace big toxic::blame_explode_player(entry.second, entry.second, EXP_TAG_SUBMARINE_BIG, 9999.0f, true, false, 9999.0f); if (entry.second->freeze_loop && entry.second->get_ped()->m_net_object) - g_pointers->m_clear_ped_tasks_network(entry.second->get_ped(), true); + g_pointers->m_gta.m_clear_ped_tasks_network(entry.second->get_ped(), true); if (entry.second->ragdoll_loop && entry.second->get_ped()->m_net_object) - g_pointers->m_request_ragdoll(entry.second->get_ped()->m_net_object->m_object_id); + g_pointers->m_gta.m_request_ragdoll(entry.second->get_ped()->m_net_object->m_object_id); if (entry.second->rotate_cam_loop) rotate_cam_bits |= (1 << entry.second->id()); @@ -55,7 +55,7 @@ namespace big const size_t arg_count = 3; int64_t args[arg_count] = {(int64_t)eRemoteEvent::TSECommand, (int64_t)self::id, (int64_t)eRemoteEvent::TSECommandRotateCam}; - g_pointers->m_trigger_script_event(1, args, arg_count, rotate_cam_bits); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, rotate_cam_bits); } }); } diff --git a/src/backend/looped/self/dance_mode.cpp b/src/backend/looped/self/dance_mode.cpp index 8956fbc2..6856fe49 100644 --- a/src/backend/looped/self/dance_mode.cpp +++ b/src/backend/looped/self/dance_mode.cpp @@ -30,7 +30,7 @@ namespace big g.m_dance_thread = gta_util::find_script_thread_by_id(thread); g.m_dance_program = gta_util::find_script_program(RAGE_JOAAT("am_mp_nightclub")); - (*g_pointers->m_script_handler_mgr)->attach_thread(g.m_dance_thread); + (*g_pointers->m_gta.m_script_handler_mgr)->attach_thread(g.m_dance_thread); g.m_dance_thread->m_context.m_state = rage::eThreadState::unk_3; diff --git a/src/backend/looped/self/police.cpp b/src/backend/looped/self/police.cpp index c0d4d562..da17f980 100644 --- a/src/backend/looped/self/police.cpp +++ b/src/backend/looped/self/police.cpp @@ -1,5 +1,6 @@ #include "backend/looped/looped.hpp" #include "pointers.hpp" +#include "util/police.hpp" namespace big { @@ -15,14 +16,14 @@ namespace big if (b) { g_local_player->m_player_info->m_wanted_level = 0; - g_pointers->m_max_wanted_level->apply(); - g_pointers->m_max_wanted_level_2->apply(); + police::m_max_wanted_level->apply(); + police::m_max_wanted_level_2->apply(); bLast = b; } else if (b != bLast) { - g_pointers->m_max_wanted_level->restore(); - g_pointers->m_max_wanted_level_2->restore(); + police::m_max_wanted_level->restore(); + police::m_max_wanted_level_2->restore(); bLast = b; } diff --git a/src/backend/looped/session/auto_kick_host.cpp b/src/backend/looped/session/auto_kick_host.cpp index 5a7e6fe3..30fe0cc4 100644 --- a/src/backend/looped/session/auto_kick_host.cpp +++ b/src/backend/looped/session/auto_kick_host.cpp @@ -8,7 +8,7 @@ namespace big static bool bLastKickHost = false; void looped::session_auto_kick_host() { - bool kick_host = *g_pointers->m_is_session_started && g.session.force_session_host && g.session.kick_host_when_forcing_host; + bool kick_host = *g_pointers->m_gta.m_is_session_started && g.session.force_session_host && g.session.kick_host_when_forcing_host; if (kick_host && !bLastKickHost) { g_player_service->iterate([](auto& plyr) { diff --git a/src/backend/looped/session/block_jobs.cpp b/src/backend/looped/session/block_jobs.cpp index 6d233976..8b751a5e 100644 --- a/src/backend/looped/session/block_jobs.cpp +++ b/src/backend/looped/session/block_jobs.cpp @@ -11,7 +11,7 @@ namespace big void looped::session_block_jobs() { - bool used = g.session.block_jobs && *g_pointers->m_is_session_started; + bool used = g.session.block_jobs && *g_pointers->m_gta.m_is_session_started; if (!bLastBlockJobsEnabled && used) { if (!STREAMING::IS_PLAYER_SWITCH_IN_PROGRESS() && SCRIPT::GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(RAGE_JOAAT("maintransition")) == 0 && NETWORK::NETWORK_GET_HOST_OF_SCRIPT("fmmc_launcher", -1, 0) == self::id) @@ -23,7 +23,7 @@ namespace big } else if (bLastBlockJobsEnabled && !used) { - if (*g_pointers->m_is_session_started && !STREAMING::IS_PLAYER_SWITCH_IN_PROGRESS() && gta_util::find_script_thread(RAGE_JOAAT("fmmc_launcher"))) + if (*g_pointers->m_gta.m_is_session_started && !STREAMING::IS_PLAYER_SWITCH_IN_PROGRESS() && gta_util::find_script_thread(RAGE_JOAAT("fmmc_launcher"))) { auto fmmc = gta_util::find_script_thread(RAGE_JOAAT("fmmc_launcher")); *script_local(fmmc->m_stack, scr_locals::fmmc_launcher::broadcast_idx).at(47).at(7).as() = 0; diff --git a/src/backend/looped/session/force_thunder.cpp b/src/backend/looped/session/force_thunder.cpp index 0cdedf75..b288fdad 100644 --- a/src/backend/looped/session/force_thunder.cpp +++ b/src/backend/looped/session/force_thunder.cpp @@ -10,7 +10,7 @@ namespace big void looped::session_force_thunder() { - bool used = g.session.force_thunder && *g_pointers->m_is_session_started; + bool used = g.session.force_thunder && *g_pointers->m_gta.m_is_session_started; if (!bLastForceThunderEnabled && used) { if (!STREAMING::IS_PLAYER_SWITCH_IN_PROGRESS() && gta_util::find_script_thread(RAGE_JOAAT("freemode")) && SCRIPT::GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(RAGE_JOAAT("maintransition")) == 0) @@ -23,7 +23,7 @@ namespace big } else if (bLastForceThunderEnabled && !used) { - if (*g_pointers->m_is_session_started && !STREAMING::IS_PLAYER_SWITCH_IN_PROGRESS() && gta_util::find_script_thread(RAGE_JOAAT("freemode"))) + if (*g_pointers->m_gta.m_is_session_started && !STREAMING::IS_PLAYER_SWITCH_IN_PROGRESS() && gta_util::find_script_thread(RAGE_JOAAT("freemode"))) { session::clear_fm_event_index(9); session::clear_fm_event_index(10); diff --git a/src/backend/looped/session/pop_multiplier_areas.cpp b/src/backend/looped/session/pop_multiplier_areas.cpp index 7d6656d6..e5a7e7fb 100644 --- a/src/backend/looped/session/pop_multiplier_areas.cpp +++ b/src/backend/looped/session/pop_multiplier_areas.cpp @@ -12,7 +12,7 @@ namespace big void looped::session_pop_multiplier_areas() { - bool used = (g.session.disable_traffic || g.session.disable_peds) && *g_pointers->m_is_session_started; + bool used = (g.session.disable_traffic || g.session.disable_peds) && *g_pointers->m_gta.m_is_session_started; if (!bLastPopMultiplierAreasEnabled && used) { if (!STREAMING::IS_PLAYER_SWITCH_IN_PROGRESS() && gta_util::find_script_thread(RAGE_JOAAT("freemode")) && SCRIPT::GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(RAGE_JOAAT("maintransition")) == 0) diff --git a/src/backend/looped/session/randomize_ceo_colors.cpp b/src/backend/looped/session/randomize_ceo_colors.cpp index 096cb863..445cda90 100644 --- a/src/backend/looped/session/randomize_ceo_colors.cpp +++ b/src/backend/looped/session/randomize_ceo_colors.cpp @@ -9,7 +9,7 @@ namespace big { void looped::session_randomize_ceo_colors() { - if (g.session.randomize_ceo_colors && *g_pointers->m_is_session_started && !STREAMING::IS_PLAYER_SWITCH_IN_PROGRESS() && SCRIPT::GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(RAGE_JOAAT("maintransition")) == 0) + if (g.session.randomize_ceo_colors && *g_pointers->m_gta.m_is_session_started && !STREAMING::IS_PLAYER_SWITCH_IN_PROGRESS() && SCRIPT::GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(RAGE_JOAAT("maintransition")) == 0) { if (auto freemode = gta_util::find_script_thread(RAGE_JOAAT("freemode")); freemode && freemode->m_net_component && freemode->m_net_component->is_local_player_host()) diff --git a/src/backend/looped/system/desync_kick_protection.cpp b/src/backend/looped/system/desync_kick_protection.cpp index cfccd1a8..0bac1c90 100644 --- a/src/backend/looped/system/desync_kick_protection.cpp +++ b/src/backend/looped/system/desync_kick_protection.cpp @@ -37,7 +37,7 @@ namespace big if (plyr->get_net_data()) { gta_util::get_network()->m_game_complaint_mgr.m_host_token = plyr->get_net_data()->m_host_token; - g_pointers->m_reset_network_complaints(>a_util::get_network()->m_game_complaint_mgr); + g_pointers->m_gta.m_reset_network_complaints(>a_util::get_network()->m_game_complaint_mgr); } } @@ -45,7 +45,7 @@ namespace big { gta_util::get_network()->m_game_complaint_mgr.m_host_token = g_player_service->get_self()->get_net_data()->m_host_token; - g_pointers->m_reset_network_complaints(>a_util::get_network()->m_game_complaint_mgr); + g_pointers->m_gta.m_reset_network_complaints(>a_util::get_network()->m_game_complaint_mgr); } } diff --git a/src/backend/looped/system/self_globals.cpp b/src/backend/looped/system/self_globals.cpp index b366e76e..f710070a 100644 --- a/src/backend/looped/system/self_globals.cpp +++ b/src/backend/looped/system/self_globals.cpp @@ -8,11 +8,11 @@ namespace big { void looped::system_self_globals() { - if (!*g_pointers->m_network_player_mgr || !(*g_pointers->m_network_player_mgr)->m_local_net_player - || (*g_pointers->m_network_player_mgr)->m_local_net_player->m_player_id == -1) + if (!*g_pointers->m_gta.m_network_player_mgr || !(*g_pointers->m_gta.m_network_player_mgr)->m_local_net_player + || (*g_pointers->m_gta.m_network_player_mgr)->m_local_net_player->m_player_id == -1) self::id = 0; else - self::id = (*g_pointers->m_network_player_mgr)->m_local_net_player->m_player_id; + self::id = (*g_pointers->m_gta.m_network_player_mgr)->m_local_net_player->m_player_id; self::ped = PLAYER::PLAYER_PED_ID(); diff --git a/src/backend/looped/system/spoofing.cpp b/src/backend/looped/system/spoofing.cpp index 281280e0..91a971b2 100644 --- a/src/backend/looped/system/spoofing.cpp +++ b/src/backend/looped/system/spoofing.cpp @@ -16,18 +16,18 @@ namespace big if (bLastForceHost != g.session.force_session_host && gta_util::get_network()->m_game_session_state == 0) { std::uint64_t host_token; - g_pointers->m_generate_uuid(&host_token); + g_pointers->m_gta.m_generate_uuid(&host_token); host_token = g.session.force_session_host ? (rand() % 10000) : host_token; - *g_pointers->m_host_token = host_token; + *g_pointers->m_gta.m_host_token = host_token; if (gta_util::get_network()->m_game_session_ptr) gta_util::get_network()->m_game_session_ptr->m_local_player.m_player_data.m_host_token = host_token; - g_pointers->m_profile_gamer_info->m_host_token = host_token; - g_pointers->m_player_info_gamer_info->m_host_token = host_token; - (*g_pointers->m_communications)->m_voice.m_connections[0]->m_gamer_info.m_host_token = host_token; + g_pointers->m_gta.m_profile_gamer_info->m_host_token = host_token; + g_pointers->m_gta.m_player_info_gamer_info->m_host_token = host_token; + (*g_pointers->m_gta.m_communications)->m_voice.m_connections[0]->m_gamer_info.m_host_token = host_token; if (g_local_player && g_local_player->m_player_info) g_local_player->m_player_info->m_net_player_data.m_host_token = host_token; @@ -35,7 +35,7 @@ namespace big bLastForceHost = g.session.force_session_host; } - if (*g_pointers->m_is_session_started) + if (*g_pointers->m_gta.m_is_session_started) { gta_util::execute_as_script(RAGE_JOAAT("freemode"), [] { if (NETWORK::NETWORK_GET_THIS_SCRIPT_IS_NETWORK_SCRIPT() && NETWORK::NETWORK_GET_SCRIPT_STATUS() == 2) diff --git a/src/backend/looped/system/voice_chat_audio.cpp b/src/backend/looped/system/voice_chat_audio.cpp index 889bf9e4..c7cbbce7 100644 --- a/src/backend/looped/system/voice_chat_audio.cpp +++ b/src/backend/looped/system/voice_chat_audio.cpp @@ -10,7 +10,7 @@ namespace big virtual void on_enable() override { - *g_pointers->m_refresh_audio_input = true; + *g_pointers->m_gta.m_refresh_audio_input = true; } virtual void on_tick() override @@ -20,7 +20,7 @@ namespace big virtual void on_disable() override { - *g_pointers->m_refresh_audio_input = true; + *g_pointers->m_gta.m_refresh_audio_input = true; NETWORK::NETWORK_OVERRIDE_SEND_RESTRICTIONS_ALL(false); } }; diff --git a/src/backend/looped/vehicle/no_collision.cpp b/src/backend/looped/vehicle/no_collision.cpp index 02928fc2..b72a4afe 100644 --- a/src/backend/looped/vehicle/no_collision.cpp +++ b/src/backend/looped/vehicle/no_collision.cpp @@ -1,5 +1,6 @@ #include "backend/looped_command.hpp" #include "pointers.hpp" +#include "util/vehicle.hpp" namespace big { @@ -9,7 +10,7 @@ namespace big virtual void on_enable() override { - g_pointers->m_disable_collision->apply(); + vehicle::disable_collisions::m_patch->apply(); } virtual void on_tick() override @@ -19,7 +20,7 @@ namespace big virtual void on_disable() override { - g_pointers->m_disable_collision->restore(); + vehicle::disable_collisions::m_patch->restore(); } }; veh_no_collision g_veh_no_collision("vehnocollision", "No Collision", "Same as Ped No Collision, except this is global and also affects Ped", g.vehicle.no_collision); diff --git a/src/backend/looped/world/spawn_ped.cpp b/src/backend/looped/world/spawn_ped.cpp index f75d58bb..9f9d3188 100644 --- a/src/backend/looped/world/spawn_ped.cpp +++ b/src/backend/looped/world/spawn_ped.cpp @@ -15,9 +15,9 @@ namespace big static bool bLastLoadPathNodes = false; void looped::world_spawn_ped() { - if (*g_pointers->m_is_session_started != last_online) + if (*g_pointers->m_gta.m_is_session_started != last_online) { - last_online = *g_pointers->m_is_session_started; + last_online = *g_pointers->m_gta.m_is_session_started; for (auto& ped : spawned_peds) cleanup_spawned_ped(ped); @@ -38,7 +38,7 @@ namespace big for (auto it = spawned_peds.begin(); it != spawned_peds.end();) { - if ((*g_pointers->m_is_session_started && !NETWORK::NETWORK_IS_PLAYER_CONNECTED(it->spawned_for_player)) || !ENTITY::DOES_ENTITY_EXIST(it->ped_handle)) + if ((*g_pointers->m_gta.m_is_session_started && !NETWORK::NETWORK_IS_PLAYER_CONNECTED(it->spawned_for_player)) || !ENTITY::DOES_ENTITY_EXIST(it->ped_handle)) { cleanup_spawned_ped(*it); it = spawned_peds.erase(it); diff --git a/src/backend/reactions/interloper_reaction.cpp b/src/backend/reactions/interloper_reaction.cpp index c90cc183..f9b38f0f 100644 --- a/src/backend/reactions/interloper_reaction.cpp +++ b/src/backend/reactions/interloper_reaction.cpp @@ -31,7 +31,7 @@ namespace big attacker->get_name(), victim->get_name()); - if (g_hooking->get_original()(*g_pointers->m_send_chat_ptr, + if (g_hooking->get_original()(*g_pointers->m_gta.m_send_chat_ptr, g_player_service->get_self()->get_net_data(), chat, false)) diff --git a/src/backend/reactions/reaction.cpp b/src/backend/reactions/reaction.cpp index ff7853f9..419001aa 100644 --- a/src/backend/reactions/reaction.cpp +++ b/src/backend/reactions/reaction.cpp @@ -61,7 +61,7 @@ namespace big std::format("{} {}", g.session.chat_output_prefix, m_announce_message).data(), player->get_name()); - if (g_hooking->get_original()(*g_pointers->m_send_chat_ptr, + if (g_hooking->get_original()(*g_pointers->m_gta.m_send_chat_ptr, g_player_service->get_self()->get_net_data(), chat, false)) diff --git a/src/backend/script_patches.hpp b/src/backend/script_patches.hpp index 674004c9..74569ed0 100644 --- a/src/backend/script_patches.hpp +++ b/src/backend/script_patches.hpp @@ -57,7 +57,7 @@ namespace big g_script_patcher_service->add_patch( {RAGE_JOAAT("carmod_shop"), "2D 03 07 00 00 71 38 02", 5, {0x72, 0x2E, 0x03, 0x01}, &g.vehicle.ls_customs});// allow all vehicles 2 - for (auto& entry : *g_pointers->m_script_program_table) + for (auto& entry : *g_pointers->m_gta.m_script_program_table) { if (entry.m_program) g_script_patcher_service->on_script_load(entry.m_program); diff --git a/src/byte_patch_manager.cpp b/src/byte_patch_manager.cpp new file mode 100644 index 00000000..7c125100 --- /dev/null +++ b/src/byte_patch_manager.cpp @@ -0,0 +1,83 @@ +#include "byte_patch_manager.hpp" + +#include "gta/net_array.hpp" +#include "hooking.hpp" +#include "memory/byte_patch.hpp" +#include "pointers.hpp" +#include "util/police.hpp" +#include "util/toxic.hpp" +#include "util/vehicle.hpp" + +extern "C" void sound_overload_detour(); +std::uint64_t g_sound_overload_ret_addr; + +namespace big +{ + static void init() + { + // Max Wanted Level + police::m_max_wanted_level = + memory::byte_patch::make(g_pointers->m_gta.m_max_wanted_level.add(5).rip().as(), 0).get(); + police::m_max_wanted_level_2 = + memory::byte_patch::make(g_pointers->m_gta.m_max_wanted_level.add(14).rip().as(), 0).get(); + + //Patch blocked explosions + toxic::explosion_anti_cheat_bypass::m_can_blame_others = + memory::byte_patch::make(g_pointers->m_gta.m_explosion_patch.as(), 0xE990).get(); + toxic::explosion_anti_cheat_bypass::m_can_use_blocked_explosions = + memory::byte_patch::make(g_pointers->m_gta.m_explosion_patch.sub(12).as(), 0x9090).get(); + + // Is Matchmaking Session Valid + memory::byte_patch::make(g_pointers->m_gta.m_is_matchmaking_session_valid.as(), std::to_array({0xB0, 0x01, 0xC3})) + ->apply(); // has no observable side effects + + // Broadcast Net Array Patch + broadcast_net_array::m_patch = + memory::byte_patch::make(g_pointers->m_gta.m_broadcast_patch.as(), 0xEB).get(); + + // Creator Warp Cheat Triggered Patch + memory::byte_patch::make(g_pointers->m_gta.m_creator_warp_cheat_triggered_patch.as(), 0xEB)->apply(); + + // NTQVM Caller + memory::byte_patch::make(g_pointers->m_gta.m_ntqvm_caller.add(4).rip().sub(32).as(), (uint64_t)&hooks::nt_query_virtual_memory) + ->apply(); + + // Sound Overload Detour + g_sound_overload_ret_addr = g_pointers->m_gta.m_sound_overload_detour.add(13 + 15).as(); + std::vector bytes = {0xFF, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90}; // far jump opcode + a nop opcode + *(void**)(bytes.data() + 6) = sound_overload_detour; + memory::byte_patch::make(g_pointers->m_gta.m_sound_overload_detour.add(13).as(), bytes)->apply(); + + // Disable Collision + vehicle::disable_collisions::m_patch = + memory::byte_patch::make(g_pointers->m_gta.m_disable_collision.sub(2).as(), 0xEB).get(); + + // Crash Trigger + memory::byte_patch::make(g_pointers->m_gta.m_crash_trigger.add(4).as(), 0x00)->apply(); + + // freemode_thread_restorer_through_vm_patch + memory::byte_patch::make(g_pointers->m_gta.freemode_thread_restorer_through_vm_patch_1.add(2).as(), 0xc9310272) + ->apply(); + memory::byte_patch::make(g_pointers->m_gta.freemode_thread_restorer_through_vm_patch_1.add(6).as(), 0x9090) + ->apply(); + + memory::byte_patch::make(g_pointers->m_gta.freemode_thread_restorer_through_vm_patch_2.add(2).as(), 0xc9310272) + ->apply(); + memory::byte_patch::make(g_pointers->m_gta.freemode_thread_restorer_through_vm_patch_2.add(6).as(), 0x9090) + ->apply(); + } + + byte_patch_manager::byte_patch_manager() + { + init(); + + g_byte_patch_manager = this; + } + + byte_patch_manager::~byte_patch_manager() + { + memory::byte_patch::restore_all(); + + g_byte_patch_manager = nullptr; + } +} \ No newline at end of file diff --git a/src/byte_patch_manager.hpp b/src/byte_patch_manager.hpp new file mode 100644 index 00000000..145ead78 --- /dev/null +++ b/src/byte_patch_manager.hpp @@ -0,0 +1,15 @@ +#pragma once + +extern "C" std::uint64_t g_sound_overload_ret_addr; + +namespace big +{ + class byte_patch_manager + { + public: + byte_patch_manager(); + ~byte_patch_manager(); + }; + + inline byte_patch_manager* g_byte_patch_manager; +} diff --git a/src/gta/fidevice.cpp b/src/gta/fidevice.cpp index 81ae91ca..45fe6ad4 100644 --- a/src/gta/fidevice.cpp +++ b/src/gta/fidevice.cpp @@ -252,12 +252,12 @@ namespace rage fiPackfile::fiPackfile() { - big::g_pointers->m_fipackfile_ctor(this); + big::g_pointers->m_gta.m_fipackfile_ctor(this); } bool fiPackfile::OpenPackfile(const char* archive, bool b_true, int type, intptr_t very_false) { - return big::g_pointers->m_fipackfile_open_archive(this, archive, b_true, type, very_false); + return big::g_pointers->m_gta.m_fipackfile_open_archive(this, archive, b_true, type, very_false); } bool fiPackfile::Mount(const char* mount_point) diff --git a/src/gta/fidevice.hpp b/src/gta/fidevice.hpp index 07e84cdf..a57a3562 100644 --- a/src/gta/fidevice.hpp +++ b/src/gta/fidevice.hpp @@ -29,7 +29,7 @@ namespace rage public: static inline fiDevice* GetDevice(const char* path, bool allowRoot) { - return big::g_pointers->m_fidevice_get_device(path, allowRoot); + return big::g_pointers->m_gta.m_fidevice_get_device(path, allowRoot); } static bool MountGlobal(const char* mountPoint, fiDevice* device, bool allowRoot); diff --git a/src/gta/net_array.hpp b/src/gta/net_array.hpp index 0f95ce2e..4455db33 100644 --- a/src/gta/net_array.hpp +++ b/src/gta/net_array.hpp @@ -1,4 +1,13 @@ #pragma once +#include "memory/fwddec.hpp" + +namespace big +{ + struct broadcast_net_array + { + inline static memory::byte_patch* m_patch; + }; +} class CNetGamePlayer; @@ -202,7 +211,7 @@ namespace rage #if 0 static inline netArrayHandlerBase* get_by_data(void* data) { - if (auto array_mgr = *big::g_pointers->m_game_array_mgr) + if (auto array_mgr = *big::g_pointers->m_gta.m_game_array_mgr) { if (auto handler = array_mgr->m_start) { diff --git a/src/gta/net_game_event.hpp b/src/gta/net_game_event.hpp index 59a3eb72..e96342c7 100644 --- a/src/gta/net_game_event.hpp +++ b/src/gta/net_game_event.hpp @@ -74,11 +74,11 @@ namespace rage } bool WriteBool(bool integer) { - return big::g_pointers->m_write_bitbuf_bool(this, integer, 1); + return big::g_pointers->m_gta.m_write_bitbuf_bool(this, integer, 1); } bool ReadBool(bool* integer) { - return big::g_pointers->m_read_bitbuf_bool(this, integer, 1); + return big::g_pointers->m_gta.m_read_bitbuf_bool(this, integer, 1); } bool ReadPeerId(uint64_t* integer) { @@ -113,16 +113,16 @@ namespace rage } bool ReadString(char* string, int bits) { - return big::g_pointers->m_read_bitbuf_string(this, string, bits); + return big::g_pointers->m_gta.m_read_bitbuf_string(this, string, bits); } bool WriteByte(uint8_t integer, int bits) { - return big::g_pointers->m_write_bitbuf_dword(this, integer, bits); + return big::g_pointers->m_gta.m_write_bitbuf_dword(this, integer, bits); } bool ReadByte(uint8_t* integer, int bits) { uint32_t read; - if (big::g_pointers->m_read_bitbuf_dword(this, &read, bits)) + if (big::g_pointers->m_gta.m_read_bitbuf_dword(this, &read, bits)) { *integer = read; return true; @@ -131,12 +131,12 @@ namespace rage } bool WriteWord(uint16_t integer, int bits) { - return big::g_pointers->m_write_bitbuf_dword(this, integer, bits); + return big::g_pointers->m_gta.m_write_bitbuf_dword(this, integer, bits); } bool ReadWord(uint16_t* integer, int bits) { uint32_t read; - if (big::g_pointers->m_read_bitbuf_dword(this, &read, bits)) + if (big::g_pointers->m_gta.m_read_bitbuf_dword(this, &read, bits)) { *integer = read; return true; @@ -145,15 +145,15 @@ namespace rage } bool WriteDword(uint32_t integer, int bits) { - return big::g_pointers->m_write_bitbuf_dword(this, integer, bits); + return big::g_pointers->m_gta.m_write_bitbuf_dword(this, integer, bits); } bool ReadDword(uint32_t* integer, int bits) { - return big::g_pointers->m_read_bitbuf_dword(this, integer, bits); + return big::g_pointers->m_gta.m_read_bitbuf_dword(this, integer, bits); } bool WriteInt32(int32_t integer, int bits) { - return big::g_pointers->m_write_bitbuf_int32(this, integer, bits); + return big::g_pointers->m_gta.m_write_bitbuf_int32(this, integer, bits); } bool ReadInt32(int32_t* integer, int bits) { @@ -168,7 +168,7 @@ namespace rage } bool WriteQWord(uint64_t integer, int bits) { - return big::g_pointers->m_write_bitbuf_qword(this, integer, bits); + return big::g_pointers->m_gta.m_write_bitbuf_qword(this, integer, bits); } bool ReadQWord(uint64_t* integer, int bits) { @@ -194,7 +194,7 @@ namespace rage } bool WriteInt64(int64_t integer, int bits) { - return big::g_pointers->m_write_bitbuf_int64(this, integer, bits); + return big::g_pointers->m_gta.m_write_bitbuf_int64(this, integer, bits); } bool ReadInt64(int64_t* integer, int bits) { @@ -209,11 +209,11 @@ namespace rage } bool WriteArray(void* array, int size) { - return big::g_pointers->m_write_bitbuf_array(this, array, size, 0); + return big::g_pointers->m_gta.m_write_bitbuf_array(this, array, size, 0); } bool ReadArray(PVOID array, int size) { - return big::g_pointers->m_read_bitbuf_array(this, array, size, 0); + return big::g_pointers->m_gta.m_read_bitbuf_array(this, array, size, 0); } template diff --git a/src/gta/net_object_mgr.hpp b/src/gta/net_object_mgr.hpp index 1ef4f062..c5c4edde 100644 --- a/src/gta/net_object_mgr.hpp +++ b/src/gta/net_object_mgr.hpp @@ -136,6 +136,6 @@ class CNetworkObjectMgr : public rage::netObjectMgrBase public: rage::netObject* find_object_by_id(std::uint16_t object_id, bool can_delete_be_pending) { - return big::g_pointers->m_get_net_object(this, object_id, can_delete_be_pending); + return big::g_pointers->m_gta.m_get_net_object(this, object_id, can_delete_be_pending); } }; diff --git a/src/gta/script_handler.cpp b/src/gta/script_handler.cpp index 62c172da..e82aa39c 100644 --- a/src/gta/script_handler.cpp +++ b/src/gta/script_handler.cpp @@ -6,7 +6,7 @@ int CGameScriptHandlerNetComponent::get_participant_index(CNetGamePlayer* player) { - if (player == (*big::g_pointers->m_network_player_mgr)->m_local_net_player) + if (player == (*big::g_pointers->m_gta.m_network_player_mgr)->m_local_net_player) return m_local_participant_index; if (m_num_participants <= 1) diff --git a/src/gta_pointers.hpp b/src/gta_pointers.hpp new file mode 100644 index 00000000..c16ff6fa --- /dev/null +++ b/src/gta_pointers.hpp @@ -0,0 +1,260 @@ +#pragma once + +class CCommunications; +class FriendRegistry; +class CNetworkPlayerMgr; +class Network; +class ChatData; + +namespace rage +{ + template + class atSingleton; + class RageSecurity; + class netTime; + class rlGamerInfo; +} + +namespace big +{ + // needed for serialization of the pointers cache +#pragma pack(push, 1) + struct gta_pointers + { + memory::handle m_max_wanted_level; + + memory::handle m_blame_explode; + + memory::handle m_explosion_patch; + + memory::handle m_is_matchmaking_session_valid; + + memory::handle m_broadcast_patch; + + memory::handle m_creator_warp_cheat_triggered_patch; + + memory::handle m_ntqvm_caller; + + memory::handle m_sound_overload_detour; + + memory::handle m_disable_collision; + + memory::handle m_crash_trigger; + + memory::handle freemode_thread_restorer_through_vm_patch_1; + memory::handle freemode_thread_restorer_through_vm_patch_2; + + eGameState* m_game_state{}; + bool* m_is_session_started{}; + + CPedFactory** m_ped_factory{}; + CNetworkPlayerMgr** m_network_player_mgr{}; + CNetworkObjectMgr** m_network_object_mgr{}; + rage::CReplayInterface** m_replay_interface{}; + + functions::ptr_to_handle m_ptr_to_handle{}; + functions::handle_to_ptr m_handle_to_ptr{}; + rage::scrNativeRegistrationTable* m_native_registration_table{}; + functions::get_native_handler m_get_native_handler{}; + functions::fix_vectors m_fix_vectors{}; + + rage::atArray* m_script_threads{}; + rage::scrProgramTable* m_script_program_table{}; + functions::run_script_threads m_run_script_threads{}; + std::int64_t** m_script_globals{}; + + CGameScriptHandlerMgr** m_script_handler_mgr{}; + + IDXGISwapChain** m_swapchain{}; + + int* m_resolution_x; + int* m_resolution_y; + + uint32_t* m_region_code; + + PVOID m_world_model_spawn_bypass; + PVOID m_native_return; + PVOID m_get_label_text; + functions::check_chat_profanity* m_check_chat_profanity{}; + functions::write_player_game_state_data_node m_write_player_game_state_data_node{}; + + ChatData** m_chat_data; + ScInfo* m_sc_info; + FriendRegistry* m_friend_registry{}; + + functions::get_screen_coords_for_world_coords m_get_screen_coords_for_world_coords{}; + + HashTable* m_model_table; + PVOID m_get_model_info; + + PVOID m_gta_thread_start{}; + PVOID m_gta_thread_kill{}; + + PVOID m_network_player_mgr_init; + PVOID m_network_player_mgr_shutdown; + + functions::get_gameplay_cam_coords m_get_gameplay_cam_coords; + + PVOID m_write_player_gamer_data_node{}; + + functions::trigger_script_event m_trigger_script_event{}; + + // Bitbuffer Read/Write START + functions::read_bitbuf_dword m_read_bitbuf_dword{}; + functions::read_bitbuf_string m_read_bitbuf_string{}; + functions::read_bitbuf_bool m_read_bitbuf_bool{}; + functions::read_bitbuf_array m_read_bitbuf_array{}; + functions::write_bitbuf_qword m_write_bitbuf_qword{}; + functions::write_bitbuf_dword m_write_bitbuf_dword{}; + functions::write_bitbuf_int64 m_write_bitbuf_int64{}; + functions::write_bitbuf_int32 m_write_bitbuf_int32{}; + functions::write_bitbuf_bool m_write_bitbuf_bool{}; + functions::write_bitbuf_array m_write_bitbuf_array{}; + // Bitbuffer Read/Write END + + // Received Event Signatures START + PVOID m_received_event{}; + functions::send_event_ack m_send_event_ack{}; + // Received Event Signatures END + + //Sync Signatures START + PVOID m_received_clone_create; + PVOID m_received_clone_sync; + PVOID m_can_apply_data; + functions::get_sync_tree_for_type m_get_sync_tree_for_type{}; + functions::get_sync_type_info m_get_sync_type_info{}; + functions::get_net_object m_get_net_object{}; + functions::read_bitbuffer_into_sync_tree m_read_bitbuffer_into_sync_tree{}; + //Sync Signatures END + + PVOID m_receive_net_message{}; + PVOID m_get_network_event_data{}; + PVOID m_assign_physical_index{}; + + Network** m_network; + + functions::start_get_session_by_gamer_handle m_start_get_session_by_gamer_handle; + functions::start_matchmaking_find_sessions m_start_matchmaking_find_sessions; + functions::join_session_by_info m_join_session_by_info; + + functions::reset_network_complaints m_reset_network_complaints{}; + + functions::fidevice_get_device m_fidevice_get_device{}; + uintptr_t m_fidevices{}; + uint16_t* m_fidevices_len{}; + functions::fipackfile_ctor m_fipackfile_ctor{}; + rage::fiPackfile** m_fipackfile_instances{}; + functions::fipackfile_open_archive m_fipackfile_open_archive{}; + functions::fipackfile_mount m_fipackfile_mount{}; + functions::fipackfile_unmount m_fipackfile_unmount{}; + + PVOID m_invalid_mods_crash_detour{}; + PVOID m_constraint_attachment_crash{}; + PVOID m_invalid_decal_crash{}; + PVOID m_task_parachute_object_0x270{}; + + int64_t** m_send_chat_ptr{}; + functions::send_chat_message m_send_chat_message{}; + + PVOID m_init_native_tables{}; + functions::script_vm m_script_vm{}; + + functions::generate_uuid m_generate_uuid{}; + std::uint64_t* m_host_token{}; + rage::rlGamerInfo* m_profile_gamer_info{}; // per profile gamer info + rage::rlGamerInfo* m_player_info_gamer_info{}; // the gamer info that is applied to CPlayerInfo + CCommunications** m_communications{}; + + PVOID m_serialize_ped_inventory_data_node; + PVOID m_serialize_vehicle_gadget_data_node; + functions::get_vehicle_gadget_array_size m_get_vehicle_gadget_array_size; + + PVOID m_handle_join_request; + functions::write_join_response_data m_write_join_response_data; + + functions::queue_packet m_queue_packet; + + PVOID m_sort_session_details; + + PVOID m_add_player_to_session; + PVOID m_send_chat_net_message; + + PVOID m_process_matchmaking_find_response; + PVOID m_serialize_player_data_msg; + + PVOID m_serialize_join_request_message; + + functions::give_pickup_rewards m_give_pickup_rewards{}; + functions::send_network_damage m_send_network_damage; + functions::request_ragdoll m_request_ragdoll; + functions::request_control m_request_control; + functions::clear_ped_tasks_network m_clear_ped_tasks_network; + + functions::get_connection_peer m_get_connection_peer{}; + functions::send_remove_gamer_cmd m_send_remove_gamer_cmd{}; + functions::handle_remove_gamer_cmd m_handle_remove_gamer_cmd{}; + + PVOID m_broadcast_net_array{}; + + rage::atSingleton* m_security; + PVOID m_prepare_metric_for_sending; + + PVOID m_queue_dependency; + PVOID m_interval_check_func; + + PVOID m_send_session_matchmaking_attributes; + + PVOID m_serialize_take_off_ped_variation_task; + + PVOID m_create_script_handler; + + functions::encode_session_info m_encode_session_info; + functions::decode_session_info m_decode_session_info; + functions::decode_peer_info m_decode_peer_info; + + datafile_commands::SveFileObject* m_main_file_object; + functions::load_cloud_file m_load_cloud_file; + functions::set_as_active_cloud_file m_set_as_active_cloud_file; + functions::save_json_data m_save_json_data; + + rage::netTime** m_network_time; + functions::sync_network_time m_sync_network_time; + + functions::send_packet m_send_packet; + functions::connect_to_peer m_connect_to_peer; + + PVOID m_fragment_physics_crash; + PVOID m_fragment_physics_crash_2; + + PVOID m_infinite_train_crash; + functions::get_next_carriage m_get_next_carriage; + + functions::get_entity_attached_to m_get_entity_attached_to; + + PVOID m_received_array_update; + + PVOID m_receive_pickup{}; + + PVOID m_write_player_camera_data_node{}; + + PVOID m_send_player_card_stats{}; + bool* m_force_player_card_refresh{}; + + PVOID m_serialize_stats{}; + + PVOID m_write_player_creation_data_node{}; + PVOID m_write_player_appearance_data_node{}; + + PVOID m_enumerate_audio_devices{}; + PVOID m_direct_sound_capture_create{}; + bool* m_refresh_audio_input{}; + + PVOID m_allow_weapons_in_vehicle{}; + + PVOID m_taskjump_constructor{}; + + PVOID m_write_vehicle_proximity_migration_data_node{}; + functions::migrate_object m_migrate_object{}; + }; +#pragma pack(pop) +} \ No newline at end of file diff --git a/src/gta_pointers_layout_info.hpp b/src/gta_pointers_layout_info.hpp new file mode 100644 index 00000000..04d846d7 --- /dev/null +++ b/src/gta_pointers_layout_info.hpp @@ -0,0 +1,13 @@ +#pragma once +#include "pointers.hpp" + +namespace big +{ + struct gta_pointers_layout_info + { + // get the beginning and the end of what we need to save / load + inline static constexpr size_t offset_of_cache_begin_field = offsetof(big::pointers, m_gta); + inline static constexpr size_t offset_of_cache_end_field = offsetof(big::pointers, m_gta) + sizeof(gta_pointers); + inline static constexpr size_t field_count = (offset_of_cache_end_field - offset_of_cache_begin_field) / sizeof(void*); + }; +} diff --git a/src/gta_util.hpp b/src/gta_util.hpp index 965e322f..715a91b8 100644 --- a/src/gta_util.hpp +++ b/src/gta_util.hpp @@ -11,7 +11,7 @@ namespace big::gta_util { inline CPed* get_local_ped() { - if (auto ped_factory = *g_pointers->m_ped_factory) + if (auto ped_factory = *g_pointers->m_gta.m_ped_factory) { return ped_factory->m_local_ped; } @@ -33,7 +33,7 @@ namespace big::gta_util inline CPlayerInfo* get_local_playerinfo() { - if (auto ped_factory = *g_pointers->m_ped_factory) + if (auto ped_factory = *g_pointers->m_gta.m_ped_factory) { if (auto ped = ped_factory->m_local_ped) { @@ -46,12 +46,12 @@ namespace big::gta_util inline CNetworkPlayerMgr* get_network_player_mgr() { - return *g_pointers->m_network_player_mgr; + return *g_pointers->m_gta.m_network_player_mgr; } inline Network* get_network() { - return *g_pointers->m_network; + return *g_pointers->m_gta.m_network; } template @@ -72,7 +72,7 @@ namespace big::gta_util template void execute_as_script(rage::joaat_t script_hash, F&& callback, Args&&... args) { - for (auto thread : *g_pointers->m_script_threads) + for (auto thread : *g_pointers->m_gta.m_script_threads) { if (!thread || !thread->m_context.m_thread_id || thread->m_context.m_script_hash != script_hash) continue; @@ -85,7 +85,7 @@ namespace big::gta_util inline GtaThread* find_script_thread(rage::joaat_t hash) { - for (auto thread : *g_pointers->m_script_threads) + for (auto thread : *g_pointers->m_gta.m_script_threads) { if (thread && thread->m_context.m_thread_id && thread->m_handler && thread->m_script_hash == hash) { @@ -98,7 +98,7 @@ namespace big::gta_util inline GtaThread* find_script_thread_by_id(std::uint32_t id) { - for (auto thread : *g_pointers->m_script_threads) + for (auto thread : *g_pointers->m_gta.m_script_threads) { if (thread && thread->m_handler && thread->m_context.m_thread_id == id) { @@ -111,7 +111,7 @@ namespace big::gta_util inline rage::scrProgram* find_script_program(rage::joaat_t hash) { - for (auto& script : *g_pointers->m_script_program_table) + for (auto& script : *g_pointers->m_gta.m_script_program_table) { if (script.m_program && script.m_program->m_name_hash == hash) return script.m_program; diff --git a/src/gui/components/nav_button.cpp b/src/gui/components/nav_button.cpp index b53fd60a..4d04b0d2 100644 --- a/src/gui/components/nav_button.cpp +++ b/src/gui/components/nav_button.cpp @@ -12,7 +12,7 @@ namespace big ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, {0, 5}); ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, {0, 2}); ImGui::PushStyleVar(ImGuiStyleVar_ItemInnerSpacing, {0, 0}); - bool result = ImGui::Button(text.data(), {((float)*g_pointers->m_resolution_x * 0.15f) - 30, 0}); + bool result = ImGui::Button(text.data(), {((float)*g_pointers->m_gta.m_resolution_x * 0.15f) - 30, 0}); ImGui::PopStyleVar(4); ImGui::PopStyleColor(3); diff --git a/src/hooking.cpp b/src/hooking.cpp index 62222d48..80ed5ad0 100644 --- a/src/hooking.cpp +++ b/src/hooking.cpp @@ -17,7 +17,7 @@ namespace big { hooking::hooking() : // Swapchain - m_swapchain_hook(*g_pointers->m_swapchain, hooks::swapchain_num_funcs) + m_swapchain_hook(*g_pointers->m_gta.m_swapchain, hooks::swapchain_num_funcs) { m_swapchain_hook.hook(hooks::swapchain_present_index, &hooks::swapchain_present); m_swapchain_hook.hook(hooks::swapchain_resizebuffers_index, &hooks::swapchain_resizebuffers); @@ -29,101 +29,101 @@ namespace big detour_hook_helper->m_detour_hook->set_target_and_create_hook(detour_hook_helper->m_on_hooking_available()); } - detour_hook_helper::add("SH", g_pointers->m_run_script_threads); + detour_hook_helper::add("SH", g_pointers->m_gta.m_run_script_threads); - detour_hook_helper::add("GLT", g_pointers->m_get_label_text); + detour_hook_helper::add("GLT", g_pointers->m_gta.m_get_label_text); - detour_hook_helper::add("CCP", g_pointers->m_check_chat_profanity); + detour_hook_helper::add("CCP", g_pointers->m_gta.m_check_chat_profanity); - detour_hook_helper::add("WPGSDN", g_pointers->m_write_player_game_state_data_node); + detour_hook_helper::add("WPGSDN", g_pointers->m_gta.m_write_player_game_state_data_node); - detour_hook_helper::add("GTS", g_pointers->m_gta_thread_start); - detour_hook_helper::add("GTK", g_pointers->m_gta_thread_kill); - detour_hook_helper::add("INT", g_pointers->m_init_native_tables); - detour_hook_helper::add("SVM", g_pointers->m_script_vm); + detour_hook_helper::add("GTS", g_pointers->m_gta.m_gta_thread_start); + detour_hook_helper::add("GTK", g_pointers->m_gta.m_gta_thread_kill); + detour_hook_helper::add("INT", g_pointers->m_gta.m_init_native_tables); + detour_hook_helper::add("SVM", g_pointers->m_gta.m_script_vm); - detour_hook_helper::add("NPMI", g_pointers->m_network_player_mgr_init); - detour_hook_helper::add("NPMS", g_pointers->m_network_player_mgr_shutdown); + detour_hook_helper::add("NPMI", g_pointers->m_gta.m_network_player_mgr_init); + detour_hook_helper::add("NPMS", g_pointers->m_gta.m_network_player_mgr_shutdown); - detour_hook_helper::add("RE", g_pointers->m_received_event); + detour_hook_helper::add("RE", g_pointers->m_gta.m_received_event); - detour_hook_helper::add("API", g_pointers->m_assign_physical_index); + detour_hook_helper::add("API", g_pointers->m_gta.m_assign_physical_index); - detour_hook_helper::add("RNM", g_pointers->m_receive_net_message); + detour_hook_helper::add("RNM", g_pointers->m_gta.m_receive_net_message); - detour_hook_helper::add("RCC", g_pointers->m_received_clone_create); - detour_hook_helper::add("RCS", g_pointers->m_received_clone_sync); - detour_hook_helper::add("CAD", g_pointers->m_can_apply_data); + detour_hook_helper::add("RCC", g_pointers->m_gta.m_received_clone_create); + detour_hook_helper::add("RCS", g_pointers->m_gta.m_received_clone_sync); + detour_hook_helper::add("CAD", g_pointers->m_gta.m_can_apply_data); - detour_hook_helper::add("GNED", g_pointers->m_get_network_event_data); - detour_hook_helper::add("WPGDN", g_pointers->m_write_player_gamer_data_node); + detour_hook_helper::add("GNED", g_pointers->m_gta.m_get_network_event_data); + detour_hook_helper::add("WPGDN", g_pointers->m_gta.m_write_player_gamer_data_node); - detour_hook_helper::add("IMCD", g_pointers->m_invalid_mods_crash_detour); - detour_hook_helper::add("CAC", g_pointers->m_constraint_attachment_crash); - detour_hook_helper::add("IDC", g_pointers->m_invalid_decal_crash); - detour_hook_helper::add("TPO270", g_pointers->m_task_parachute_object_0x270); + detour_hook_helper::add("IMCD", g_pointers->m_gta.m_invalid_mods_crash_detour); + detour_hook_helper::add("CAC", g_pointers->m_gta.m_constraint_attachment_crash); + detour_hook_helper::add("IDC", g_pointers->m_gta.m_invalid_decal_crash); + detour_hook_helper::add("TPO270", g_pointers->m_gta.m_task_parachute_object_0x270); - detour_hook_helper::add("UPAI", g_pointers->m_update_presence_attribute_int); - detour_hook_helper::add("UPAS", g_pointers->m_update_presence_attribute_string); + detour_hook_helper::add("UPAI", g_pointers->m_sc.m_update_presence_attribute_int); + detour_hook_helper::add("UPAS", g_pointers->m_sc.m_update_presence_attribute_string); - detour_hook_helper::add("SPIDN", g_pointers->m_serialize_ped_inventory_data_node); - detour_hook_helper::add("SVGDN", g_pointers->m_serialize_vehicle_gadget_data_node); + detour_hook_helper::add("SPIDN", g_pointers->m_gta.m_serialize_ped_inventory_data_node); + detour_hook_helper::add("SVGDN", g_pointers->m_gta.m_serialize_vehicle_gadget_data_node); - detour_hook_helper::add("HJR", g_pointers->m_handle_join_request); + detour_hook_helper::add("HJR", g_pointers->m_gta.m_handle_join_request); - detour_hook_helper::add("SSD", g_pointers->m_sort_session_details); + detour_hook_helper::add("SSD", g_pointers->m_gta.m_sort_session_details); - detour_hook_helper::add("APTS", g_pointers->m_add_player_to_session); - detour_hook_helper::add("SCM", g_pointers->m_send_chat_message); - detour_hook_helper::add("SCNM", g_pointers->m_send_chat_net_message); + detour_hook_helper::add("APTS", g_pointers->m_gta.m_add_player_to_session); + detour_hook_helper::add("SCM", g_pointers->m_gta.m_send_chat_message); + detour_hook_helper::add("SCNM", g_pointers->m_gta.m_send_chat_net_message); - detour_hook_helper::add("PMFR", g_pointers->m_process_matchmaking_find_response); - detour_hook_helper::add("SJPD", g_pointers->m_serialize_player_data_msg); + detour_hook_helper::add("PMFR", g_pointers->m_gta.m_process_matchmaking_find_response); + detour_hook_helper::add("SJPD", g_pointers->m_gta.m_serialize_player_data_msg); - detour_hook_helper::add("SJRM", g_pointers->m_serialize_join_request_message); + detour_hook_helper::add("SJRM", g_pointers->m_gta.m_serialize_join_request_message); - detour_hook_helper::add("SMFS", g_pointers->m_start_matchmaking_find_sessions); + detour_hook_helper::add("SMFS", g_pointers->m_gta.m_start_matchmaking_find_sessions); - detour_hook_helper::add("BNA", g_pointers->m_broadcast_net_array); + detour_hook_helper::add("BNA", g_pointers->m_gta.m_broadcast_net_array); - detour_hook_helper::add("SSMA", g_pointers->m_send_session_matchmaking_attributes); + detour_hook_helper::add("SSMA", g_pointers->m_gta.m_send_session_matchmaking_attributes); - detour_hook_helper::add("STOPVT", g_pointers->m_serialize_take_off_ped_variation_task); + detour_hook_helper::add("STOPVT", g_pointers->m_gta.m_serialize_take_off_ped_variation_task); - detour_hook_helper::add("CSH", g_pointers->m_create_script_handler); + detour_hook_helper::add("CSH", g_pointers->m_gta.m_create_script_handler); - detour_hook_helper::add("QD", g_pointers->m_queue_dependency); - detour_hook_helper::add("PMFS", g_pointers->m_prepare_metric_for_sending); + detour_hook_helper::add("QD", g_pointers->m_gta.m_queue_dependency); + detour_hook_helper::add("PMFS", g_pointers->m_gta.m_prepare_metric_for_sending); - detour_hook_helper::add("FPC", g_pointers->m_fragment_physics_crash); - detour_hook_helper::add("FPC2", g_pointers->m_fragment_physics_crash_2); + detour_hook_helper::add("FPC", g_pointers->m_gta.m_fragment_physics_crash); + detour_hook_helper::add("FPC2", g_pointers->m_gta.m_fragment_physics_crash_2); - detour_hook_helper::add("ITC", g_pointers->m_infinite_train_crash); + detour_hook_helper::add("ITC", g_pointers->m_gta.m_infinite_train_crash); - detour_hook_helper::add("RAU", g_pointers->m_received_array_update); + detour_hook_helper::add("RAU", g_pointers->m_gta.m_received_array_update); - detour_hook_helper::add("RPI", g_pointers->m_receive_pickup); + detour_hook_helper::add("RPI", g_pointers->m_gta.m_receive_pickup); - detour_hook_helper::add("WPCDN", g_pointers->m_write_player_camera_data_node); + detour_hook_helper::add("WPCDN", g_pointers->m_gta.m_write_player_camera_data_node); - detour_hook_helper::add("SPCS", g_pointers->m_send_player_card_stats); - detour_hook_helper::add("SS", g_pointers->m_serialize_stats); + detour_hook_helper::add("SPCS", g_pointers->m_gta.m_send_player_card_stats); + detour_hook_helper::add("SS", g_pointers->m_gta.m_serialize_stats); - detour_hook_helper::add("WPCDN", g_pointers->m_write_player_creation_data_node); - detour_hook_helper::add("WPADN", g_pointers->m_write_player_appearance_data_node); + detour_hook_helper::add("WPCDN", g_pointers->m_gta.m_write_player_creation_data_node); + detour_hook_helper::add("WPADN", g_pointers->m_gta.m_write_player_appearance_data_node); - detour_hook_helper::add("GMI", g_pointers->m_get_model_info); + detour_hook_helper::add("GMI", g_pointers->m_gta.m_get_model_info); - detour_hook_helper::add("TJC", g_pointers->m_taskjump_constructor); + detour_hook_helper::add("TJC", g_pointers->m_gta.m_taskjump_constructor); - detour_hook_helper::add("EAD", g_pointers->m_enumerate_audio_devices); - detour_hook_helper::add("DSCC", g_pointers->m_direct_sound_capture_create); + detour_hook_helper::add("EAD", g_pointers->m_gta.m_enumerate_audio_devices); + detour_hook_helper::add("DSCC", g_pointers->m_gta.m_direct_sound_capture_create); - detour_hook_helper::add("WVPMDN", g_pointers->m_write_vehicle_proximity_migration_data_node); + detour_hook_helper::add("WVPMDN", g_pointers->m_gta.m_write_vehicle_proximity_migration_data_node); - detour_hook_helper::add("FPFM", g_pointers->m_fipackfile_mount); + detour_hook_helper::add("FPFM", g_pointers->m_gta.m_fipackfile_mount); - detour_hook_helper::add("AWIV", g_pointers->m_allow_weapons_in_vehicle); + detour_hook_helper::add("AWIV", g_pointers->m_gta.m_allow_weapons_in_vehicle); g_hooking = this; } @@ -148,7 +148,7 @@ namespace big detour_hook_helper->m_detour_hook->enable(); } - for (auto& thread : *g_pointers->m_script_threads) + for (auto& thread : *g_pointers->m_gta.m_script_threads) { if (thread->m_handler) hook_script_handler((CGameScriptHandler*)thread->m_handler); diff --git a/src/hooks/info/get_network_event_data.cpp b/src/hooks/info/get_network_event_data.cpp index c4259dbf..20be0350 100644 --- a/src/hooks/info/get_network_event_data.cpp +++ b/src/hooks/info/get_network_event_data.cpp @@ -24,13 +24,13 @@ namespace big if (damage_data.m_weapon_used == RAGE_JOAAT("weapon_explosion")) break; - if (auto damager = g_pointers->m_handle_to_ptr(damage_data.m_damager_index); + if (auto damager = g_pointers->m_gta.m_handle_to_ptr(damage_data.m_damager_index); damager && damager->m_entity_type == 4 && reinterpret_cast(damager)->m_player_info) { if (auto player = g_player_service->get_by_host_token( reinterpret_cast(damager)->m_player_info->m_net_player_data.m_host_token)) { - if (auto victim = g_pointers->m_handle_to_ptr(damage_data.m_victim_index); + if (auto victim = g_pointers->m_gta.m_handle_to_ptr(damage_data.m_victim_index); victim && victim->m_entity_type == 4 && reinterpret_cast(victim)->m_player_info) { if (reinterpret_cast(damager)->m_damage_bits & (1 << 8)) diff --git a/src/hooks/misc/queue_dependency.cpp b/src/hooks/misc/queue_dependency.cpp index 12b4d9eb..9e845248 100644 --- a/src/hooks/misc/queue_dependency.cpp +++ b/src/hooks/misc/queue_dependency.cpp @@ -5,7 +5,7 @@ namespace big { void hooks::queue_dependency(void* dependency) { - if (dependency == g_pointers->m_interval_check_func) + if (dependency == g_pointers->m_gta.m_interval_check_func) { //LOG(INFO) << "Prevent attempt to queue a report to R*."; return; diff --git a/src/hooks/player_management/assign_physical_index.cpp b/src/hooks/player_management/assign_physical_index.cpp index 537a325c..a56cb0f5 100644 --- a/src/hooks/player_management/assign_physical_index.cpp +++ b/src/hooks/player_management/assign_physical_index.cpp @@ -59,7 +59,7 @@ namespace big plyr->is_admin = true; } } - if (g.notifications.player_join.above_map && *g_pointers->m_is_session_started) // prevent loading screen spam + if (g.notifications.player_join.above_map && *g_pointers->m_gta.m_is_session_started) // prevent loading screen spam notify::player_joined(player); if (g.notifications.player_join.log) diff --git a/src/hooks/protections/can_apply_data.cpp b/src/hooks/protections/can_apply_data.cpp index 4c751c51..6bf57df3 100644 --- a/src/hooks/protections/can_apply_data.cpp +++ b/src/hooks/protections/can_apply_data.cpp @@ -428,7 +428,7 @@ namespace big { if (i == (int)eNetObjType::NET_OBJ_TYPE_TRAILER) continue; - rage::netSyncTree* tree = g_pointers->m_get_sync_tree_for_type(*g_pointers->m_network_object_mgr, i); + rage::netSyncTree* tree = g_pointers->m_gta.m_get_sync_tree_for_type(*g_pointers->m_gta.m_network_object_mgr, i); if (tree->m_child_node_count > trees[i].second.size()) { LOG(FATAL) << "Cache nodes failed " << i << tree->m_child_node_count << " " << trees[i].second.size(); @@ -502,7 +502,7 @@ namespace big if (object->m_net_object && object->m_net_object->m_object_id == attached_to_net_id) return true; - object = g_pointers->m_get_entity_attached_to(object); + object = g_pointers->m_gta.m_get_entity_attached_to(object); i++; } diff --git a/src/hooks/protections/handle_join_request.cpp b/src/hooks/protections/handle_join_request.cpp index 2fa7b3d3..686aa570 100644 --- a/src/hooks/protections/handle_join_request.cpp +++ b/src/hooks/protections/handle_join_request.cpp @@ -15,7 +15,7 @@ namespace big { CMsgJoinResponse response{}; response.m_status_code = player->block_join_reason; - g_pointers->m_write_join_response_data(&response, ctx->m_join_response_data, 512, &ctx->m_join_response_size); + g_pointers->m_gta.m_write_join_response_data(&response, ctx->m_join_response_data, 512, &ctx->m_join_response_size); g_notification_service->push("BLOCK_JOIN"_T.data(), std::vformat("BLOCK_JOIN_INFO"_T, std::make_format_args(player->name))); return false; diff --git a/src/hooks/protections/infinite_train_crash.cpp b/src/hooks/protections/infinite_train_crash.cpp index 7d17ad2f..9dc12560 100644 --- a/src/hooks/protections/infinite_train_crash.cpp +++ b/src/hooks/protections/infinite_train_crash.cpp @@ -8,12 +8,12 @@ namespace big void* current_carriage = carriage; int count = 0; - while (g_pointers->m_get_next_carriage(current_carriage)) + while (g_pointers->m_gta.m_get_next_carriage(current_carriage)) { if (++count > 20) return nullptr; - current_carriage = g_pointers->m_get_next_carriage(current_carriage); + current_carriage = g_pointers->m_gta.m_get_next_carriage(current_carriage); } return current_carriage; diff --git a/src/hooks/protections/receive_net_message.cpp b/src/hooks/protections/receive_net_message.cpp index 7cdfcf93..29503f99 100644 --- a/src/hooks/protections/receive_net_message.cpp +++ b/src/hooks/protections/receive_net_message.cpp @@ -270,7 +270,7 @@ namespace big uint32_t counter = buffer.Read(32); uint32_t token = buffer.Read(32); uint32_t timestamp = buffer.Read(32); - uint32_t time_diff = (*g_pointers->m_network_time)->m_time_offset + frame->m_timestamp; + uint32_t time_diff = (*g_pointers->m_gta.m_network_time)->m_time_offset + frame->m_timestamp; if (action == 0) { diff --git a/src/hooks/protections/received_clone_sync.cpp b/src/hooks/protections/received_clone_sync.cpp index f9518f60..ae04b00a 100644 --- a/src/hooks/protections/received_clone_sync.cpp +++ b/src/hooks/protections/received_clone_sync.cpp @@ -11,7 +11,7 @@ namespace big return eAckCode::ACKCODE_FAIL; } - if (auto net_obj = g_pointers->m_get_net_object(mgr, object_id, true); net_obj && net_obj->m_object_type != (int16_t)object_type) + if (auto net_obj = g_pointers->m_gta.m_get_net_object(mgr, object_id, true); net_obj && net_obj->m_object_type != (int16_t)object_type) { notify::crash_blocked(src, "incorrect object type"); return eAckCode::ACKCODE_FAIL; diff --git a/src/hooks/protections/received_event.cpp b/src/hooks/protections/received_event.cpp index 04d07bc1..edc1b195 100644 --- a/src/hooks/protections/received_event.cpp +++ b/src/hooks/protections/received_event.cpp @@ -193,7 +193,7 @@ namespace big if (!player->is_valid() || !player->get_ped()) return; - g_pointers->m_send_network_damage(g_player_service->get_self()->get_ped(), + g_pointers->m_gta.m_send_network_damage(g_player_service->get_self()->get_ped(), player->get_ped(), (rage::fvector3*)&localPos, hitComponent, @@ -321,10 +321,10 @@ namespace big buffer->Seek(0); - auto object = g_pointers->m_get_net_object(*g_pointers->m_network_object_mgr, ownerNetId, true); + auto object = g_pointers->m_gta.m_get_net_object(*g_pointers->m_gta.m_network_object_mgr, ownerNetId, true); auto entity = object ? object->GetGameObject() : nullptr; - auto offset_object = g_pointers->m_get_net_object(*g_pointers->m_network_object_mgr, f210, true); + auto offset_object = g_pointers->m_gta.m_get_net_object(*g_pointers->m_gta.m_network_object_mgr, f210, true); if (f208 == 0 && entity && entity->m_entity_type == 4 && reinterpret_cast(entity)->m_player_info && player->m_player_info->m_ped && player->m_player_info->m_ped->m_net_object @@ -354,14 +354,14 @@ namespace big { if (event_id > 91u) { - g_pointers->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); return; } const auto event_name = *(char**)((DWORD64)event_manager + 8i64 * event_id + 243376); if (event_name == nullptr || source_player == nullptr || source_player->m_player_id < 0 || source_player->m_player_id >= 32) { - g_pointers->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); return; } @@ -386,7 +386,7 @@ namespace big buffer->ReadDword(&increment_stat_event->m_amount, 0x20); if (hooks::increment_stat_event(increment_stat_event.get(), source_player)) { - g_pointers->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); return; } buffer->Seek(0); @@ -404,7 +404,7 @@ namespace big if ((action >= 15 && action <= 18) || action == 33) { - g_pointers->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); notify::crash_blocked(source_player, "vehicle temp action"); return; } @@ -412,7 +412,7 @@ namespace big else if (type > ScriptEntityChangeType::SetVehicleExclusiveDriver || type < ScriptEntityChangeType::BlockingOfNonTemporaryEvents) { notify::crash_blocked(source_player, "invalid script entity change type"); - g_pointers->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); return; } buffer->Seek(0); @@ -427,7 +427,7 @@ namespace big if (hooks::scripted_game_event(scripted_game_event.get(), source_player)) { - g_pointers->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); return; } @@ -441,7 +441,7 @@ namespace big if (g_local_player && g_local_player->m_net_object && g_local_player->m_net_object->m_object_id == net_id) { - g_pointers->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); g.reactions.clear_ped_tasks.process(plyr); return; } @@ -455,7 +455,7 @@ namespace big if (g_local_player && g_local_player->m_net_object && g_local_player->m_net_object->m_object_id == net_id) { - g_pointers->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); g.reactions.remote_ragdoll.process(plyr); return; } @@ -495,7 +495,7 @@ namespace big if (g_local_player && g_local_player->m_vehicle && g_local_player->m_vehicle->m_net_object && g_local_player->m_vehicle->m_net_object->m_object_id == net_id && g_local_player->m_vehicle->m_driver == g_local_player) { - g_pointers->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); g.reactions.request_control_event.process(plyr); return; } @@ -528,7 +528,7 @@ namespace big // most definitely a crash LOG(INFO) << std::hex << std::uppercase << "0x" << id.m_hash; notify::crash_blocked(source_player, "rope"); - g_pointers->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); return; } } @@ -541,14 +541,14 @@ namespace big if (pop_group == 0 && (percentage == 0 || percentage == 103)) { notify::crash_blocked(source_player, "pop group override"); - g_pointers->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); return; } } else if (type > WorldStateDataType::VehiclePlayerLocking || type < WorldStateDataType::CarGen) { notify::crash_blocked(source_player, "invalid world state type"); - g_pointers->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); return; } @@ -563,7 +563,7 @@ namespace big if (hash == RAGE_JOAAT("WEAPON_UNARMED")) { notify::crash_blocked(source_player, "remove unarmed"); - g_pointers->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); return; } @@ -571,7 +571,7 @@ namespace big { g_notification_service->push_warning("PROTECTIONS"_T.data(), std::vformat("REMOVE_WEAPON_ATTEMPT"_T, std::make_format_args(source_player->get_name()))); - g_pointers->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); return; } @@ -586,7 +586,7 @@ namespace big { g_notification_service->push_warning("PROTECTIONS"_T.data(), std::vformat("REMOVE_ALL_WEAPONS_ATTEMPT"_T, std::make_format_args(source_player->get_name()))); - g_pointers->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); return; } @@ -613,7 +613,7 @@ namespace big if (object_type < eNetObjType::NET_OBJ_TYPE_AUTOMOBILE || object_type > eNetObjType::NET_OBJ_TYPE_TRAIN) { notify::crash_blocked(source_player, "out of bounds give control type"); - g_pointers->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); return; } } @@ -630,7 +630,7 @@ namespace big { notify::crash_blocked(source_player, "sound spam"); } - g_pointers->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); return; } diff --git a/src/hooks/protections/serialize_vehicle_gadget_data_node.cpp b/src/hooks/protections/serialize_vehicle_gadget_data_node.cpp index e42695c1..39ef4e44 100644 --- a/src/hooks/protections/serialize_vehicle_gadget_data_node.cpp +++ b/src/hooks/protections/serialize_vehicle_gadget_data_node.cpp @@ -42,7 +42,7 @@ namespace big if (data->IsSizeCalculator()) size = 94; else - size = g_pointers->m_get_vehicle_gadget_array_size(node->m_gadget_data[i].m_gadget_type); + size = g_pointers->m_gta.m_get_vehicle_gadget_array_size(node->m_gadget_data[i].m_gadget_type); data->SerializeArray(&node->m_gadget_data[i].m_data, size); } diff --git a/src/hooks/script/script_vm.cpp b/src/hooks/script/script_vm.cpp index c4700b68..bf595587 100644 --- a/src/hooks/script/script_vm.cpp +++ b/src/hooks/script/script_vm.cpp @@ -25,7 +25,7 @@ namespace big if (auto bytecode = g_script_patcher_service->get_script_bytecode(program->m_name_hash)) program->m_code_blocks = bytecode; - if (g_pointers->m_script_globals[0xA]) + if (g_pointers->m_gta.m_script_globals[0xA]) { scr_globals::globalplayer_bd.as()->Entries[self::id].CurrentShopIndex = old_shop_index; scr_globals::globalplayer_bd.as()->Entries[self::id].CayoPericoFlags = old_cayo_flags; @@ -38,7 +38,7 @@ namespace big { m_program->m_code_blocks = m_orig_bytecode; - if (g_pointers->m_script_globals[0xA]) + if (g_pointers->m_gta.m_script_globals[0xA]) { old_shop_index = scr_globals::globalplayer_bd.as()->Entries[self::id].CurrentShopIndex; old_cayo_flags = scr_globals::globalplayer_bd.as()->Entries[self::id].CayoPericoFlags; diff --git a/src/hooks/toxic/broadcast_net_array.cpp b/src/hooks/toxic/broadcast_net_array.cpp index 7c0f7c32..b18bf5ab 100644 --- a/src/hooks/toxic/broadcast_net_array.cpp +++ b/src/hooks/toxic/broadcast_net_array.cpp @@ -37,13 +37,13 @@ namespace big { orig_gsbd = *scr_globals::gsbd.as(); *scr_globals::gsbd.as() = 5; - g_pointers->m_broadcast_patch->apply(); + broadcast_net_array::m_patch->apply(); } if (need_to_modify_wanted_level) { scr_globals::globalplayer_bd.as()->Entries[self::id].RemoteWantedLevelPlayer = target->m_player_id; - g_pointers->m_broadcast_patch->apply(); + broadcast_net_array::m_patch->apply(); } if (need_to_turn_player_into_beast) @@ -64,39 +64,39 @@ namespace big *script_local(g.m_hunt_the_beast_thread->m_stack, scr_locals::am_hunt_the_beast::broadcast_idx).at(1).at(2).as() = INT_MAX;// stopwatch time *script_local(g.m_hunt_the_beast_thread->m_stack, scr_locals::am_hunt_the_beast::broadcast_idx).at(83).as() = 0;// transformed bitset - g_pointers->m_broadcast_patch->apply(); + broadcast_net_array::m_patch->apply(); } if (need_to_randomize_replay_protection) { *scr_globals::gsbd_fm_events.at(9).as() = __rdtsc(); *scr_globals::gsbd_fm_events.at(10).as() = __rdtsc(); - g_pointers->m_broadcast_patch->apply(); + broadcast_net_array::m_patch->apply(); } int ret = g_hooking->get_original()(_this, target, bit_buffer, counter, elem_start, silent); if (need_to_use_end_session_kick) { - g_pointers->m_broadcast_patch->restore(); + broadcast_net_array::m_patch->restore(); *scr_globals::gsbd.as() = orig_gsbd; } if (need_to_modify_wanted_level) { - g_pointers->m_broadcast_patch->restore(); + broadcast_net_array::m_patch->restore(); } if (need_to_turn_player_into_beast) { *script_local(g.m_hunt_the_beast_thread->m_stack, scr_locals::am_hunt_the_beast::broadcast_idx).at(1).at(7).as() = orig_player; *script_local(g.m_hunt_the_beast_thread->m_stack, scr_locals::am_hunt_the_beast::broadcast_idx).at(1).at(6).as() = orig_participant; - g_pointers->m_broadcast_patch->restore(); + broadcast_net_array::m_patch->restore(); } if (need_to_randomize_replay_protection) { - g_pointers->m_broadcast_patch->restore(); + broadcast_net_array::m_patch->restore(); } return ret; diff --git a/src/invoker.cpp b/src/invoker.cpp index d22aa379..f2d6a6cd 100644 --- a/src/invoker.cpp +++ b/src/invoker.cpp @@ -22,7 +22,7 @@ namespace big for (const rage::scrNativeMapping& mapping : g_crossmap) { rage::scrNativeHandler handler = - g_pointers->m_get_native_handler(g_pointers->m_native_registration_table, mapping.second); + g_pointers->m_gta.m_get_native_handler(g_pointers->m_gta.m_native_registration_table, mapping.second); m_handler_cache.emplace(mapping.first, handler); } @@ -43,9 +43,9 @@ namespace big [this, hash, handler] { __try { - _call_asm(&m_call_context, handler, g_pointers->m_native_return); + _call_asm(&m_call_context, handler, g_pointers->m_gta.m_native_return); // handler(&m_call_context); - g_pointers->m_fix_vectors(&m_call_context); + g_pointers->m_gta.m_fix_vectors(&m_call_context); } __except (EXCEPTION_EXECUTE_HANDLER) { diff --git a/src/main.cpp b/src/main.cpp index 813ff985..85b2a89b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,4 +1,5 @@ #include "backend/backend.hpp" +#include "byte_patch_manager.hpp" #include "common.hpp" #include "core/globals.hpp" #include "fiber_pool.hpp" @@ -11,8 +12,6 @@ #include "script_mgr.hpp" #include "services/api/api_service.hpp" #include "services/context_menu/context_menu_service.hpp" -#include "services/orbital_drone/orbital_drone.hpp" -#include "services/vehicle/vehicle_control_service.hpp" #include "services/custom_text/custom_text_service.hpp" #include "services/globals/globals_service.hpp" #include "services/gta_data/gta_data_service.hpp" @@ -28,6 +27,7 @@ #include "services/players/player_service.hpp" #include "services/script_patcher/script_patcher_service.hpp" #include "services/vehicle/handling_service.hpp" +#include "services/vehicle/vehicle_control_service.hpp" #include "thread_pool.hpp" #include "version.hpp" @@ -74,6 +74,9 @@ BOOL APIENTRY DllMain(HMODULE hmod, DWORD reason, PVOID) auto pointers_instance = std::make_unique(); LOG(INFO) << "Pointers initialized."; + auto byte_patch_manager_instance = std::make_unique(); + LOG(INFO) << "Byte Patch Manager initialized."; + auto renderer_instance = std::make_unique(); LOG(INFO) << "Renderer initialized."; auto gui_instance = std::make_unique(); @@ -192,6 +195,9 @@ BOOL APIENTRY DllMain(HMODULE hmod, DWORD reason, PVOID) renderer_instance.reset(); LOG(INFO) << "Renderer uninitialized."; + byte_patch_manager_instance.reset(); + LOG(INFO) << "Byte Patch Manager uninitialized."; + pointers_instance.reset(); LOG(INFO) << "Pointers uninitialized."; diff --git a/src/memory/all.hpp b/src/memory/all.hpp index a2191347..9b7dc43d 100644 --- a/src/memory/all.hpp +++ b/src/memory/all.hpp @@ -6,3 +6,4 @@ #include "module.hpp" #include "pattern.hpp" #include "range.hpp" +#include "signature.hpp" diff --git a/src/memory/batch.cpp b/src/memory/batch.cpp deleted file mode 100644 index 18933f0a..00000000 --- a/src/memory/batch.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#include "batch.hpp" - -#include "common.hpp" -#include "range.hpp" - -#include //std::async - -static std::mutex s_entry_mutex; -static std::vector> g_futures; - -namespace memory -{ - void batch::add(std::string name, pattern pattern, std::function callback) - { - m_entries.emplace_back(std::move(name), std::move(pattern), std::move(callback)); - } - - bool scan_pattern_and_execute_callback(range region, memory::batch::entry entry) - { - if (auto result = region.scan(entry.m_pattern)) - { - if (entry.m_callback) - { - std::lock_guard lock(s_entry_mutex);// Acquire a lock on the mutex to synchronize access. - - std::invoke(std::move(entry.m_callback), result); - LOG(INFO) << "Found '" << entry.m_name << "' GTA5.exe+" - << HEX_TO_UPPER(result.as() - region.begin().as()); - - return true; - } - } - - LOG(WARNING) << "Failed to find '" << entry.m_name << "'."; - - return false; - } - - bool batch::run(range region) - { - for (auto& entry : m_entries) - { - g_futures.emplace_back(std::async(&scan_pattern_and_execute_callback, region, entry)); - } - - bool found_all_patterns = true; - for (auto& future : g_futures) - { - future.wait(); - - if (!future.get()) - found_all_patterns = false; - } - - m_entries.clear(); - g_futures.clear(); - - return found_all_patterns; - } -} diff --git a/src/memory/batch.hpp b/src/memory/batch.hpp index 54b5094e..37c5b716 100644 --- a/src/memory/batch.hpp +++ b/src/memory/batch.hpp @@ -1,35 +1,118 @@ #pragma once #include "pattern.hpp" +#include "signature.hpp" +#include "range.hpp" -#include -#include +#include namespace memory { - class batch + template + struct batch { - public: - explicit batch() = default; - ~batch() noexcept = default; + std::array m_entries; - void add(std::string name, pattern pattern, std::function callback); - bool run(range region); - - struct entry + constexpr batch(std::array entries) { - std::string m_name; - pattern m_pattern; - std::function m_callback; + m_entries = entries; + } + }; - explicit entry(std::string name, pattern pattern, std::function callback) : - m_name(std::move(name)), - m_pattern(std::move(pattern)), - m_callback(std::move(callback)) + template + struct batch_and_hash + { + batch m_batch; + uint32_t m_hash; + }; + + struct signature_hasher + { + static inline constexpr uint32_t FNV_PRIME_32 = 16777619u; + static inline constexpr uint32_t FNV_OFFSET_32 = 2166136261u; + + static inline constexpr uint32_t fnv1a_32(const char* str, uint32_t hash = FNV_OFFSET_32) noexcept + { + return (str[0] == '\0') ? hash : fnv1a_32(&str[1], (hash ^ static_cast(str[0])) * FNV_PRIME_32); + } + + template + static inline constexpr uint32_t compute_hash(uint32_t hash) + { + hash = fnv1a_32(sig.m_ida, hash); + + return hash; + } + + template + static inline constexpr uint32_t add(uint32_t hash = FNV_OFFSET_32) + { + hash = compute_hash(hash); + + if constexpr (sizeof...(rest_sigs) > 0) { + hash = add(hash); } - }; - private: - std::vector m_entries; + return hash; + } + }; + + template + static inline constexpr auto make_batch(uint32_t hash = signature_hasher::FNV_OFFSET_32) + { + constexpr std::array a1 = {args...}; + + constexpr memory::batch h(a1); + + return batch_and_hash{h, signature_hasher::add()}; + } + + struct batch_runner + { + inline static std::mutex s_entry_mutex; + inline static std::vector> g_futures; + + template + inline static bool run(const memory::batch batch, range region) + { + for (auto& entry : batch.m_entries) + { + g_futures.emplace_back(std::async(&scan_pattern_and_execute_callback, region, entry)); + } + + bool found_all_patterns = true; + for (auto& future : g_futures) + { + future.wait(); + + if (!future.get()) + found_all_patterns = false; + } + + g_futures.clear(); + + return found_all_patterns; + } + + inline static bool scan_pattern_and_execute_callback(range region, signature entry) + { + if (auto result = region.scan(entry.m_ida)) + { + if (entry.m_on_signature_found) + { + std::lock_guard lock(s_entry_mutex); // Acquire a lock on the mutex to synchronize access. + + std::invoke(std::move(entry.m_on_signature_found), result); + LOG(INFO) << "Found '" << entry.m_name << "' GTA5.exe+" + << HEX_TO_UPPER(result.as() - region.begin().as()); + + return true; + } + } + + LOG(WARNING) << "Failed to find '" << entry.m_name << "'."; + + return false; + } }; } diff --git a/src/memory/fwddec.hpp b/src/memory/fwddec.hpp index 8da2a60f..0e396596 100644 --- a/src/memory/fwddec.hpp +++ b/src/memory/fwddec.hpp @@ -7,4 +7,5 @@ namespace memory class module; class pattern; class pattern_batch; + class byte_patch; } diff --git a/src/memory/signature.hpp b/src/memory/signature.hpp new file mode 100644 index 00000000..71aae7e7 --- /dev/null +++ b/src/memory/signature.hpp @@ -0,0 +1,11 @@ +#pragma once + +namespace memory +{ + struct signature + { + const char* m_name; + const char* m_ida; + void (*m_on_signature_found)(memory::handle ptr); + }; +} diff --git a/src/native_hooks/native_hooks.cpp b/src/native_hooks/native_hooks.cpp index 3ed27ada..781e06e1 100644 --- a/src/native_hooks/native_hooks.cpp +++ b/src/native_hooks/native_hooks.cpp @@ -66,7 +66,7 @@ namespace big auto native = replacement_hash; map_native(&native); - auto og_handler = g_pointers->m_get_native_handler(g_pointers->m_native_registration_table, native); + auto og_handler = g_pointers->m_gta.m_get_native_handler(g_pointers->m_gta.m_native_registration_table, native); if (!og_handler) continue; @@ -149,7 +149,7 @@ namespace big add_native_detour(RAGE_JOAAT("fm_lts_creator"), 0x3D3D8B3BE5A83D35, creator::GET_USED_CREATOR_BUDGET); add_native_detour(RAGE_JOAAT("fm_survival_creator"), 0x3D3D8B3BE5A83D35, creator::GET_USED_CREATOR_BUDGET); - for (auto& entry : *g_pointers->m_script_program_table) + for (auto& entry : *g_pointers->m_gta.m_script_program_table) if (entry.m_program) hook_program(entry.m_program); diff --git a/src/native_hooks/network_session_host.hpp b/src/native_hooks/network_session_host.hpp index ab8afbcd..8a78a79d 100644 --- a/src/native_hooks/network_session_host.hpp +++ b/src/native_hooks/network_session_host.hpp @@ -11,7 +11,7 @@ namespace big { if (g.session.join_queued) { - g_pointers->m_join_session_by_info(*g_pointers->m_network, &g.session.info, 1, 1 | 2, nullptr, 0); + g_pointers->m_gta.m_join_session_by_info(*g_pointers->m_gta.m_network, &g.session.info, 1, 1 | 2, nullptr, 0); g.session.join_queued = false; src->set_return_value(TRUE); } diff --git a/src/packet.cpp b/src/packet.cpp index 741a6f9a..a6308127 100644 --- a/src/packet.cpp +++ b/src/packet.cpp @@ -15,7 +15,7 @@ namespace big void packet::send(uint32_t msg_id) { - g_pointers->m_queue_packet(gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr, + g_pointers->m_gta.m_queue_packet(gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr, msg_id, m_data, (m_buffer.m_curBit + 7) >> 3, @@ -31,7 +31,7 @@ namespace big void packet::send(int peer_id, int connection_id) { auto mgr = gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr; - auto peer = g_pointers->m_get_connection_peer(mgr, peer_id); - g_pointers->m_send_packet(mgr, peer, connection_id, m_data, (m_buffer.m_curBit + 7) >> 3, 0x1000000); + auto peer = g_pointers->m_gta.m_get_connection_peer(mgr, peer_id); + g_pointers->m_gta.m_send_packet(mgr, peer, connection_id, m_data, (m_buffer.m_curBit + 7) >> 3, 0x1000000); } } \ No newline at end of file diff --git a/src/pointers.cpp b/src/pointers.cpp index dcb75200..f9341277 100644 --- a/src/pointers.cpp +++ b/src/pointers.cpp @@ -1,838 +1,1385 @@ #include "pointers.hpp" -#include "common.hpp" +#include "gta_pointers_layout_info.hpp" #include "hooking.hpp" #include "memory/all.hpp" #include "rage/atSingleton.hpp" +#include "sc_pointers_layout_info.hpp" #include "security/RageSecurity.hpp" -extern "C" void sound_overload_detour(); -std::uint64_t g_sound_overload_ret_addr; - namespace big { - bool pointers::is_pointers_cache_up_to_date(memory::batch& version_batch, const memory::module& mem_region) + constexpr auto pointers::get_gta_batch() { - if (version_batch.run(mem_region)) - { - m_pointers_cache.load(); + // clang-format off - if (m_pointers_cache.up_to_date(m_game_version_uint32_t, m_online_version_float)) - { - LOG(INFO) << "Pointers cache is up to date, using it."; + constexpr auto batch_and_hash = memory::make_batch< + // Screen Resolution + { + "SR", + "66 0F 6E 0D ? ? ? ? 0F B7 3D", + [](memory::handle ptr) + { + g_pointers->m_gta.m_resolution_x = ptr.sub(4).rip().as(); + g_pointers->m_gta.m_resolution_y = ptr.add(4).rip().as(); + } + }, + // Region Code + { + "RC", + "48 83 EC 28 83 3D ? ? ? ? ? 75 10", + [](memory::handle ptr) + { + g_pointers->m_gta.m_region_code = ptr.add(16).rip().add(1).as(); + } + }, + // Game State + { + "GS", + "83 3D ? ? ? ? ? 75 17 8B 43 20 25", + [](memory::handle ptr) + { + g_pointers->m_gta.m_game_state = ptr.add(2).rip().add(1).as(); + } + }, + // Is Session Started + { + "ISA", + "40 38 35 ? ? ? ? 75 0E 4C 8B C3 49 8B D7 49 8B CE", + [](memory::handle ptr) + { + g_pointers->m_gta.m_is_session_started = ptr.add(3).rip().as(); + } + }, + // Ped Factory + { + "PF", + "48 8B 05 ? ? ? ? 48 8B 48 08 48 85 C9 74 52 8B 81", + [](memory::handle ptr) + { + g_pointers->m_gta.m_ped_factory = ptr.add(3).rip().as(); + } + }, + // Network Player Manager + { + "NPM", + "48 8B 0D ? ? ? ? 8A D3 48 8B 01 FF 50 ? 4C 8B 07 48 8B CF", + [](memory::handle ptr) + { + g_pointers->m_gta.m_network_player_mgr = ptr.add(3).rip().as(); + } + }, + // Init Native Tables & Native Handlers + { + "NH", + "48 8D 0D ? ? ? ? 48 8B 14 FA E8 ? ? ? ? 48 85 C0 75 0A", + [](memory::handle ptr) + { + g_pointers->m_gta.m_init_native_tables = ptr.sub(37).as(); + g_pointers->m_gta.m_native_registration_table = ptr.add(3).rip().as(); + g_pointers->m_gta.m_get_native_handler = ptr.add(12).rip().as(); + } + }, + // Fix Vectors + { + "FV", + "83 79 18 00 48 8B D1 74 4A FF 4A 18 48 63 4A 18 48 8D 41 04 48 8B 4C CA", + [](memory::handle ptr) + { + g_pointers->m_gta.m_fix_vectors = ptr.as(); + } + }, + // Script Threads + { + "ST", + "45 33 F6 8B E9 85 C9 B8", + [](memory::handle ptr) + { + g_pointers->m_gta.m_script_threads = ptr.sub(4).rip().sub(8).as(); + g_pointers->m_gta.m_run_script_threads = ptr.sub(0x1F).as(); + } + }, + // Script Programs + { + "SP", + "48 8B 1D ? ? ? ? 41 83 F8 FF", + [](memory::handle ptr) + { + g_pointers->m_gta.m_script_program_table = ptr.add(3).rip().as(); + } + }, + // Script Global + { + "SG", + "48 8D 15 ? ? ? ? 4C 8B C0 E8 ? ? ? ? 48 85 FF 48 89 1D", + [](memory::handle ptr) + { + g_pointers->m_gta.m_script_globals = ptr.add(3).rip().as(); + } + }, + // Game Script Handle Manager + { + "CGSHM", + "48 8B 0D ? ? ? ? 4C 8B CE E8 ? ? ? ? 48 85 C0 74 05 40 32 FF", + [](memory::handle ptr) + { + g_pointers->m_gta.m_script_handler_mgr = ptr.add(3).rip().as(); + } + }, + // Swapchain + { + "S", + "48 8B 0D ? ? ? ? 48 8B 01 44 8D 43 01 33 D2 FF 50 40 8B C8", + [](memory::handle ptr) + { + g_pointers->m_gta.m_swapchain = ptr.add(3).rip().as(); + } + }, + // World Model Spawn Bypass + { + "WMSB", + "48 85 C0 0F 84 ? ? ? ? 8B 48 50", + [](memory::handle ptr) + { + g_pointers->m_gta.m_world_model_spawn_bypass = ptr.as(); + } + }, + // Native Return Spoofer + { + "NRF", + "FF E3", + [](memory::handle ptr) + { + g_pointers->m_gta.m_native_return = ptr.add(0).as(); + } + }, + // GTA Thread Start + { + "GTS", + "48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 8B FA 85 D2 75 2A 8B 15", + [](memory::handle ptr) + { + g_pointers->m_gta.m_gta_thread_start = ptr.as(); + } + }, + // GTA Thread Kill + { + "TK", + "48 89 5C 24 ? 57 48 83 EC 20 48 83 B9 ? ? ? ? ? 48 8B D9 74 14", + [](memory::handle ptr) + { + g_pointers->m_gta.m_gta_thread_kill = ptr.as(); + } + }, + // Trigger Script Event + { + "TSE", + "45 8B F0 41 8B F9 48 8B EA", + [](memory::handle ptr) + { + g_pointers->m_gta.m_trigger_script_event = ptr.sub(0x1C).as(); + } + }, + // Received Event Hook + { + "REH", + "66 41 83 F9 ? 0F 83", + [](memory::handle ptr) + { + g_pointers->m_gta.m_received_event = ptr.as(); + } + }, + // Send Event Acknowledge + { + "SEA", + "E8 ? ? ? ? 66 83 7B 08 5B", + [](memory::handle ptr) + { + g_pointers->m_gta.m_send_event_ack = ptr.add(1).rip().as(); + } + }, + // Read Bitbuffer WORD/DWORD + { + "RBWD", + "48 89 74 24 ? 57 48 83 EC 20 48 8B D9 33 C9 41 8B F0 8A", + [](memory::handle ptr) + { + g_pointers->m_gta.m_read_bitbuf_dword = ptr.sub(5).as(); + } + }, + // Read Bitbuffer Array + { + "RBA", + "48 89 5C 24 ? 57 48 83 EC 30 41 8B F8 4C", + [](memory::handle ptr) + { + g_pointers->m_gta.m_read_bitbuf_array = ptr.as(); + } + }, + // Read Bitbuffer String + { + "RBS", + "E8 ? ? ? ? 48 8D 4F 3C", + [](memory::handle ptr) + { + g_pointers->m_gta.m_read_bitbuf_string = ptr.add(1).rip().as(); + } + }, + // Read Bitbuffer Boolean + { + "RBB", + "E8 ? ? ? ? 84 C0 74 41 48 8D 56 2C", + [](memory::handle ptr) + { + g_pointers->m_gta.m_read_bitbuf_bool = ptr.add(1).rip().as(); + } + }, + // Write Bitbuffer WORD/DWORD + { + "WBD", + "48 8B C4 48 89 58 08 48 89 68 10 48 89 70 18 48 89 78 20 41 56 48 83 EC 20 8B EA BF 01", + [](memory::handle ptr) + { + g_pointers->m_gta.m_write_bitbuf_dword = ptr.as(); + } + }, + // Write Bitbuffer QWORD + { + "WBQ", + "48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 57 48 83 EC 20 41 8B F0 48 8B EA 48 8B D9 41 83 F8 20", + [](memory::handle ptr) + { + g_pointers->m_gta.m_write_bitbuf_qword = ptr.as(); + } + }, + // Write Bitbuffer Int64 + { + "WBI64", + "E8 ? ? ? ? 8A 53 39 48 8B CF", + [](memory::handle ptr) + { + g_pointers->m_gta.m_write_bitbuf_int64 = ptr.add(1).rip().as(); + } + }, + // Write Bitbuffer Int32 + { + "WBI32", + "E8 ? ? ? ? 8A 53 74", + [](memory::handle ptr) + { + g_pointers->m_gta.m_write_bitbuf_int32 = ptr.add(1).rip().as(); + } + }, + // Write Bitbuffer Boolean + { + "WBB", + "E8 ? ? ? ? 8A 57 39", + [](memory::handle ptr) + { + g_pointers->m_gta.m_write_bitbuf_bool = ptr.add(1).rip().as(); + } + }, + // Write Bitbuffer Array + { + "WBA", + "E8 ? ? ? ? 01 7E 08", + [](memory::handle ptr) + { + g_pointers->m_gta.m_write_bitbuf_array = ptr.add(1).rip().as(); + } + }, + // Write Player Game State Data Node + { + "WPGSDN", + "48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 41 54 41 55 41 56 41 57 48 83 EC 30 0F B7 81", + [](memory::handle ptr) + { + g_pointers->m_gta.m_write_player_game_state_data_node = ptr.as(); + } + }, + // Replay Interface + { + "RI", + "0F B7 44 24 ? 66 89 44 4E", + [](memory::handle ptr) + { + g_pointers->m_gta.m_replay_interface = ptr.add(0x1F).rip().as(); + } + }, + // Ptr To Handle + { + "PTH", + "48 8B F9 48 83 C1 10 33 DB", + [](memory::handle ptr) + { + g_pointers->m_gta.m_ptr_to_handle = ptr.sub(0x15).as(); + } + }, + // Handle To Ptr + { + "GSH", + "83 F9 FF 74 31 4C 8B 0D", + [](memory::handle ptr) + { + g_pointers->m_gta.m_handle_to_ptr = ptr.as(); + } + }, + // CNetworkObjectMgr + { + "CNOM", + "48 8B 0D ? ? ? ? 45 33 C0 E8 ? ? ? ? 33 FF 4C 8B F0", + [](memory::handle ptr) + { + g_pointers->m_gta.m_network_object_mgr = ptr.add(3).rip().as(); + } + }, + // Network Player Mgr Init + { + "NPMI", + "41 56 48 83 EC ? 48 8B F1 B9 ? ? ? ? 49 8B F9 41 8B E8 4C 8B F2 E8", + [](memory::handle ptr) + { + g_pointers->m_gta.m_network_player_mgr_init = ptr.sub(0x13).as(); + } + }, + // Network Player Mgr Shutdown + { + "NPMS", + "48 8D 9F ? ? ? ? EB ? 48 8B 13 48 85 D2 74 ? 48 8B CB E8 ? ? ? ? 48 83 7B ? ? 75 ? 48 8D 9F", + [](memory::handle ptr) + { + g_pointers->m_gta.m_network_player_mgr_shutdown = ptr.sub(0x1A).as(); + } + }, + // FriendRegistry + { + "FR", + "3B 0D ? ? ? ? 73 17", + [](memory::handle ptr) + { + g_pointers->m_gta.m_friend_registry = ptr.add(2).rip().as(); + } + }, + // GET_SCREEN_COORDS_FROM_WORLD_COORDS + { + "GSCFWC", + "E8 ? ? ? ? 84 C0 74 19 F3 0F 10 44 24", + [](memory::handle ptr) + { + g_pointers->m_gta.m_get_screen_coords_for_world_coords = ptr.add(1).rip().as(); + } + }, + // GET_GAMEPLAY_CAM_COORDS + { + "GGCC", + "8B 90 ? ? ? ? 89 13", + [](memory::handle ptr) + { + g_pointers->m_gta.m_get_gameplay_cam_coords = ptr.sub(0xE).as(); + } + }, + // Give Pickup Reward + { + "GPR", + "48 8B C8 33 C0 48 85 C9 74 0A 44 8B C3 8B D7 E8", + [](memory::handle ptr) + { + g_pointers->m_gta.m_give_pickup_rewards = ptr.sub(0x28).as(); + } + }, + // Write Player Gamer Data Node + { + "WPGDN", + "48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 48 81 C1 ? ? ? ? 48 8B DA E8", + [](memory::handle ptr) + { + g_pointers->m_gta.m_write_player_gamer_data_node = ptr.as(); + } + }, + // Receive Net Message + { + "RNM", + "48 83 EC 20 4C 8B 71 50 33 ED", + [](memory::handle ptr) + { + g_pointers->m_gta.m_receive_net_message = ptr.sub(0x19).as(); + } + }, + // Get Network Event Data + { + "GNED", + "53 43 52 49 50 54 5F 4E 45 54 57 4F 52 4B", + [](memory::handle ptr) + { + g_pointers->m_gta.m_get_network_event_data = *ptr.sub(0x38).as(); + } + }, + // Assign Physical Index + { + "API", + "48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 41 54 41 55 41 56 41 57 48 83 EC 20 41 8A E8", + [](memory::handle ptr) + { + g_pointers->m_gta.m_assign_physical_index = ptr.as(); + } + }, + // Received Clone Create + { + "RCC", + "48 8B C4 66 44 89 48", + [](memory::handle ptr) + { + g_pointers->m_gta.m_received_clone_create = ptr.as(); + } + }, + // Can Apply Data + { + "CAD", + "E8 ? ? ? ? 84 C0 0F 84 AF 01 00 00 48 8B 03", + [](memory::handle ptr) + { + g_pointers->m_gta.m_can_apply_data = ptr.add(1).rip().as(); + } + }, + // Received clone sync & Get sync tree for type & Get net object for player & Get sync type info & Get net object + { + "RCS/GSTFT/GNOFP/GNO/GSTI", + "4C 8B FA 41 0F B7 D1", + [](memory::handle ptr) + { + g_pointers->m_gta.m_received_clone_sync = ptr.sub(0x1D).as(); + g_pointers->m_gta.m_get_sync_tree_for_type = ptr.add(0x14).rip().as(); // 0F B7 CA 83 F9 07 .as() + g_pointers->m_gta.m_get_net_object = ptr.add(0x76).rip().as(); // E8 ? ? ? ? 0F B7 53 7C .add(1).rip().as() + g_pointers->m_gta.m_get_sync_type_info = ptr.add(0x8C).rip().as(); // 44 0F B7 C1 4C 8D 0D .as() + } + }, + // Read Bitbuffer Into Sync Tree + { + "RBIST", + "E8 ? ? ? ? 48 8B BC 24 B0 00 00 00", + [](memory::handle ptr) + { + g_pointers->m_gta.m_read_bitbuffer_into_sync_tree = ptr.add(1).rip().as(); + } + }, + // Model Hash Table + { + "MHT", + "4C 03 05 ? ? ? ? EB 03", + [](memory::handle ptr) + { + g_pointers->m_gta.m_model_table = ptr.add(3).rip().as*>(); + } + }, + // Get Model Info + { + "GMI", + "41 3B 0A 74 54", + [](memory::handle ptr) + { + g_pointers->m_gta.m_get_model_info = ptr.sub(46).as(); + } + }, + // Get Label Text + { + "GLT", + "75 ? E8 ? ? ? ? 8B 0D ? ? ? ? 65 48 8B 04 25 ? ? ? ? BA ? ? ? ? 48 8B 04 C8 8B 0C 02 D1 E9", + [](memory::handle ptr) + { + g_pointers->m_gta.m_get_label_text = ptr.sub(19).as(); + } + }, + // Multiplayer chat filter + { + "MCF", + "E8 ? ? ? ? 83 F8 FF 75 B9", + [](memory::handle ptr) + { + g_pointers->m_gta.m_check_chat_profanity = ptr.add(1).rip().as(); + } + }, + // Network + { + "N", + "48 8B 0D ? ? ? ? 48 8B D7 E8 ? ? ? ? 84 C0 75 17 48 8B 0D ? ? ? ? 48 8B D7", + [](memory::handle ptr) + { + g_pointers->m_gta.m_network = ptr.add(3).rip().as(); + } + }, + // Reset Network Complaints + { + "RENC", + "E8 ? ? ? ? 8B 8B ? ? ? ? 03 CF", + [](memory::handle ptr) + { + g_pointers->m_gta.m_reset_network_complaints = ptr.add(1).rip().as(); + } + }, + // fiDevice Get Device + { + "FDGD", + "41 B8 07 00 00 00 48 8B F1 E8", + [](memory::handle ptr) + { + g_pointers->m_gta.m_fidevice_get_device = ptr.sub(0x1F).as(); + } + }, + // fiDevices + { + "FDS", + "74 1B 48 8D 0D ? ? ? ? 41 8B D6", + [](memory::handle ptr) + { + g_pointers->m_gta.m_fidevices = ptr.add(5).rip().as(); + g_pointers->m_gta.m_fidevices_len = ptr.add(5).rip().add(8).as(); + } + }, + // fiPackfile ctor + { + "FPFC", + "44 89 41 28 4C 89 41 38 4C 89 41 50 48 8D", + [](memory::handle ptr) + { + g_pointers->m_gta.m_fipackfile_ctor = ptr.sub(0x1E).as(); + g_pointers->m_gta.m_fipackfile_instances = ptr.add(26).rip().as(); + } + }, + // fiPackfile open archive + { + "FPFOA", + "48 8D 68 98 48 81 EC 40 01 00 00 41 8B F9", + [](memory::handle ptr) + { + g_pointers->m_gta.m_fipackfile_open_archive = ptr.sub(0x18).as(); + } + }, + // fiPackfile mount + { + "FPFM", + "84 C0 74 1D 48 85 DB 74 0F 48", + [](memory::handle ptr) + { + g_pointers->m_gta.m_fipackfile_mount = ptr.sub(0x1E).as(); + } + }, + // fiPackfile unmount + { + "FPFUM", + "E8 ? ? ? ? 84 C0 74 37 80 3D", + [](memory::handle ptr) + { + g_pointers->m_gta.m_fipackfile_unmount = ptr.add(1).rip().as(); + } + }, + // Invalid Mods Crash Detour + { + "IMCD", + "E8 ? ? ? ? 40 88 7C 24 ? 49 89 9C 24", + [](memory::handle ptr) + { + g_pointers->m_gta.m_invalid_mods_crash_detour = ptr.add(1).rip().as(); + } + }, + // Send Chat Ptr + { + "SCP", + "83 7E 1C 01 48 8B 3D", + [](memory::handle ptr) + { + g_pointers->m_gta.m_send_chat_ptr = ptr.add(7).rip().as(); + } + }, + // Send Chat Message + { + "SCM", + "48 83 EC 20 48 8B F1 48 8B CA 41 8A E9", + [](memory::handle ptr) + { + g_pointers->m_gta.m_send_chat_message = ptr.sub(21).as(); + } + }, + // Start Get Session By Gamer Handle + { + "SGSBGH", + "E8 ? ? ? ? 84 C0 0F 84 ? ? ? ? 8B 05 ? ? ? ? 48 8D 4C 24", + [](memory::handle ptr) + { + g_pointers->m_gta.m_start_get_session_by_gamer_handle = ptr.add(1).rip().as(); + } + }, + // Start Matchmaking Find Sessions + { + "SGSBGH", + "E8 ? ? ? ? 84 C0 0F 84 F6 FE FF FF", + [](memory::handle ptr) + { + g_pointers->m_gta.m_start_matchmaking_find_sessions = ptr.add(1).rip().as(); + } + }, + // Join Session By Info + { + "JSBI", + "E8 ? ? ? ? 0F B6 CB 84 C0 41 0F 44 CD", + [](memory::handle ptr) + { + g_pointers->m_gta.m_join_session_by_info = ptr.add(1).rip().as(); + } + }, + // Script VM + { + "VM", + "E8 ? ? ? ? 48 85 FF 48 89 1D", + [](memory::handle ptr) + { + g_pointers->m_gta.m_script_vm = ptr.add(1).rip().as(); + } + }, + // Generate UUID + { + "GU", + "E8 ? ? ? ? 84 C0 74 0C 48 8B 44 24 ? 48 89 03", + [](memory::handle ptr) + { + g_pointers->m_gta.m_generate_uuid = ptr.add(1).rip().as(); + } + }, + // Host Token + { + "HT", + "48 8B 05 ? ? ? ? 48 83 F8 FF", + [](memory::handle ptr) + { + g_pointers->m_gta.m_host_token = ptr.add(3).rip().as(); + } + }, + // Profile Gamer Info + { + "PGI", + "48 8D 05 ? ? ? ? 48 8B FE", + [](memory::handle ptr) + { + g_pointers->m_gta.m_profile_gamer_info = ptr.add(3).rip().as(); + } + }, + // Player Info Gamer Info + { + "PIGI", + "E8 ? ? ? ? 48 8D 4D 20 48 8B D0 E8 ? ? ? ? 41 8A CF", + [](memory::handle ptr) + { + g_pointers->m_gta.m_player_info_gamer_info = ptr.add(1).rip().add(3).rip().as(); + } + }, + // Communications + { + "C", + "48 8B 1D ? ? ? ? 48 8D 4C 24 30", + [](memory::handle ptr) + { + g_pointers->m_gta.m_communications = ptr.add(3).rip().as(); + } + }, + // Serialize Ped Inventory Data Node + { + "SPIDN", + "48 8B C4 48 89 58 08 48 89 68 10 48 89 70 18 48 89 78 20 41 54 41 56 41 57 48 83 EC 20 48 8B 02 48 8B F1 48 8B CA 48 8B FA FF 90", + [](memory::handle ptr) + { + g_pointers->m_gta.m_serialize_ped_inventory_data_node = ptr.as(); + } + }, + // Serialize Vehicle Gadget Data Node + { + "SVGDN", + "48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 57 41 56 41 57 48 83 EC 30 48 8B 02 48 8D", + [](memory::handle ptr) + { + g_pointers->m_gta.m_serialize_vehicle_gadget_data_node = ptr.as(); + } + }, + // Get Vehicle Gadget Array Size + { + "GVGAS", + "40 53 48 83 EC 40 33 DB E8", + [](memory::handle ptr) + { + g_pointers->m_gta.m_get_vehicle_gadget_array_size = ptr.as(); + } + }, + // Handle Join Request + { + "HJR", + "48 8B C4 48 89 58 08 4C 89 48 20 4C 89 40 18 48 89 50 10 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 E8", + [](memory::handle ptr) + { + g_pointers->m_gta.m_handle_join_request = ptr.as(); + } + }, + // Write Join Response Data + { + "WJRD", + "E8 ?? ?? ?? ?? 41 8B DF 84 C0", + [](memory::handle ptr) + { + g_pointers->m_gta.m_write_join_response_data = ptr.add(1).rip().as(); + } + }, + // Queue Packet + { + "QP", + "E8 ? ? ? ? 84 C0 74 4D B3 01", + [](memory::handle ptr) + { + g_pointers->m_gta.m_queue_packet = ptr.add(1).rip().as(); + } + }, + // Sort Session Details + { + "SGS", + "C3 0F 2E 42 0C", + [](memory::handle ptr) + { + g_pointers->m_gta.m_sort_session_details = ptr.sub(0x10).as(); + } + }, + // Add Player To Session + { + "APTS", + "E8 ?? ?? ?? ?? 48 8D 8D F0 01 00 00 8A D8", + [](memory::handle ptr) + { + g_pointers->m_gta.m_add_player_to_session = ptr.add(1).rip().as(); + } + }, + // Send Chat Net Message + { + "SCNM", + "E8 ? ? ? ? 41 FF C4 48 83 C5 08", + [](memory::handle ptr) + { + g_pointers->m_gta.m_send_chat_net_message = ptr.add(1).rip().as(); + } + }, + // Process Matchmaking Find Response + { + "PMFR", + "48 89 5C 24 08 48 89 74 24 10 57 48 81 EC F0 00 00 00 41 83", + [](memory::handle ptr) + { + g_pointers->m_gta.m_process_matchmaking_find_response = ptr.as(); + } + }, + // Serialize Player Data Message + { + "SPDM", + "48 89 5C 24 08 48 89 74 24 10 48 89 7C 24 18 41 56 48 83 EC 20 BF 01 00 00 00", + [](memory::handle ptr) + { + g_pointers->m_gta.m_serialize_player_data_msg = ptr.as(); + } + }, + // Serialize Join Request Message + { + "SJRM", + "E8 ?? ?? ?? ?? 84 C0 0F 84 9B 00 00 00 49 8D 8F 50 11 00 00", + [](memory::handle ptr) + { + g_pointers->m_gta.m_serialize_join_request_message = ptr.add(1).rip().as(); + } + }, + // Send Network Damage + { + "SND", + "E8 ? ? ? ? E9 E9 01 00 00 48 8B CB", + [](memory::handle ptr) + { + g_pointers->m_gta.m_send_network_damage = ptr.add(1).rip().as(); + } + }, + // Request Ragdoll + { + "RR", + "E8 ? ? ? ? 09 B3 ? ? ? ? 48 8B 5C 24", + [](memory::handle ptr) + { + g_pointers->m_gta.m_request_ragdoll = ptr.add(1).rip().as(); + } + }, + // Request Control + { + "RC", + "E8 ? ? ? ? EB 3E 48 8B D3", + [](memory::handle ptr) + { + g_pointers->m_gta.m_request_control = ptr.add(1).rip().as(); + } + }, + // Get Connection Peer & Send Remove Gamer Command + { + "GCP&SRGC", + "8D 42 FF 83 F8 FD 77 3D", + [](memory::handle ptr) + { + g_pointers->m_gta.m_get_connection_peer = ptr.add(23).rip().as(); + g_pointers->m_gta.m_send_remove_gamer_cmd = ptr.add(65).rip().as(); + } + }, + // Handle Remove Gamer Command + { + "HRGC", + "41 FF C6 FF C7", + [](memory::handle ptr) + { + g_pointers->m_gta.m_handle_remove_gamer_cmd = ptr.sub(0x6E).as(); + } + }, + // Broadcast Net Array + { + "BNA", + "48 89 5C 24 ? 48 89 54 24 ? 55 56 57 41 54 41 55 41 56 41 57 48 83 EC 40 48 8B 05 ? ? ? ? 66 44 89 4C 24", + [](memory::handle ptr) + { + g_pointers->m_gta.m_broadcast_net_array = ptr.as(); + } + }, + // Rage Security + { + "RS", + "48 8B 1D ? ? ? ? 33 F6 BD C3 9E 26 00", + [](memory::handle ptr) + { + g_pointers->m_gta.m_security = ptr.add(3).rip().as*>(); + } + }, + // Send Session Matchmaking Attributes + { + "SSMA", + "48 8B C4 48 89 58 08 48 89 68 10 48 89 70 18 48 89 78 20 41 56 48 81 EC D0 00 00 00 49 8B", + [](memory::handle ptr) + { + g_pointers->m_gta.m_send_session_matchmaking_attributes = ptr.as(); + } + }, + // Serialize Take Off Ped Variation Task + { + "STOPVT", + "40 55 53 57 41 56 48 8B EC 48 83 EC 68", + [](memory::handle ptr) + { + g_pointers->m_gta.m_serialize_take_off_ped_variation_task = ptr.as(); + } + }, + // Chat Data + { + "CD", + "48 8B 05 ? ? ? ? 0F 45 DF", + [](memory::handle ptr) + { + g_pointers->m_gta.m_chat_data = ptr.add(3).rip().as(); + } + }, + // Social Club Info + { + "SCI", + "48 8B D3 48 8D 4C 24 ? 48 69 D2", + [](memory::handle ptr) + { + g_pointers->m_gta.m_sc_info = ptr.sub(4).rip().as(); + } + }, + // Create Script Handler + { + "CSH", + "48 8D 05 ? ? ? ? 4C 8D 0D ? ? ? ? 41 83 C8 FF 48 89 03 89 53 70 88 53 74 4C 89 4B 68 48 89 93", + [](memory::handle ptr) + { + g_pointers->m_gta.m_create_script_handler = *(ptr.add(3).rip().as() + 8); + } + }, + // Constraint Attachment Crash + { + "CAC", + "40 53 48 83 EC 20 48 8B D9 48 8B 49 38 48 8B 01", + [](memory::handle ptr) + { + g_pointers->m_gta.m_constraint_attachment_crash = ptr.as(); + } + }, + // Invalid Decal Crash + { + "IDC", + "E8 ? ? ? ? 8B 9C 24 B8 00 00 00 4C 8B AC 24 A8 00 00 00", + [](memory::handle ptr) + { + g_pointers->m_gta.m_invalid_decal_crash = ptr.add(1).rip().as(); + } + }, + // Task Parachute Object 0x270 + { + "TPO270", + "0F 88 ? ? ? ? 75 34", + [](memory::handle ptr) + { + g_pointers->m_gta.m_task_parachute_object_0x270 = ptr.sub(6).as(); + } + }, + // Encode Session Info + { + "ESI", + "E8 ? ? ? ? C6 83 94 01 00 00 01", + [](memory::handle ptr) + { + g_pointers->m_gta.m_encode_session_info = ptr.add(1).rip().as(); + } + }, + // Decode Session Info + { + "DSI", + "E8 ?? ?? ?? ?? 84 C0 74 16 48 8B 4B 60", + [](memory::handle ptr) + { + g_pointers->m_gta.m_decode_session_info = ptr.add(1).rip().as(); + } + }, + // Decode Peer Info + { + "DPI", + "48 89 5C 24 08 48 89 74 24 10 57 48 81 EC C0 00 00 00 48 8B F1 49", + [](memory::handle ptr) + { + g_pointers->m_gta.m_decode_peer_info = ptr.as(); + } + }, + // Main File Object + { + "MFO", + "48 8D 05 ? ? ? ? 48 8D 1C D0 EB 03", + [](memory::handle ptr) + { + g_pointers->m_gta.m_main_file_object = ptr.add(3).rip().as(); + } + }, + // Load Cloud File + { + "LCF", + "48 89 5C 24 08 48 89 74 24 10 57 48 83 EC 40 48 8B F2 48 8B D9 41 8B D0", + [](memory::handle ptr) + { + g_pointers->m_gta.m_load_cloud_file = ptr.as(); + } + }, + // Set As Active Cloud File + { + "SAACF", + "48 83 EC 28 45 33 C0 4C 39", + [](memory::handle ptr) + { + g_pointers->m_gta.m_set_as_active_cloud_file = ptr.as(); + } + }, + // Save JSON Data + { + "SJD", + "48 89 5C 24 08 57 48 83 EC 30 33 DB 48 8B FA 48", + [](memory::handle ptr) + { + g_pointers->m_gta.m_save_json_data = ptr.as(); + } + }, + // Network Time + { + "NT", + "48 8B 0D ? ? ? ? E8 ? ? ? ? 33 DB 84 C0 74 41", + [](memory::handle ptr) + { + g_pointers->m_gta.m_network_time = ptr.add(3).rip().as(); + } + }, + // Sync Network Time + { + "SNT", + "E8 ? ? ? ? 8B 43 5C", + [](memory::handle ptr) + { + g_pointers->m_gta.m_sync_network_time = ptr.add(1).rip().as(); + } + }, + // Queue Dependency + { + "QD", + "48 89 5C 24 ? 57 48 83 EC ? 0F B6 99", + [](memory::handle ptr) + { + g_pointers->m_gta.m_queue_dependency = ptr.as(); + } + }, + // Interval Check Function + { + "ICF", + "48 8D 0D ? ? ? ? 88 05 ? ? ? ? 48 8D 05", + [](memory::handle ptr) + { + g_pointers->m_gta.m_interval_check_func = ptr.add(3).rip().as(); + } + }, + // 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 E8 4C 8D 40 EC 49 8B F1 48 8B D9 40 32 FF E8", + [](memory::handle ptr) + { + g_pointers->m_gta.m_prepare_metric_for_sending = ptr.as(); + } + }, + // Send Packet + { + "SP", + "48 8B C4 48 89 58 08 48 89 70 10 48 89 78 18 4C 89 48 20 55 41 54 41 55 41 56 41 57 48 8D A8 98", + [](memory::handle ptr) + { + g_pointers->m_gta.m_send_packet = ptr.as(); + } + }, + // Connect To Peer + { + "CTP", + "48 89 5C 24 08 4C 89 4C 24 20 48 89 54 24 10 55 56 57 41 54 41 55 41 56 41 57 48 83 EC 60 4D", + [](memory::handle ptr) + { + g_pointers->m_gta.m_connect_to_peer = ptr.as(); + } + }, + // Fragment Physics Crash + { + "FPC", + "E8 ? ? ? ? 44 8B 4D 1C", + [](memory::handle ptr) + { + g_pointers->m_gta.m_fragment_physics_crash = ptr.add(1).rip().as(); + } + }, + // Fragment Physics Crash 2 + { + "FPC2", + "E8 ? ? ? ? 84 C0 75 0B 41 FF CF", + [](memory::handle ptr) + { + g_pointers->m_gta.m_fragment_physics_crash_2 = ptr.add(1).rip().as(); + } + }, + // Clear Ped Tasks Network + { + "CPTN", + "E8 ? ? ? ? EB 28 48 8B 8F A0 10 00 00", + [](memory::handle ptr) + { + g_pointers->m_gta.m_clear_ped_tasks_network = ptr.add(1).rip().as(); + } + }, + // Infinite Train Crash + { + "ITC", + "E8 ? ? ? ? F3 44 0F 10 93 90 03 00 00", + [](memory::handle ptr) + { + g_pointers->m_gta.m_infinite_train_crash = ptr.add(1).rip().as(); + g_pointers->m_gta.m_get_next_carriage = ptr.add(1).rip().add(0xF).rip().as(); + } + }, + // Get Entity Attached To + { + "GEAT", + "48 83 EC 28 48 8B 51 50 48 85 D2 74 04", + [](memory::handle ptr) + { + g_pointers->m_gta.m_get_entity_attached_to = ptr.as(); + } + }, + // Received Array Update + { + "RAU", + "48 89 5C 24 10 55 56 57 41 54 41 55 41 56 41 57 48 8B EC 48 83 EC 30 48 8B 05", + [](memory::handle ptr) + { + g_pointers->m_gta.m_received_array_update = ptr.as(); + } + }, + // Receive Pickup + { + "RPI", + "49 8B 80 ? ? ? ? 48 85 C0 74 0C F6 80 ? ? ? ? ? 75 03 32 C0 C3", + [](memory::handle ptr) + { + g_pointers->m_gta.m_receive_pickup = ptr.as(); + } + }, + // Write Player Camera Data Node + { + "WPCDN", + "48 8B C4 48 89 58 20 55 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 B0 48 81 EC 50 01 00 00 4C", + [](memory::handle ptr) + { + g_pointers->m_gta.m_write_player_camera_data_node = ptr.as(); + } + }, + // Send Player Card Stats + { + "SPCS", + "48 89 5C 24 08 57 48 83 EC 30 48 83 64 24 20 00 48 8B DA 41", + [](memory::handle ptr) + { + g_pointers->m_gta.m_send_player_card_stats = ptr.as(); + } + }, + // Force Player Card Refresh + { + "FPCR", + "44 38 2D ? ? ? ? 74 1D 44 00 A6 BB 07 00 00", + [](memory::handle ptr) + { + g_pointers->m_gta.m_force_player_card_refresh = ptr.add(3).rip().as(); + } + }, + // Serialize Stats + { + "SS", + "48 89 5C 24 08 48 89 74 24 10 48 89 7C 24 20 55 41 54 41 55 41 56 41 57 48 8B EC 48 83 EC 50 45", + [](memory::handle ptr) + { + g_pointers->m_gta.m_serialize_stats = ptr.as(); + } + }, + // Write Player Creation Data Node + { + "WPCDN", + "48 83 EC 38 48 8B 81 F0", + [](memory::handle ptr) + { + g_pointers->m_gta.m_write_player_creation_data_node = ptr.as(); + } + }, + // Write Player Appearance Data Node + { + "WPADN", + "48 8B C4 48 89 50 10 48 89 48 08 53", + [](memory::handle ptr) + { + g_pointers->m_gta.m_write_player_appearance_data_node = ptr.as(); + } + }, + // Enumerate Audio Devices + { + "EAD", + "48 89 5C 24 08 48 89 7C 24 10 55 48 8B EC 48 83 EC 70 41", + [](memory::handle ptr) + { + g_pointers->m_gta.m_enumerate_audio_devices = ptr.as(); + } + }, + // Direct Sound Capture Create + { + "DSCC", + "E8 ? ? ? ? 33 FF 85 C0 78 C1", + [](memory::handle ptr) + { + g_pointers->m_gta.m_direct_sound_capture_create = ptr.add(1).rip().as(); + } + }, + // Refresh Audio Input + { + "RAI", + "40 88 3D ? ? ? ? 89 05 ? ? ? ? 40 38 3D", + [](memory::handle ptr) + { + g_pointers->m_gta.m_refresh_audio_input = ptr.add(3).rip().as(); + } + }, + // Allow Weapons In Vehicle + { + "AWIV", + "49 8B 40 08 39 10", + [](memory::handle ptr) + { + g_pointers->m_gta.m_allow_weapons_in_vehicle = ptr.sub(23).as(); + } + }, + // Write Vehicle Proximity Migration Data Node + { + "WVPMDN", + "48 89 4C 24 08 55 53 56 57 41 54 41 55 41 56 41 57 48 8B EC 48 83 EC 68 4C 8B A9", + [](memory::handle ptr) + { + g_pointers->m_gta.m_write_vehicle_proximity_migration_data_node = ptr.as(); + } + }, + // Migrate Object + { + "MO", + "48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 57 41 54 41 55 41 56 41 57 48 83 EC 20 41 8B F8 48", + [](memory::handle ptr) + { + g_pointers->m_gta.m_migrate_object = ptr.as(); + } + }, + // Task Jump Constructor + { + "TJC", + "48 89 5C 24 ? 89 54 24 10 57 48 83 EC 30 0F 29 74 24", + [](memory::handle ptr) + { + g_pointers->m_gta.m_taskjump_constructor = ptr.as(); + } + }, + // Max Wanted Level + { + "MWL", + "8B 43 6C 89 05", + [](memory::handle ptr) + { + g_pointers->m_gta.m_max_wanted_level = ptr; + } + }, + // Blame Explode + { + "BE", + "0F 85 ? ? ? ? 48 8B 05 ? ? ? ? 48 8B 48 08 E8", + [](memory::handle ptr) + { + g_pointers->m_gta.m_blame_explode = ptr; + } + }, + //Patch blocked explosions + { + "EP", + "E8 ? ? ? ? 48 8D 4C 24 20 E8 ? ? ? ? 4C 8D 9C 24 80 01 00 00", + [](memory::handle ptr) + { + g_pointers->m_gta.m_explosion_patch = ptr; + } + }, + // Is Matchmaking Session Valid + { + "IMSV", + "48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 57 41 54 41 55 41 56 41 57 48 83 EC 20 45 0F", + [](memory::handle ptr) + { + g_pointers->m_gta.m_is_matchmaking_session_valid = ptr; + } + }, + // Broadcast Net Array Patch + { + "BP", + "74 73 FF 90 ? ? ? ? 8B D5 4C 8B 00 48 8B C8 41 FF 50 30", + [](memory::handle ptr) + { + g_pointers->m_gta.m_broadcast_patch = ptr; + } + }, + // Creator Warp Cheat Triggered Patch + { + "CW", + "74 44 E8 ? ? ? ? 80 65 2B F8 48 8D 0D ? ? ? ? 48 89 4D 17 48 89 7D 1F 89 7D 27 C7 45", + [](memory::handle ptr) + { + g_pointers->m_gta.m_creator_warp_cheat_triggered_patch = ptr; + } + }, + // NTQVM Caller + { + "NTQVMC", + "66 0F 6F 0D ? ? ? ? 66 0F 6F 05 ? ? ? ? 66 0F 66 C4", + [](memory::handle ptr) + { + g_pointers->m_gta.m_ntqvm_caller = ptr; + } + }, + // Sound Overload Detour + { + "SOD", + "66 45 3B C1 74 38", + [](memory::handle ptr) + { + g_pointers->m_gta.m_sound_overload_detour = ptr; + } + }, + // Disable Collision + { + "DC", + "48 8B D1 49 8B CA ? ? ? ? ? 48 8B D1 49 8B CA", + [](memory::handle ptr) + { + g_pointers->m_gta.m_disable_collision = ptr; + } + }, + // Crash Trigger + { + "CT", + "48 3B F8 74 ? 8B 1D", + [](memory::handle ptr) + { + g_pointers->m_gta.m_crash_trigger = ptr; + } + }, + // freemode_thread_restorer_through_vm_patch 1 + { + "FMVM1", + "3b 0a 0f 83 ? ? ? ? 48 ff c7", + [](memory::handle ptr) + { + g_pointers->m_gta.freemode_thread_restorer_through_vm_patch_1 = ptr; + } + }, + // freemode_thread_restorer_through_vm_patch 2 + { + "FMVM2", + "3b 0a 0f 83 ? ? ? ? 49 03 fa", + [](memory::handle ptr) + { + g_pointers->m_gta.freemode_thread_restorer_through_vm_patch_2 = ptr; + } + } + >(); - return true; - } - } - else - { - LOG(WARNING) << "Failed to find version patterns. Can't utilize pointers cache."; - } + // clang-format on - return false; + return batch_and_hash; } - // TODO: ideally the `ptr` in the lambdas should be stored in separate fields than the memory::byte_patch (ideally you'd move those memory::byte_patch away from the pointers class...) - // So that the ptrs could be cached - void pointers::always_run_main_batch(const memory::module& mem_region) + constexpr auto pointers::get_sc_batch() { - memory::batch main_batch; - - // Max Wanted Level - main_batch.add("MWL", "8B 43 6C 89 05", [this](memory::handle ptr) { - m_max_wanted_level = memory::byte_patch::make(ptr.add(5).rip().as(), 0).get(); - m_max_wanted_level_2 = memory::byte_patch::make(ptr.add(14).rip().as(), 0).get(); - }); - - // Blame Explode - main_batch.add("BE", "0F 85 ? ? ? ? 48 8B 05 ? ? ? ? 48 8B 48 08 E8", [this](memory::handle ptr) { - m_blame_explode = memory::byte_patch::make(ptr.as(), 0xE990).get(); - }); - - //Patch blocked explosions - main_batch.add("EP", "E8 ? ? ? ? 48 8D 4C 24 20 E8 ? ? ? ? 4C 8D 9C 24 80 01 00 00", [this](memory::handle ptr) { - m_explosion_patch = memory::byte_patch::make(ptr.sub(12).as(), 0x9090).get(); - }); - - // Is Matchmaking Session Valid - main_batch.add("IMSV", "48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 57 41 54 41 55 41 56 41 57 48 83 EC 20 45 0F", [this](memory::handle ptr) { - memory::byte_patch::make(ptr.as(), std::to_array({0xB0, 0x01, 0xC3}))->apply(); // has no observable side effects - }); - - // Broadcast Net Array Patch - main_batch.add("BP", "74 73 FF 90 ? ? ? ? 8B D5 4C 8B 00 48 8B C8 41 FF 50 30", [this](memory::handle ptr) { - m_broadcast_patch = memory::byte_patch::make(ptr.as(), 0xEB).get(); - }); - - // Creator Warp Cheat Triggered Patch - main_batch.add("CW", "74 44 E8 ? ? ? ? 80 65 2B F8 48 8D 0D ? ? ? ? 48 89 4D 17 48 89 7D 1F 89 7D 27 C7 45", [](memory::handle ptr) { - memory::byte_patch::make(ptr.as(), 0xEB)->apply(); - }); - - // NTQVM Caller - main_batch.add("NTQVMC", "66 0F 6F 0D ? ? ? ? 66 0F 6F 05 ? ? ? ? 66 0F 66 C4", [this](memory::handle ptr) { - memory::byte_patch::make(ptr.add(4).rip().sub(32).as(), (uint64_t)&hooks::nt_query_virtual_memory) - ->apply(); - }); - - // Sound Overload Detour - main_batch.add("SOD", "66 45 3B C1 74 38", [this](memory::handle ptr) { - g_sound_overload_ret_addr = ptr.add(13 + 15).as(); - std::vector bytes = {0xFF, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90}; // far jump opcode + a nop opcode - *(void**)(bytes.data() + 6) = sound_overload_detour; - memory::byte_patch::make(ptr.add(13).as(), bytes)->apply(); - }); - - // Disable Collision - main_batch.add("DC", "48 8B D1 49 8B CA ? ? ? ? ? 48 8B D1 49 8B CA", [this](memory::handle ptr) { - m_disable_collision = memory::byte_patch::make(ptr.sub(2).as(), 0xEB).get(); - }); - - // Crash Trigger - main_batch.add("CT", "48 3B F8 74 ? 8B 1D", [this](memory::handle ptr) { - memory::byte_patch::make(ptr.add(4).as(), 0x00)->apply(); - }); - - if (!main_batch.run(mem_region)) - { - throw std::runtime_error("Failed to find some patterns."); - } - } - - void pointers::run_cacheable_main_batch(const memory::module& mem_region) - { - memory::batch main_batch; - - main_batch.add("SCREEN_RESOLUTION", "66 0F 6E 0D ? ? ? ? 0F B7 3D", [this](memory::handle ptr) { - m_resolution_x = ptr.sub(4).rip().as(); - m_resolution_y = ptr.add(4).rip().as(); - }); - - // Region Code - main_batch.add("RC", "48 83 EC 28 83 3D ? ? ? ? ? 75 10", [this](memory::handle ptr) { - m_region_code = ptr.add(16).rip().add(1).as(); - }); - - // Game State - main_batch.add("GS", "83 3D ? ? ? ? ? 75 17 8B 43 20 25", [this](memory::handle ptr) { - m_game_state = ptr.add(2).rip().add(1).as(); - }); - - // Is Session Started - main_batch.add("ISA", "40 38 35 ? ? ? ? 75 0E 4C 8B C3 49 8B D7 49 8B CE", [this](memory::handle ptr) { - m_is_session_started = ptr.add(3).rip().as(); - }); - - // Ped Factory - main_batch.add("PF", "48 8B 05 ? ? ? ? 48 8B 48 08 48 85 C9 74 52 8B 81", [this](memory::handle ptr) { - m_ped_factory = ptr.add(3).rip().as(); - }); - - // Network Player Manager - main_batch.add("NPM", "48 8B 0D ? ? ? ? 8A D3 48 8B 01 FF 50 ? 4C 8B 07 48 8B CF", [this](memory::handle ptr) { - m_network_player_mgr = ptr.add(3).rip().as(); - }); - - // Init Native Tables & Native Handlers - main_batch.add("NH", "48 8D 0D ? ? ? ? 48 8B 14 FA E8 ? ? ? ? 48 85 C0 75 0A", [this](memory::handle ptr) { - m_init_native_tables = ptr.sub(37).as(); - m_native_registration_table = ptr.add(3).rip().as(); - m_get_native_handler = ptr.add(12).rip().as(); - }); - - // Fix Vectors - main_batch.add("FV", "83 79 18 00 48 8B D1 74 4A FF 4A 18 48 63 4A 18 48 8D 41 04 48 8B 4C CA", [this](memory::handle ptr) { - m_fix_vectors = ptr.as(); - }); - - // Script Threads - main_batch.add("ST", "45 33 F6 8B E9 85 C9 B8", [this](memory::handle ptr) { - m_script_threads = ptr.sub(4).rip().sub(8).as(); - m_run_script_threads = ptr.sub(0x1F).as(); - }); - - // Script Programs - main_batch.add("SP", "48 8B 1D ? ? ? ? 41 83 F8 FF", [this](memory::handle ptr) { - m_script_program_table = ptr.add(3).rip().as(); - }); - - // Script Global - main_batch.add("SG", "48 8D 15 ? ? ? ? 4C 8B C0 E8 ? ? ? ? 48 85 FF 48 89 1D", [this](memory::handle ptr) { - m_script_globals = ptr.add(3).rip().as(); - }); - - // Game Script Handle Manager - main_batch.add("CGSHM", "48 8B 0D ? ? ? ? 4C 8B CE E8 ? ? ? ? 48 85 C0 74 05 40 32 FF", [this](memory::handle ptr) { - m_script_handler_mgr = ptr.add(3).rip().as(); - }); - - // Swapchain - main_batch.add("S", "48 8B 0D ? ? ? ? 48 8B 01 44 8D 43 01 33 D2 FF 50 40 8B C8", [this](memory::handle ptr) { - m_swapchain = ptr.add(3).rip().as(); - }); - - // World Model Spawn Bypass - main_batch.add("WMSB", "48 85 C0 0F 84 ? ? ? ? 8B 48 50", [this](memory::handle ptr) { - m_world_model_spawn_bypass = ptr.as(); - }); - - // Native Return Spoofer - main_batch.add("NRF", "FF E3", [this](memory::handle ptr) { - m_native_return = ptr.add(0).as(); - }); - - // GTA Thread Start - main_batch.add("GTS", "48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 8B FA 85 D2 75 2A 8B 15", [this](memory::handle ptr) { - m_gta_thread_start = ptr.as(); - }); - - // GTA Thread Kill - main_batch.add("TK", "48 89 5C 24 ? 57 48 83 EC 20 48 83 B9 ? ? ? ? ? 48 8B D9 74 14", [this](memory::handle ptr) { - m_gta_thread_kill = ptr.as(); - }); - - // Trigger Script Event - main_batch.add("TSE", "45 8B F0 41 8B F9 48 8B EA", [this](memory::handle ptr) { - m_trigger_script_event = ptr.sub(0x1C).as(); - }); - - // Received Event Signatures START - - // Received Event Hook - main_batch.add("REH", "66 41 83 F9 ? 0F 83", [this](memory::handle ptr) { - m_received_event = ptr.as(); - }); - - // Send Event Acknowledge - main_batch.add("SEA", "E8 ? ? ? ? 66 83 7B 08 5B", [this](memory::handle ptr) { - m_send_event_ack = ptr.add(1).rip().as(); - }); - - // Received Event Signatures END - - // Read Bitbuffer WORD/DWORD - main_batch.add("RBWD", "48 89 74 24 ? 57 48 83 EC 20 48 8B D9 33 C9 41 8B F0 8A", [this](memory::handle ptr) { - m_read_bitbuf_dword = ptr.sub(5).as(); - }); - - // Read Bitbuffer Array - main_batch.add("RBA", "48 89 5C 24 ? 57 48 83 EC 30 41 8B F8 4C", [this](memory::handle ptr) { - m_read_bitbuf_array = ptr.as(); - }); - - // Read Bitbuffer String - main_batch.add("RBS", "E8 ? ? ? ? 48 8D 4F 3C", [this](memory::handle ptr) { - m_read_bitbuf_string = ptr.add(1).rip().as(); - }); - - // Read Bitbuffer Boolean - main_batch.add("RBB", "E8 ? ? ? ? 84 C0 74 41 48 8D 56 2C", [this](memory::handle ptr) { - m_read_bitbuf_bool = ptr.add(1).rip().as(); - }); - - // Write Bitbuffer WORD/DWORD - main_batch.add("WBD", "48 8B C4 48 89 58 08 48 89 68 10 48 89 70 18 48 89 78 20 41 56 48 83 EC 20 8B EA BF 01", [this](memory::handle ptr) { - m_write_bitbuf_dword = ptr.as(); - }); - - // Write Bitbuffer QWORD - main_batch.add("WBQ", "48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 57 48 83 EC 20 41 8B F0 48 8B EA 48 8B D9 41 83 F8 20", [this](memory::handle ptr) { - m_write_bitbuf_qword = ptr.as(); - }); - - // Write Bitbuffer Int64 - main_batch.add("WBI64", "E8 ? ? ? ? 8A 53 39 48 8B CF", [this](memory::handle ptr) { - m_write_bitbuf_int64 = ptr.add(1).rip().as(); - }); - - // Write Bitbuffer Int32 - main_batch.add("WBI32", "E8 ? ? ? ? 8A 53 74", [this](memory::handle ptr) { - m_write_bitbuf_int32 = ptr.add(1).rip().as(); - }); - - // Write Bitbuffer Boolean - main_batch.add("WBB", "E8 ? ? ? ? 8A 57 39", [this](memory::handle ptr) { - m_write_bitbuf_bool = ptr.add(1).rip().as(); - }); - - // Write Bitbuffer Array - main_batch.add("WBA", "E8 ? ? ? ? 01 7E 08", [this](memory::handle ptr) { - m_write_bitbuf_array = ptr.add(1).rip().as(); - }); - - // Write Player Game State Data Node - main_batch.add("WPGSDN", "48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 41 54 41 55 41 56 41 57 48 83 EC 30 0F B7 81", [this](memory::handle ptr) { - m_write_player_game_state_data_node = ptr.as(); - }); - - // Replay Interface - main_batch.add("RI", "0F B7 44 24 ? 66 89 44 4E", [this](memory::handle ptr) { - m_replay_interface = ptr.add(0x1F).rip().as(); - }); - - // Ptr To Handle - main_batch.add("PTH", "48 8B F9 48 83 C1 10 33 DB", [this](memory::handle ptr) { - m_ptr_to_handle = ptr.sub(0x15).as(); - }); - - // Handle To Ptr - main_batch.add("GSH", "83 F9 FF 74 31 4C 8B 0D", [this](memory::handle ptr) { - m_handle_to_ptr = ptr.as(); - }); - - // CNetworkObjectMgr - main_batch.add("CNOM", "48 8B 0D ? ? ? ? 45 33 C0 E8 ? ? ? ? 33 FF 4C 8B F0", [this](memory::handle ptr) { - m_network_object_mgr = ptr.add(3).rip().as(); - }); - - // Network Player Mgr Init - main_batch.add("NPMI", "41 56 48 83 EC ? 48 8B F1 B9 ? ? ? ? 49 8B F9 41 8B E8 4C 8B F2 E8", [this](memory::handle ptr) { - m_network_player_mgr_init = ptr.sub(0x13).as(); - }); - - // Network Player Mgr Shutdown - main_batch.add("NPMS", "48 8D 9F ? ? ? ? EB ? 48 8B 13 48 85 D2 74 ? 48 8B CB E8 ? ? ? ? 48 83 7B ? ? 75 ? 48 8D 9F", [this](memory::handle ptr) { - m_network_player_mgr_shutdown = ptr.sub(0x1A).as(); - }); - - // FriendRegistry - main_batch.add("FR", "3B 0D ? ? ? ? 73 17", [this](memory::handle ptr) { - m_friend_registry = ptr.add(2).rip().as(); - }); - - // GET_SCREEN_COORDS_FROM_WORLD_COORDS - main_batch.add("GSCFWC", "E8 ? ? ? ? 84 C0 74 19 F3 0F 10 44 24", [this](memory::handle ptr) { - m_get_screen_coords_for_world_coords = ptr.add(1).rip().as(); - }); - - // GET_GAMEPLAY_CAM_COORDS - main_batch.add("GGCC", "8B 90 ? ? ? ? 89 13", [this](memory::handle ptr) { - m_get_gameplay_cam_coords = ptr.sub(0xE).as(); - }); - - // Give Pickup Reward - main_batch.add("GPR", "48 8B C8 33 C0 48 85 C9 74 0A 44 8B C3 8B D7 E8", [this](memory::handle ptr) { - m_give_pickup_rewards = ptr.sub(0x28).as(); - }); - - // Write Player Gamer Data Node - main_batch.add("WPGDN", "48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 48 81 C1 ? ? ? ? 48 8B DA E8", [this](memory::handle ptr) { - m_write_player_gamer_data_node = ptr.as(); - }); - - // Receive Net Message - main_batch.add("RNM", "48 83 EC 20 4C 8B 71 50 33 ED", [this](memory::handle ptr) { - m_receive_net_message = ptr.sub(0x19).as(); - }); - - // Get Network Event Data - main_batch.add("GNED", "53 43 52 49 50 54 5F 4E 45 54 57 4F 52 4B", [this](memory::handle ptr) { - m_get_network_event_data = *ptr.sub(0x38).as(); - }); - - // Assign Physical Index - main_batch.add("API", "48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 41 54 41 55 41 56 41 57 48 83 EC 20 41 8A E8", [this](memory::handle ptr) { - m_assign_physical_index = ptr.as(); - }); - - // Received Clone Create - main_batch.add("RCC", "48 8B C4 66 44 89 48", [this](memory::handle ptr) { - m_received_clone_create = ptr.as(); - }); - - // Can Apply Data - main_batch.add("CAD", "E8 ? ? ? ? 84 C0 0F 84 AF 01 00 00 48 8B 03", [this](memory::handle ptr) { - m_can_apply_data = ptr.add(1).rip().as(); - }); - - // Received clone sync & Get sync tree for type & Get net object for player & Get sync type info & Get net object - main_batch.add("RCS/GSTFT/GNOFP/GNO/GSTI", "4C 8B FA 41 0F B7 D1", [this](memory::handle ptr) { - m_received_clone_sync = ptr.sub(0x1D).as(); - m_get_sync_tree_for_type = ptr.add(0x14).rip().as(); // 0F B7 CA 83 F9 07 .as() - m_get_net_object = ptr.add(0x76).rip().as(); // E8 ? ? ? ? 0F B7 53 7C .add(1).rip().as() - m_get_sync_type_info = ptr.add(0x8C).rip().as(); // 44 0F B7 C1 4C 8D 0D .as() - }); - - // Read Bitbuffer Into Sync Tree - main_batch.add("RBIST", "E8 ? ? ? ? 48 8B BC 24 B0 00 00 00", [this](memory::handle ptr) { - m_read_bitbuffer_into_sync_tree = ptr.add(1).rip().as(); - }); - - // Model Hash Table - main_batch.add("MHT", "4C 03 05 ? ? ? ? EB 03", [this](memory::handle ptr) { - m_model_table = ptr.add(3).rip().as*>(); - }); - - // Get Model Info - main_batch.add("GMI", "41 3B 0A 74 54", [this](memory::handle ptr) { - m_get_model_info = ptr.sub(46).as(); - }); - - // Get Label Text - main_batch.add("GLT", "75 ? E8 ? ? ? ? 8B 0D ? ? ? ? 65 48 8B 04 25 ? ? ? ? BA ? ? ? ? 48 8B 04 C8 8B 0C 02 D1 E9", [this](memory::handle ptr) { - m_get_label_text = ptr.sub(19).as(); - }); - - // Multiplayer chat filter - main_batch.add("MCF", "E8 ? ? ? ? 83 F8 FF 75 B9", [this](memory::handle ptr) { - m_check_chat_profanity = ptr.add(1).rip().as(); - }); - - // Network - main_batch.add("N", "48 8B 0D ? ? ? ? 48 8B D7 E8 ? ? ? ? 84 C0 75 17 48 8B 0D ? ? ? ? 48 8B D7", [this](memory::handle ptr) { - m_network = ptr.add(3).rip().as(); - }); - - // Reset Network Complaints - main_batch.add("RENC", "E8 ? ? ? ? 8B 8B ? ? ? ? 03 CF", [this](memory::handle ptr) { - m_reset_network_complaints = ptr.add(1).rip().as(); - }); - - // fiDevice Get Device - main_batch.add("FDGD", "41 B8 07 00 00 00 48 8B F1 E8", [this](memory::handle ptr) { - m_fidevice_get_device = ptr.sub(0x1F).as(); - }); - - // fiDevices - main_batch.add("FDS", "74 1B 48 8D 0D ? ? ? ? 41 8B D6", [this](memory::handle ptr) { - m_fidevices = ptr.add(5).rip().as(); - m_fidevices_len = ptr.add(5).rip().add(8).as(); - }); - - // fiPackfile ctor - main_batch.add("FPFC", "44 89 41 28 4C 89 41 38 4C 89 41 50 48 8D", [this](memory::handle ptr) { - m_fipackfile_ctor = ptr.sub(0x1E).as(); - m_fipackfile_instances = ptr.add(26).rip().as(); - }); - - // fiPackfile open archive - main_batch.add("FPFOA", "48 8D 68 98 48 81 EC 40 01 00 00 41 8B F9", [this](memory::handle ptr) { - m_fipackfile_open_archive = ptr.sub(0x18).as(); - }); - - // fiPackfile mount - main_batch.add("FPFM", "84 C0 74 1D 48 85 DB 74 0F 48", [this](memory::handle ptr) { - m_fipackfile_mount = ptr.sub(0x1E).as(); - }); - - // fiPackfile unmount - main_batch.add("FPFUM", "E8 ? ? ? ? 84 C0 74 37 80 3D", [this](memory::handle ptr) { - m_fipackfile_unmount = ptr.add(1).rip().as(); - }); - - // Invalid Mods Crash Detour - main_batch.add("IMCD", "E8 ? ? ? ? 40 88 7C 24 ? 49 89 9C 24", [this](memory::handle ptr) { - m_invalid_mods_crash_detour = ptr.add(1).rip().as(); - }); - - // Send Chat Ptr - main_batch.add("SCP", "83 7E 1C 01 48 8B 3D", [this](memory::handle ptr) { - m_send_chat_ptr = ptr.add(7).rip().as(); - }); - - // Send Chat Message - main_batch.add("SCM", "48 83 EC 20 48 8B F1 48 8B CA 41 8A E9", [this](memory::handle ptr) { - m_send_chat_message = ptr.sub(21).as(); - }); - - // Start Get Session By Gamer Handle - main_batch.add("SGSBGH", "E8 ? ? ? ? 84 C0 0F 84 ? ? ? ? 8B 05 ? ? ? ? 48 8D 4C 24", [this](memory::handle ptr) { - m_start_get_session_by_gamer_handle = ptr.add(1).rip().as(); - }); - - // Start Matchmaking Find Sessions - main_batch.add("SGSBGH", "E8 ? ? ? ? 84 C0 0F 84 F6 FE FF FF", [this](memory::handle ptr) { - m_start_matchmaking_find_sessions = ptr.add(1).rip().as(); - }); - - // Join Session By Info - main_batch.add("JSBI", "E8 ? ? ? ? 0F B6 CB 84 C0 41 0F 44 CD", [this](memory::handle ptr) { - m_join_session_by_info = ptr.add(1).rip().as(); - }); - - // Script VM - main_batch.add("VM", "E8 ? ? ? ? 48 85 FF 48 89 1D", [this](memory::handle ptr) { - m_script_vm = ptr.add(1).rip().as(); - }); - - // Generate UUID - main_batch.add("GU", "E8 ? ? ? ? 84 C0 74 0C 48 8B 44 24 ? 48 89 03", [this](memory::handle ptr) { - m_generate_uuid = ptr.add(1).rip().as(); - }); - - // Host Token - main_batch.add("HT", "48 8B 05 ? ? ? ? 48 83 F8 FF", [this](memory::handle ptr) { - m_host_token = ptr.add(3).rip().as(); - }); - - // Profile Gamer Info - main_batch.add("PGI", "48 8D 05 ? ? ? ? 48 8B FE", [this](memory::handle ptr) { - m_profile_gamer_info = ptr.add(3).rip().as(); - }); - - // Player Info Gamer Info - main_batch.add("PIGI", "E8 ? ? ? ? 48 8D 4D 20 48 8B D0 E8 ? ? ? ? 41 8A CF", [this](memory::handle ptr) { - m_player_info_gamer_info = ptr.add(1).rip().add(3).rip().as(); - }); - - // Communications - main_batch.add("C", "48 8B 1D ? ? ? ? 48 8D 4C 24 30", [this](memory::handle ptr) { - m_communications = ptr.add(3).rip().as(); - }); - - // Serialize Ped Inventory Data Node - main_batch.add("SPIDN", "48 8B C4 48 89 58 08 48 89 68 10 48 89 70 18 48 89 78 20 41 54 41 56 41 57 48 83 EC 20 48 8B 02 48 8B F1 48 8B CA 48 8B FA FF 90", [this](memory::handle ptr) { - m_serialize_ped_inventory_data_node = ptr.as(); - }); - - // Serialize Vehicle Gadget Data Node - main_batch.add("SVGDN", "48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 57 41 56 41 57 48 83 EC 30 48 8B 02 48 8D", [this](memory::handle ptr) { - m_serialize_vehicle_gadget_data_node = ptr.as(); - }); - - // Get Vehicle Gadget Array Size - main_batch.add("GVGAS", "40 53 48 83 EC 40 33 DB E8", [this](memory::handle ptr) { - m_get_vehicle_gadget_array_size = ptr.as(); - }); - - // Handle Join Request - main_batch.add("HJR", "48 8B C4 48 89 58 08 4C 89 48 20 4C 89 40 18 48 89 50 10 55 56 57 41 54 41 55 41 56 41 57 48 8D A8 E8", [this](memory::handle ptr) { - m_handle_join_request = ptr.as(); - }); - - // Write Join Response Data - main_batch.add("WJRD", "E8 ?? ?? ?? ?? 41 8B DF 84 C0", [this](memory::handle ptr) { - m_write_join_response_data = ptr.add(1).rip().as(); - }); - - // Queue Packet - main_batch.add("QP", "E8 ? ? ? ? 84 C0 74 4D B3 01", [this](memory::handle ptr) { - m_queue_packet = ptr.add(1).rip().as(); - }); - - // Sort Session Details - main_batch.add("SGS", "C3 0F 2E 42 0C", [this](memory::handle ptr) { - m_sort_session_details = ptr.sub(0x10).as(); - }); - - // Add Player To Session - main_batch.add("APTS", "E8 ?? ?? ?? ?? 48 8D 8D F0 01 00 00 8A D8", [this](memory::handle ptr) { - m_add_player_to_session = ptr.add(1).rip().as(); - }); - - // Send Chat Net Message - main_batch.add("SCNM", "E8 ? ? ? ? 41 FF C4 48 83 C5 08", [this](memory::handle ptr) { - m_send_chat_net_message = ptr.add(1).rip().as(); - }); - - // Process Matchmaking Find Response - main_batch.add("PMFR", "48 89 5C 24 08 48 89 74 24 10 57 48 81 EC F0 00 00 00 41 83", [this](memory::handle ptr) { - m_process_matchmaking_find_response = ptr.as(); - }); - - // Serialize Player Data Message - main_batch.add("SPDM", "48 89 5C 24 08 48 89 74 24 10 48 89 7C 24 18 41 56 48 83 EC 20 BF 01 00 00 00", [this](memory::handle ptr) { - m_serialize_player_data_msg = ptr.as(); - }); - - // Serialize Join Request Message - main_batch.add("SJRM", "E8 ?? ?? ?? ?? 84 C0 0F 84 9B 00 00 00 49 8D 8F 50 11 00 00", [this](memory::handle ptr) { - m_serialize_join_request_message = ptr.add(1).rip().as(); - }); - - // Send Network Damage - main_batch.add("SND", "E8 ? ? ? ? E9 E9 01 00 00 48 8B CB", [this](memory::handle ptr) { - m_send_network_damage = ptr.add(1).rip().as(); - }); - - // Request Ragdoll - main_batch.add("RR", "E8 ? ? ? ? 09 B3 ? ? ? ? 48 8B 5C 24", [this](memory::handle ptr) { - m_request_ragdoll = ptr.add(1).rip().as(); - }); - - // Request Control - main_batch.add("RC", "E8 ? ? ? ? EB 3E 48 8B D3", [this](memory::handle ptr) { - m_request_control = ptr.add(1).rip().as(); - }); - - // Get Connection Peer & Send Remove Gamer Command - main_batch.add("GCP&SRGC", "8D 42 FF 83 F8 FD 77 3D", [this](memory::handle ptr) { - m_get_connection_peer = ptr.add(23).rip().as(); - m_send_remove_gamer_cmd = ptr.add(65).rip().as(); - }); - - // Handle Remove Gamer Command - main_batch.add("HRGC", "41 FF C6 FF C7", [this](memory::handle ptr) { - m_handle_remove_gamer_cmd = ptr.sub(0x6E).as(); - }); - - // Broadcast Net Array - main_batch.add("BNA", "48 89 5C 24 ? 48 89 54 24 ? 55 56 57 41 54 41 55 41 56 41 57 48 83 EC 40 48 8B 05 ? ? ? ? 66 44 89 4C 24", [this](memory::handle ptr) { - m_broadcast_net_array = ptr.as(); - }); - - // Rage Security - main_batch.add("RS", "48 8B 1D ? ? ? ? 33 F6 BD C3 9E 26 00", [this](memory::handle ptr) { - m_security = ptr.add(3).rip().as*>(); - }); - - // Send Session Matchmaking Attributes - main_batch.add("SSMA", "48 8B C4 48 89 58 08 48 89 68 10 48 89 70 18 48 89 78 20 41 56 48 81 EC D0 00 00 00 49 8B", [this](memory::handle ptr) { - m_send_session_matchmaking_attributes = ptr.as(); - }); - - // Serialize Take Off Ped Variation Task - main_batch.add("STOPVT", "40 55 53 57 41 56 48 8B EC 48 83 EC 68", [this](memory::handle ptr) { - m_serialize_take_off_ped_variation_task = ptr.as(); - }); - - // Chat Data - main_batch.add("CD", "48 8B 05 ? ? ? ? 0F 45 DF", [this](memory::handle ptr) { - m_chat_data = ptr.add(3).rip().as(); - }); - - // Social Club Info - main_batch.add("SCI", "48 8B D3 48 8D 4C 24 ? 48 69 D2", [this](memory::handle ptr) { - m_sc_info = ptr.sub(4).rip().as(); - }); - - // Create Script Handler - main_batch.add("CSH", "48 8D 05 ? ? ? ? 4C 8D 0D ? ? ? ? 41 83 C8 FF 48 89 03 89 53 70 88 53 74 4C 89 4B 68 48 89 93", [this](memory::handle ptr) { - m_create_script_handler = *(ptr.add(3).rip().as() + 8); - }); - - // Constraint Attachment Crash - main_batch.add("CAC", "40 53 48 83 EC 20 48 8B D9 48 8B 49 38 48 8B 01", [this](memory::handle ptr) { - m_constraint_attachment_crash = ptr.as(); - }); - - // Invalid Decal Crash - main_batch.add("IDC", "E8 ? ? ? ? 8B 9C 24 B8 00 00 00 4C 8B AC 24 A8 00 00 00", [this](memory::handle ptr) { - m_invalid_decal_crash = ptr.add(1).rip().as(); - }); - - // Task Parachute Object 0x270 - main_batch.add("TPO270", "0F 88 ? ? ? ? 75 34", [this](memory::handle ptr) { - m_task_parachute_object_0x270 - = ptr.sub(6).as(); - }); - - // Encode Session Info - main_batch.add("ESI", "E8 ? ? ? ? C6 83 94 01 00 00 01", [this](memory::handle ptr) { - m_encode_session_info = ptr.add(1).rip().as(); - }); - - // Decode Session Info - main_batch.add("DSI", "E8 ?? ?? ?? ?? 84 C0 74 16 48 8B 4B 60", [this](memory::handle ptr) { - m_decode_session_info = ptr.add(1).rip().as(); - }); - - // Decode Peer Info - main_batch.add("DPI", "48 89 5C 24 08 48 89 74 24 10 57 48 81 EC C0 00 00 00 48 8B F1 49", [this](memory::handle ptr) { - m_decode_peer_info = ptr.as(); - }); - - // Main File Object - main_batch.add("MFO", "48 8D 05 ? ? ? ? 48 8D 1C D0 EB 03", [this](memory::handle ptr) { - m_main_file_object = ptr.add(3).rip().as(); - }); - - // Load Cloud File - main_batch.add("LCF", "48 89 5C 24 08 48 89 74 24 10 57 48 83 EC 40 48 8B F2 48 8B D9 41 8B D0", [this](memory::handle ptr) { - m_load_cloud_file = ptr.as(); - }); - - // Set As Active Cloud File - main_batch.add("SAACF", "48 83 EC 28 45 33 C0 4C 39", [this](memory::handle ptr) { - m_set_as_active_cloud_file = ptr.as(); - }); - - // Save JSON Data - main_batch.add("SJD", "48 89 5C 24 08 57 48 83 EC 30 33 DB 48 8B FA 48", [this](memory::handle ptr) { - m_save_json_data = ptr.as(); - }); - - // Network Time - main_batch.add("NT", "48 8B 0D ? ? ? ? E8 ? ? ? ? 33 DB 84 C0 74 41", [this](memory::handle ptr) { - m_network_time = ptr.add(3).rip().as(); - }); - - // Sync Network Time - main_batch.add("SNT", "E8 ? ? ? ? 8B 43 5C", [this](memory::handle ptr) { - m_sync_network_time = ptr.add(1).rip().as(); - }); - - // Queue Dependency - main_batch.add("QD", "48 89 5C 24 ? 57 48 83 EC ? 0F B6 99", [this](memory::handle ptr) { - m_queue_dependency = ptr.as(); - }); - - // Interval Check Function - main_batch.add("ICF", "48 8D 0D ? ? ? ? 88 05 ? ? ? ? 48 8D 05", [this](memory::handle ptr) { - m_interval_check_func = ptr.add(3).rip().as(); - }); - - // Prepare Metric For Sending - main_batch.add("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 E8 4C 8D 40 EC 49 8B F1 48 8B D9 40 32 FF E8", [this](memory::handle ptr) { - m_prepare_metric_for_sending = ptr.as(); - }); - - // Send Packet - main_batch.add("SP", "48 8B C4 48 89 58 08 48 89 70 10 48 89 78 18 4C 89 48 20 55 41 54 41 55 41 56 41 57 48 8D A8 98", [this](memory::handle ptr) { - m_send_packet = ptr.as(); - }); - - // Connect To Peer - main_batch.add("CTP", "48 89 5C 24 08 4C 89 4C 24 20 48 89 54 24 10 55 56 57 41 54 41 55 41 56 41 57 48 83 EC 60 4D", [this](memory::handle ptr) { - m_connect_to_peer = ptr.as(); - }); - - // Fragment Physics Crash - main_batch.add("FPC", "E8 ? ? ? ? 44 8B 4D 1C", [this](memory::handle ptr) { - m_fragment_physics_crash = ptr.add(1).rip().as(); - }); - - // Fragment Physics Crash 2 - main_batch.add("FPC2", "E8 ? ? ? ? 84 C0 75 0B 41 FF CF", [this](memory::handle ptr) { - m_fragment_physics_crash_2 = ptr.add(1).rip().as(); - }); - - // Clear Ped Tasks Network - main_batch.add("CPTN", "E8 ? ? ? ? EB 28 48 8B 8F A0 10 00 00", [this](memory::handle ptr) { - m_clear_ped_tasks_network = ptr.add(1).rip().as(); - }); - - // Infinite Train Crash - main_batch.add("ITC", "E8 ? ? ? ? F3 44 0F 10 93 90 03 00 00", [this](memory::handle ptr) { - m_infinite_train_crash = ptr.add(1).rip().as(); - m_get_next_carriage = ptr.add(1).rip().add(0xF).rip().as(); - }); - - // Get Entity Attached To - main_batch.add("GEAT", "48 83 EC 28 48 8B 51 50 48 85 D2 74 04", [this](memory::handle ptr) { - m_get_entity_attached_to = ptr.as(); - }); - - // Received Array Update - main_batch.add("RAU", "48 89 5C 24 10 55 56 57 41 54 41 55 41 56 41 57 48 8B EC 48 83 EC 30 48 8B 05", [this](memory::handle ptr) { - m_received_array_update = ptr.as(); - }); - - // Receive Pickup - main_batch.add("RPI", "49 8B 80 ? ? ? ? 48 85 C0 74 0C F6 80 ? ? ? ? ? 75 03 32 C0 C3", [this](memory::handle ptr) { - m_receive_pickup = ptr.as(); - }); - - // Write Player Camera Data Node - main_batch.add("WPCDN", "48 8B C4 48 89 58 20 55 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 B0 48 81 EC 50 01 00 00 4C", [this](memory::handle ptr) { - m_write_player_camera_data_node = ptr.as(); - }); - - // Send Player Card Stats - main_batch.add("SPCS", "48 89 5C 24 08 57 48 83 EC 30 48 83 64 24 20 00 48 8B DA 41", [this](memory::handle ptr) { - m_send_player_card_stats = ptr.as(); - }); - - // Force Player Card Refresh - main_batch.add("FPCR", "44 38 2D ? ? ? ? 74 1D 44 00 A6 BB 07 00 00", [this](memory::handle ptr) { - m_force_player_card_refresh = ptr.add(3).rip().as(); - }); - - // Serialize Stats - main_batch.add("SS", "48 89 5C 24 08 48 89 74 24 10 48 89 7C 24 20 55 41 54 41 55 41 56 41 57 48 8B EC 48 83 EC 50 45", [this](memory::handle ptr) { - m_serialize_stats = ptr.as(); - }); - - // Write Player Creation Data Node - main_batch.add("WPCDN", "48 83 EC 38 48 8B 81 F0", [this](memory::handle ptr) { - m_write_player_creation_data_node = ptr.as(); - }); - - // Write Player Appearance Data Node - main_batch.add("WPADN", "48 8B C4 48 89 50 10 48 89 48 08 53", [this](memory::handle ptr) { - m_write_player_appearance_data_node = ptr.as(); - }); - - // Enumerate Audio Devices - main_batch.add("EAD", "48 89 5C 24 08 48 89 7C 24 10 55 48 8B EC 48 83 EC 70 41", [this](memory::handle ptr) { - m_enumerate_audio_devices = ptr.as(); - }); - - // Direct Sound Capture Create - main_batch.add("DSCC", "E8 ? ? ? ? 33 FF 85 C0 78 C1", [this](memory::handle ptr) { - m_direct_sound_capture_create = ptr.add(1).rip().as(); - }); - - // Refresh Audio Input - main_batch.add("RAI", "40 88 3D ? ? ? ? 89 05 ? ? ? ? 40 38 3D", [this](memory::handle ptr) { - m_refresh_audio_input = ptr.add(3).rip().as(); - }); - - // Allow Weapons In Vehicle - main_batch.add("AWIV", "49 8B 40 08 39 10", [this](memory::handle ptr) { - m_allow_weapons_in_vehicle = ptr.sub(23).as(); - }); - - // Write Vehicle Proximity Migration Data Node - main_batch.add("WVPMDN", "48 89 4C 24 08 55 53 56 57 41 54 41 55 41 56 41 57 48 8B EC 48 83 EC 68 4C 8B A9", [this](memory::handle ptr) { - m_write_vehicle_proximity_migration_data_node = ptr.as(); - }); - - // Migrate Object - main_batch.add("MO", "48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 57 41 54 41 55 41 56 41 57 48 83 EC 20 41 8B F8 48", [this](memory::handle ptr) { - m_migrate_object = ptr.as(); - }); - - // Task Jump Constructor - main_batch.add("TJC", "48 89 5C 24 ? 89 54 24 10 57 48 83 EC 30 0F 29 74 24", [this](memory::handle ptr) { - m_taskjump_constructor = ptr.as(); - }); - - if (!main_batch.run(mem_region)) - { - throw std::runtime_error("Failed to find some patterns."); - } - } - - void pointers::run_socialclub_batch() - { - memory::batch socialclub_batch; - - // Presence Data - socialclub_batch.add("PD", "48 8D 05 ? ? ? ? 48 8B F1 48 89 01 48 83 C1 08 E8 ? ? ? ? 48 8D 8E 3B 4E 00 00", [this](memory::handle ptr) { - auto presence_data_vft = ptr.add(3).rip().as(); - m_update_presence_attribute_int = presence_data_vft[1]; - m_update_presence_attribute_string = presence_data_vft[3]; - }); - - // Start Get Presence Attributes - socialclub_batch.add("SGPA", "48 8B C4 48 89 58 08 48 89 68 10 48 89 70 18 48 89 78 20 41 54 41 56 41 57 48 83 EC 40 33 DB 41", [this](memory::handle ptr) { - m_start_get_presence_attributes = ptr.as(); - }); - - auto sc_module = memory::module("socialclub.dll"); - if (sc_module.wait_for_module()) - { - socialclub_batch.run(sc_module); - } - else - LOG(WARNING) << "socialclub.dll module was not loaded within the time limit."; + // clang-format off + + constexpr auto batch_and_hash = memory::make_batch< + // Presence Data + { + "PD", + "48 8D 05 ? ? ? ? 48 8B F1 48 89 01 48 83 C1 08 E8 ? ? ? ? 48 8D 8E 3B 4E 00 00", + [](memory::handle ptr) + { + auto presence_data_vft = ptr.add(3).rip().as(); + g_pointers->m_sc.m_update_presence_attribute_int = presence_data_vft[1]; + g_pointers->m_sc.m_update_presence_attribute_string = presence_data_vft[3]; + } + }, + // Start Get Presence Attributes + { + "SGPA", + "48 8B C4 48 89 58 08 48 89 68 10 48 89 70 18 48 89 78 20 41 54 41 56 41 57 48 83 EC 40 33 DB 41", + [](memory::handle ptr) + { + g_pointers->m_sc.m_start_get_presence_attributes = ptr.as(); + } + } + >(); + + // clang-format on + + return batch_and_hash; } void pointers::freemode_thread_restorer_through_vm_patch(const memory::module& mem_region) { - if (auto pat1 = mem_region.scan("3b 0a 0f 83 ? ? ? ? 48 ff c7")) - { - memory::byte_patch::make(pat1.add(2).as(), 0xc9310272)->apply(); - memory::byte_patch::make(pat1.add(6).as(), 0x9090)->apply(); - } - - if (auto pat2 = mem_region.scan("3b 0a 0f 83 ? ? ? ? 49 03 fa")) - { - memory::byte_patch::make(pat2.add(2).as(), 0xc9310272)->apply(); - memory::byte_patch::make(pat2.add(6).as(), 0x9090)->apply(); - } - auto pat3 = mem_region.scan_all("3b 11 0f 83 ? ? ? ? 48 ff c7"); for (auto& handle : pat3) { @@ -848,118 +1395,95 @@ namespace big } } - // Any change to the sigs should have this number bumped, especially if the existing offsets are changing - // Note: you don't need to bump that number when all the sigs stay the same and that the game updates, - // because we also check against the game version and the online version. - constexpr uint32_t pointers_version = 1; + void pointers::load_pointers_from_cache(const cache_file& cache_file, const uintptr_t pointer_to_cacheable_data_start, const memory::module& mem_region) + { + // fill pointers instance fields by reading the file data into it + + LOG(INFO) << "Loading pointers instance from cache"; + + // multiple things here: + // - iterate each cacheable field of the pointers instance + // - add the base module address to the current offset retrieved from the cache + // - assign that ptr to the pointers field + uintptr_t* cache_data = reinterpret_cast(cache_file.data()); + + const size_t field_count_from_cache = cache_file.data_size() / sizeof(uintptr_t); + LOG(INFO) << "Pointers cache: Loading " << field_count_from_cache << " fields from the cache"; + + uintptr_t* field_ptr = reinterpret_cast(pointer_to_cacheable_data_start); + for (size_t i = 0; i < field_count_from_cache; i++) + { + uintptr_t offset = cache_data[i]; + uintptr_t ptr = offset + mem_region.begin().as(); + + if (mem_region.contains(memory::handle(ptr))) + { + *field_ptr = ptr; + } + else + { + LOG(FATAL) << "Just tried to load from cache a pointer supposedly within the gta 5 module range but wasnt!!! Offset from start of pointers instance: " << (reinterpret_cast(field_ptr) - reinterpret_cast(this)); + } + + field_ptr++; + } + } pointers::pointers() : - m_pointers_cache(g_file_manager->get_project_file("./cache/pointers.bin"), pointers_version) + m_gta_pointers_cache(g_file_manager->get_project_file("./cache/gta_pointers.bin")), + m_sc_pointers_cache(g_file_manager->get_project_file("./cache/sc_pointers.bin")) { - memory::batch version_batch; + g_pointers = this; - // game version + online version - version_batch.add("GVOV", "8B C3 33 D2 C6 44 24 20", [this](memory::handle ptr) { - m_game_version = ptr.add(0x24).rip().as(); - m_online_version = ptr.add(0x24).rip().add(0x20).as(); + // clang-format off - m_game_version_uint32_t = std::strtoul(m_game_version, nullptr, 10); - m_online_version_float = std::strtof(m_online_version, nullptr); - }); + constexpr auto version_batch = memory::make_batch< + // game version + online version + { + "GVOV", + "8B C3 33 D2 C6 44 24 20", + [](memory::handle ptr) + { + g_pointers->m_game_version = ptr.add(0x24).rip().as(); + g_pointers->m_online_version = ptr.add(0x24).rip().add(0x20).as(); + + g_pointers->m_game_version_uint32_t = std::strtoul(g_pointers->m_game_version, nullptr, 10); + g_pointers->m_online_version_float = std::strtof(g_pointers->m_online_version, nullptr); + } + } + >(); + + // clang-format on const auto mem_region = memory::module("GTA5.exe"); - // save offsets of the fields to cache - - // get the beginning and the end of what we need to save / load - constexpr size_t offset_of_cache_begin_field = offsetof(big::pointers, m_offset_gta_module_cache_start) + sizeof(uintptr_t); - constexpr size_t offset_of_cache_end_field = offsetof(big::pointers, m_offset_gta_module_cache_end); - constexpr size_t field_count = (offset_of_cache_end_field - offset_of_cache_begin_field) / sizeof(void*); - - // stupid check to see if we are aligned, don't really guarantee that the for loop below will succeed - static_assert(((offset_of_cache_end_field - offset_of_cache_begin_field) % sizeof(void*)) == 0, "not aligned, prolly mean that there are rogue non cacheable fields between start and end"); - - const uintptr_t pointer_to_cacheable_data_start = reinterpret_cast(this) + offset_of_cache_begin_field; - const uintptr_t pointer_to_cacheable_data_end = reinterpret_cast(this) + offset_of_cache_end_field; - - if (!is_pointers_cache_up_to_date(version_batch, mem_region)) + const auto found_game_version = memory::batch_runner::run(version_batch.m_batch, mem_region); + if (!found_game_version) { - run_cacheable_main_batch(mem_region); + LOG(WARNING) << "Failed to find version patterns. Can't utilize pointers cache."; + } - constexpr size_t data_size = offset_of_cache_end_field - offset_of_cache_begin_field; + constexpr auto gta_batch_and_hash = pointers::get_gta_batch(); + constexpr cstxpr_str gta_batch_name{"GTA5"}; + write_to_cache_or_read_from_cache(m_gta_pointers_cache, mem_region, found_game_version); - big::cache_data cache_data_ptr = std::make_unique(data_size); - - // multiple things here: - // - iterate each cacheable field of the pointers instance - // - substract the base module address so that we only keep the offsets - // - save that to the cache - uintptr_t* cache_data = reinterpret_cast(cache_data_ptr.get()); - - size_t i = 0; - for (uintptr_t field_ptr = pointer_to_cacheable_data_start; field_ptr != pointer_to_cacheable_data_end; field_ptr += sizeof(uintptr_t)) - { - const uintptr_t field_value = *reinterpret_cast(field_ptr); - - if (mem_region.contains(memory::handle(field_value))) - { - const uintptr_t offset = field_value - mem_region.begin().as(); - cache_data[i] = offset; - } - else - { - LOG(FATAL) << "Just tried to save to cache a pointer supposedly within the gta 5 module range but wasnt!!! Offset from start of pointers instance: " << (field_ptr - reinterpret_cast(this)); - } - - i++; - } - - LOG(INFO) << "Pointers cache: saved " << (data_size / sizeof(uintptr_t)) << " fields to the cache"; - - m_pointers_cache.set_data(std::move(cache_data_ptr), data_size); - - m_pointers_cache.set_header_version(m_game_version_uint32_t, m_online_version_float); - m_pointers_cache.write(); + auto sc_module = memory::module("socialclub.dll"); + if (sc_module.wait_for_module()) + { + constexpr auto sc_batch_and_hash = pointers::get_sc_batch(); + constexpr cstxpr_str sc_batch_name{"Social Club"}; + write_to_cache_or_read_from_cache(m_sc_pointers_cache, sc_module, found_game_version); } else - { - // fill pointers instance fields by reading the file data into it - - LOG(INFO) << "Loading pointers instance from cache"; - - // multiple things here: - // - iterate each cacheable field of the pointers instance - // - add the base module address to the current offset retrieved from the cache - // - assign that ptr to the pointers field - uintptr_t* cache_data = reinterpret_cast(m_pointers_cache.data()); - - const size_t field_count_from_cache = m_pointers_cache.data_size() / sizeof(uintptr_t); - LOG(INFO) << "Pointers cache: Loading " << field_count_from_cache << " fields from the cache"; - - uintptr_t* field_ptr = reinterpret_cast(pointer_to_cacheable_data_start); - for (size_t i = 0; i < field_count_from_cache; i++) - { - uintptr_t offset = cache_data[i]; - uintptr_t gta_module_ptr = offset + mem_region.begin().as(); - - if (mem_region.contains(memory::handle(gta_module_ptr))) - { - *field_ptr = gta_module_ptr; - } - else - { - LOG(FATAL) << "Just tried to load from cache a pointer supposedly within the gta 5 module range but wasnt!!! Offset from start of pointers instance: " << (reinterpret_cast(field_ptr) - reinterpret_cast(this)); - } - - field_ptr++; - } - } - - m_pointers_cache.free(); - - always_run_main_batch(mem_region); - - run_socialclub_batch(); + LOG(WARNING) << "socialclub.dll module was not loaded within the time limit."; freemode_thread_restorer_through_vm_patch(mem_region); @@ -967,14 +1491,10 @@ namespace big if (!m_hwnd) throw std::runtime_error("Failed to find the game's window."); - - g_pointers = this; } pointers::~pointers() { - memory::byte_patch::restore_all(); - g_pointers = nullptr; } } diff --git a/src/pointers.hpp b/src/pointers.hpp index 55ffc880..4cffc351 100644 --- a/src/pointers.hpp +++ b/src/pointers.hpp @@ -1,6 +1,5 @@ #pragma once #include "base/HashTable.hpp" -#include "common.hpp" #include "function_types.hpp" #include "gta/fwddec.hpp" #include "gta/replay.hpp" @@ -9,39 +8,108 @@ #include "memory/module.hpp" #include "services/gta_data/cache_file.hpp" #include "socialclub/ScInfo.hpp" - -class CCommunications; -class FriendRegistry; -class CNetworkPlayerMgr; -class Network; -class ChatData; - -namespace rage -{ - template - class atSingleton; - class RageSecurity; - class netTime; - class rlGamerInfo; -} - -extern "C" std::uint64_t g_sound_overload_ret_addr; +#include "util/compile_time_helpers.hpp" +#include "gta_pointers.hpp" +#include "sc_pointers.hpp" namespace big { - // needed for serialization of the pointers cache -#pragma pack(push, 1) class pointers { private: - bool is_pointers_cache_up_to_date(memory::batch& version_batch, const memory::module& mem_region); + template + void write_to_cache_or_read_from_cache(cache_file& cache_file, const memory::module& mem_region, const bool found_version_cache) + { + static_assert(batch_hash > 0); - // we can't cache things like pointers we allocate on the heap - void always_run_main_batch(const memory::module& mem_region); + cache_file.set_cache_version(batch_hash); - void run_cacheable_main_batch(const memory::module& mem_region); + const uintptr_t pointer_to_cacheable_data_start = reinterpret_cast(this) + offset_of_cache_begin_field; - void run_socialclub_batch(); + if (!found_version_cache || !is_pointers_cache_up_to_date(cache_file, mem_region)) + { + run_batch(batch, mem_region); + + const uintptr_t pointer_to_cacheable_data_end = reinterpret_cast(this) + offset_of_cache_end_field; + write_pointers_to_cache(cache_file, pointer_to_cacheable_data_start, pointer_to_cacheable_data_end, mem_region); + } + else + { + load_pointers_from_cache(cache_file, pointer_to_cacheable_data_start, mem_region); + } + + cache_file.free(); + } + + void load_pointers_from_cache(const cache_file& cache_file, const uintptr_t pointer_to_cacheable_data_start, const memory::module& mem_region); + + template + void write_pointers_to_cache(cache_file& cache_file, const uintptr_t pointer_to_cacheable_data_start, const uintptr_t pointer_to_cacheable_data_end, const memory::module& mem_region) + { + constexpr size_t data_size = offset_of_cache_end_field - offset_of_cache_begin_field; + + cache_data cache_data_ptr = std::make_unique(data_size); + + // multiple things here: + // - iterate each cacheable field of the pointers instance + // - substract the base module address so that we only keep the offsets + // - save that to the cache + uintptr_t* cache_data = reinterpret_cast(cache_data_ptr.get()); + + size_t i = 0; + for (uintptr_t field_ptr = pointer_to_cacheable_data_start; field_ptr != pointer_to_cacheable_data_end; field_ptr += sizeof(uintptr_t)) + { + const uintptr_t field_value = *reinterpret_cast(field_ptr); + + if (mem_region.contains(memory::handle(field_value))) + { + const uintptr_t offset = field_value - mem_region.begin().as(); + cache_data[i] = offset; + } + else + { + LOG(FATAL) << "Just tried to save to cache a pointer supposedly within the " << batch_name.str << " module range but wasnt !!!Offset from start of pointers instance : " << (field_ptr - reinterpret_cast(this)); + } + + i++; + } + + LOG(INFO) << "Pointers cache: saved " << (data_size / sizeof(uintptr_t)) << " fields to the cache"; + + cache_file.set_data(std::move(cache_data_ptr), data_size); + + cache_file.set_header_version(m_game_version_uint32_t, m_online_version_float); + cache_file.write(); + } + + template + bool is_pointers_cache_up_to_date(cache_file& cache_file, const memory::module& mem_region) + { + cache_file.load(); + + if (cache_file.up_to_date(m_game_version_uint32_t, m_online_version_float)) + { + LOG(INFO) << batch_name.str << " pointers cache is up to date, using it."; + + return true; + } + + return false; + } + + static constexpr auto get_gta_batch(); + static constexpr auto get_sc_batch(); + + template + void run_batch(const memory::batch& batch, const memory::module& mem_region) + { + if (!memory::batch_runner::run(batch, mem_region)) + { + const std::string error_message = + std::string("Failed to find some patterns for ") + std::string(batch_name.str); + throw std::runtime_error(error_message); + } + } void freemode_thread_restorer_through_vm_patch(const memory::module& mem_region); @@ -50,254 +118,24 @@ namespace big ~pointers(); private: - cache_file m_pointers_cache; + cache_file m_gta_pointers_cache; + cache_file m_sc_pointers_cache; public: HWND m_hwnd{}; - memory::byte_patch* m_max_wanted_level; - memory::byte_patch* m_max_wanted_level_2; - - memory::byte_patch* m_blame_explode; - memory::byte_patch* m_explosion_patch; - - memory::byte_patch* m_disable_collision{}; - - memory::byte_patch* m_broadcast_patch; + // Those version pointers are not in the gta pointers struct due to always having to look for them in the binary + // (We use them as a way of checking if the cache needs to be updated or not on game updates) + const char* m_game_version; + const char* m_online_version; uint32_t m_game_version_uint32_t; float m_online_version_float; - // Pointers inside social club module START - PVOID m_update_presence_attribute_int; - PVOID m_update_presence_attribute_string; + gta_pointers m_gta; - functions::start_get_presence_attributes m_start_get_presence_attributes; - // Pointers inside social club module END - - // don't remove, used for signaling the start of the pointers gta module offset cache - // Note: between the start and the end, only pointers coming from the gta 5 module should be in there - void* m_offset_gta_module_cache_start; - - eGameState* m_game_state{}; - bool* m_is_session_started{}; - - CPedFactory** m_ped_factory{}; - CNetworkPlayerMgr** m_network_player_mgr{}; - CNetworkObjectMgr** m_network_object_mgr{}; - rage::CReplayInterface** m_replay_interface{}; - - functions::ptr_to_handle m_ptr_to_handle{}; - functions::handle_to_ptr m_handle_to_ptr{}; - rage::scrNativeRegistrationTable* m_native_registration_table{}; - functions::get_native_handler m_get_native_handler{}; - functions::fix_vectors m_fix_vectors{}; - - rage::atArray* m_script_threads{}; - rage::scrProgramTable* m_script_program_table{}; - functions::run_script_threads m_run_script_threads{}; - std::int64_t** m_script_globals{}; - - CGameScriptHandlerMgr** m_script_handler_mgr{}; - - IDXGISwapChain** m_swapchain{}; - - int* m_resolution_x; - int* m_resolution_y; - - uint32_t* m_region_code; - - PVOID m_world_model_spawn_bypass; - PVOID m_native_return; - PVOID m_get_label_text; - functions::check_chat_profanity* m_check_chat_profanity{}; - functions::write_player_game_state_data_node m_write_player_game_state_data_node{}; - - ChatData** m_chat_data; - ScInfo* m_sc_info; - FriendRegistry* m_friend_registry{}; - - functions::get_screen_coords_for_world_coords m_get_screen_coords_for_world_coords{}; - - HashTable* m_model_table; - PVOID m_get_model_info; - - PVOID m_gta_thread_start{}; - PVOID m_gta_thread_kill{}; - - PVOID m_network_player_mgr_init; - PVOID m_network_player_mgr_shutdown; - - functions::get_gameplay_cam_coords m_get_gameplay_cam_coords; - - PVOID m_write_player_gamer_data_node{}; - - functions::trigger_script_event m_trigger_script_event{}; - - // Bitbuffer Read/Write START - functions::read_bitbuf_dword m_read_bitbuf_dword{}; - functions::read_bitbuf_string m_read_bitbuf_string{}; - functions::read_bitbuf_bool m_read_bitbuf_bool{}; - functions::read_bitbuf_array m_read_bitbuf_array{}; - functions::write_bitbuf_qword m_write_bitbuf_qword{}; - functions::write_bitbuf_dword m_write_bitbuf_dword{}; - functions::write_bitbuf_int64 m_write_bitbuf_int64{}; - functions::write_bitbuf_int32 m_write_bitbuf_int32{}; - functions::write_bitbuf_bool m_write_bitbuf_bool{}; - functions::write_bitbuf_array m_write_bitbuf_array{}; - // Bitbuffer Read/Write END - - // Received Event Signatures START - PVOID m_received_event{}; - functions::send_event_ack m_send_event_ack{}; - // Received Event Signatures END - - //Sync Signatures START - PVOID m_received_clone_create; - PVOID m_received_clone_sync; - PVOID m_can_apply_data; - functions::get_sync_tree_for_type m_get_sync_tree_for_type{}; - functions::get_sync_type_info m_get_sync_type_info{}; - functions::get_net_object m_get_net_object{}; - functions::read_bitbuffer_into_sync_tree m_read_bitbuffer_into_sync_tree{}; - //Sync Signatures END - - PVOID m_receive_net_message{}; - PVOID m_get_network_event_data{}; - PVOID m_assign_physical_index{}; - - Network** m_network; - - functions::start_get_session_by_gamer_handle m_start_get_session_by_gamer_handle; - functions::start_matchmaking_find_sessions m_start_matchmaking_find_sessions; - functions::join_session_by_info m_join_session_by_info; - - functions::reset_network_complaints m_reset_network_complaints{}; - - functions::fidevice_get_device m_fidevice_get_device{}; - uintptr_t m_fidevices{}; - uint16_t* m_fidevices_len{}; - functions::fipackfile_ctor m_fipackfile_ctor{}; - rage::fiPackfile** m_fipackfile_instances{}; - functions::fipackfile_open_archive m_fipackfile_open_archive{}; - functions::fipackfile_mount m_fipackfile_mount{}; - functions::fipackfile_unmount m_fipackfile_unmount{}; - - const char* m_game_version; - const char* m_online_version; - - PVOID m_invalid_mods_crash_detour{}; - PVOID m_constraint_attachment_crash{}; - PVOID m_invalid_decal_crash{}; - PVOID m_task_parachute_object_0x270{}; - - int64_t** m_send_chat_ptr{}; - functions::send_chat_message m_send_chat_message{}; - - PVOID m_init_native_tables{}; - functions::script_vm m_script_vm{}; - - functions::generate_uuid m_generate_uuid{}; - std::uint64_t* m_host_token{}; - rage::rlGamerInfo* m_profile_gamer_info{}; // per profile gamer info - rage::rlGamerInfo* m_player_info_gamer_info{}; // the gamer info that is applied to CPlayerInfo - CCommunications** m_communications{}; - - PVOID m_serialize_ped_inventory_data_node; - PVOID m_serialize_vehicle_gadget_data_node; - functions::get_vehicle_gadget_array_size m_get_vehicle_gadget_array_size; - - PVOID m_handle_join_request; - functions::write_join_response_data m_write_join_response_data; - - functions::queue_packet m_queue_packet; - - PVOID m_sort_session_details; - - PVOID m_add_player_to_session; - PVOID m_send_chat_net_message; - - PVOID m_process_matchmaking_find_response; - PVOID m_serialize_player_data_msg; - - PVOID m_serialize_join_request_message; - - functions::give_pickup_rewards m_give_pickup_rewards{}; - functions::send_network_damage m_send_network_damage; - functions::request_ragdoll m_request_ragdoll; - functions::request_control m_request_control; - functions::clear_ped_tasks_network m_clear_ped_tasks_network; - - functions::get_connection_peer m_get_connection_peer{}; - functions::send_remove_gamer_cmd m_send_remove_gamer_cmd{}; - functions::handle_remove_gamer_cmd m_handle_remove_gamer_cmd{}; - - PVOID m_broadcast_net_array{}; - - rage::atSingleton* m_security; - PVOID m_prepare_metric_for_sending; - - PVOID m_queue_dependency; - PVOID m_interval_check_func; - - PVOID m_send_session_matchmaking_attributes; - - PVOID m_serialize_take_off_ped_variation_task; - - PVOID m_create_script_handler; - - functions::encode_session_info m_encode_session_info; - functions::decode_session_info m_decode_session_info; - functions::decode_peer_info m_decode_peer_info; - - datafile_commands::SveFileObject* m_main_file_object; - functions::load_cloud_file m_load_cloud_file; - functions::set_as_active_cloud_file m_set_as_active_cloud_file; - functions::save_json_data m_save_json_data; - - rage::netTime** m_network_time; - functions::sync_network_time m_sync_network_time; - - functions::send_packet m_send_packet; - functions::connect_to_peer m_connect_to_peer; - - PVOID m_fragment_physics_crash; - PVOID m_fragment_physics_crash_2; - - PVOID m_infinite_train_crash; - functions::get_next_carriage m_get_next_carriage; - - functions::get_entity_attached_to m_get_entity_attached_to; - - PVOID m_received_array_update; - - PVOID m_receive_pickup{}; - - PVOID m_write_player_camera_data_node{}; - - PVOID m_send_player_card_stats{}; - bool* m_force_player_card_refresh{}; - - PVOID m_serialize_stats{}; - - PVOID m_write_player_creation_data_node{}; - PVOID m_write_player_appearance_data_node{}; - - PVOID m_enumerate_audio_devices{}; - PVOID m_direct_sound_capture_create{}; - bool* m_refresh_audio_input{}; - - PVOID m_allow_weapons_in_vehicle{}; - - PVOID m_taskjump_constructor{}; - - PVOID m_write_vehicle_proximity_migration_data_node{}; - functions::migrate_object m_migrate_object{}; - - // don't remove, used for signaling the end of the pointers gta module offset cache - void* m_offset_gta_module_cache_end; + socialclub_pointers m_sc; }; -#pragma pack(pop) inline pointers* g_pointers{}; } diff --git a/src/renderer.cpp b/src/renderer.cpp index 2821bbf4..dd0646cb 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -16,7 +16,7 @@ IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARA namespace big { renderer::renderer() : - m_dxgi_swapchain(*g_pointers->m_swapchain) + m_dxgi_swapchain(*g_pointers->m_gta.m_swapchain) { if (m_dxgi_swapchain->GetDevice(__uuidof(ID3D11Device), reinterpret_cast(&m_d3d_device)) < 0) { diff --git a/src/sc_pointers.hpp b/src/sc_pointers.hpp new file mode 100644 index 00000000..04748d3f --- /dev/null +++ b/src/sc_pointers.hpp @@ -0,0 +1,15 @@ +#pragma once + +namespace big +{ + // needed for serialization of the pointers cache +#pragma pack(push, 1) + struct socialclub_pointers + { + PVOID m_update_presence_attribute_int; + PVOID m_update_presence_attribute_string; + + functions::start_get_presence_attributes m_start_get_presence_attributes; + }; +#pragma pack(pop) +} diff --git a/src/sc_pointers_layout_info.hpp b/src/sc_pointers_layout_info.hpp new file mode 100644 index 00000000..8c402cb5 --- /dev/null +++ b/src/sc_pointers_layout_info.hpp @@ -0,0 +1,13 @@ +#pragma once +#include "pointers.hpp" + +namespace big +{ + struct sc_pointers_layout_info + { + // get the beginning and the end of what we need to save / load + inline static constexpr size_t offset_of_cache_begin_field = offsetof(big::pointers, m_sc); + inline static constexpr size_t offset_of_cache_end_field = offsetof(big::pointers, m_sc) + sizeof(socialclub_pointers); + inline static constexpr size_t field_count = (offset_of_cache_end_field - offset_of_cache_begin_field) / sizeof(void*); + }; +} diff --git a/src/script_function.cpp b/src/script_function.cpp index 87cadf3a..b0e01849 100644 --- a/src/script_function.cpp +++ b/src/script_function.cpp @@ -56,7 +56,7 @@ namespace big ctx.m_instruction_pointer = m_ip; ctx.m_state = rage::eThreadState::idle; - g_pointers->m_script_vm(stack, g_pointers->m_script_globals, program, &ctx); + g_pointers->m_gta.m_script_vm(stack, g_pointers->m_gta.m_script_globals, program, &ctx); tls_ctx->m_script_thread = og_thread; tls_ctx->m_is_script_thread_active = og_thread != nullptr; @@ -88,7 +88,7 @@ namespace big auto old_ctx = thread->m_context; thread->m_context = ctx; - result = g_pointers->m_script_vm(stack, g_pointers->m_script_globals, program, &thread->m_context); + result = g_pointers->m_gta.m_script_vm(stack, g_pointers->m_gta.m_script_globals, program, &thread->m_context); thread->m_context = old_ctx; tls_ctx->m_script_thread = og_thread; diff --git a/src/script_global.cpp b/src/script_global.cpp index f78158a4..03849d07 100644 --- a/src/script_global.cpp +++ b/src/script_global.cpp @@ -22,6 +22,6 @@ namespace big void* script_global::get() { - return g_pointers->m_script_globals[m_index >> 0x12 & 0x3F] + (m_index & 0x3FFFF); + return g_pointers->m_gta.m_script_globals[m_index >> 0x12 & 0x3F] + (m_index & 0x3FFFF); } } diff --git a/src/services/api/api_service.hpp b/src/services/api/api_service.hpp index d91efe29..09a5ced0 100644 --- a/src/services/api/api_service.hpp +++ b/src/services/api/api_service.hpp @@ -32,7 +32,7 @@ namespace big inline std::string get_ticket() { - return g_pointers->m_sc_info->m_ticket; + return g_pointers->m_gta.m_sc_info->m_ticket; } }; diff --git a/src/services/context_menu/context_menu_service.cpp b/src/services/context_menu/context_menu_service.cpp index 513bb5f1..05dd5fd2 100644 --- a/src/services/context_menu/context_menu_service.cpp +++ b/src/services/context_menu/context_menu_service.cpp @@ -85,8 +85,8 @@ namespace big &screen_result.y); if (success) { - screen_result.x = static_cast(*g_pointers->m_resolution_x) * screen_result.x; - screen_result.y = static_cast(*g_pointers->m_resolution_y) * screen_result.y; + screen_result.x = static_cast(*g_pointers->m_gta.m_resolution_x) * screen_result.x; + screen_result.y = static_cast(*g_pointers->m_gta.m_resolution_y) * screen_result.y; } else { @@ -193,7 +193,7 @@ namespace big void context_menu_service::get_entity_closest_to_screen_center() { m_pointer = nullptr; - if (const auto replay = *g_pointers->m_replay_interface; replay) + if (const auto replay = *g_pointers->m_gta.m_replay_interface; replay) { const auto veh_interface = replay->m_vehicle_interface; const auto ped_interface = replay->m_ped_interface; @@ -212,7 +212,7 @@ namespace big const auto temp_pointer = entity.m_entity_ptr; if (!temp_pointer || !temp_pointer->m_navigation) continue; - const auto temp_handle = g_pointers->m_ptr_to_handle(temp_pointer); + const auto temp_handle = g_pointers->m_gta.m_ptr_to_handle(temp_pointer); const auto pos = temp_pointer->m_navigation->get_position(); HUD::GET_HUD_SCREEN_POSITION_FROM_WORLD_POSITION(pos->x, @@ -245,7 +245,7 @@ namespace big && reinterpret_cast(m_pointer)->m_vehicle) { m_pointer = reinterpret_cast(m_pointer)->m_vehicle; - m_handle = g_pointers->m_ptr_to_handle(m_pointer); + m_handle = g_pointers->m_gta.m_ptr_to_handle(m_pointer); } fill_model_bounding_box_screen_space(); } diff --git a/src/services/creator_storage/creator_storage_service.cpp b/src/services/creator_storage/creator_storage_service.cpp index 854fac41..abb3e28b 100644 --- a/src/services/creator_storage/creator_storage_service.cpp +++ b/src/services/creator_storage/creator_storage_service.cpp @@ -43,7 +43,7 @@ namespace big SCRIPT::SET_SCRIPT_WITH_NAME_HASH_AS_NO_LONGER_NEEDED(RAGE_JOAAT("fm_race_creator")); - auto buffer = g_pointers->m_save_json_data(g_pointers->m_main_file_object, nullptr, "to save it to a file I guess?"); + auto buffer = g_pointers->m_gta.m_save_json_data(g_pointers->m_gta.m_main_file_object, nullptr, "to save it to a file I guess?"); if (!buffer) { @@ -69,8 +69,8 @@ namespace big DATAFILE::DATAFILE_DELETE(0); sCloudFile* cloud_file = nullptr; - g_pointers->m_load_cloud_file(&cloud_file, buffer.data(), buffer.length(), "to load it from a file I guess?"); - g_pointers->m_set_as_active_cloud_file(g_pointers->m_main_file_object, &cloud_file); + g_pointers->m_gta.m_load_cloud_file(&cloud_file, buffer.data(), buffer.length(), "to load it from a file I guess?"); + g_pointers->m_gta.m_set_as_active_cloud_file(g_pointers->m_gta.m_main_file_object, &cloud_file); while (!SCRIPT::HAS_SCRIPT_WITH_NAME_HASH_LOADED(RAGE_JOAAT("fm_race_creator"))) { diff --git a/src/services/friends/friends_service.cpp b/src/services/friends/friends_service.cpp index 914e00fa..11b3bf2e 100644 --- a/src/services/friends/friends_service.cpp +++ b/src/services/friends/friends_service.cpp @@ -23,8 +23,8 @@ namespace big return false; const auto rockstar_id = net_player->get_net_data()->m_gamer_handle.m_rockstar_id; - for (std::uint32_t i = 0; i < g_pointers->m_friend_registry->m_friend_count; i++) - if (rockstar_id == g_pointers->m_friend_registry->get(i)->m_rockstar_id) + for (std::uint32_t i = 0; i < g_pointers->m_gta.m_friend_registry->m_friend_count; i++) + if (rockstar_id == g_pointers->m_gta.m_friend_registry->get(i)->m_rockstar_id) return true; return false; } diff --git a/src/services/gta_data/cache_file.cpp b/src/services/gta_data/cache_file.cpp index a5ff2e40..e745867a 100644 --- a/src/services/gta_data/cache_file.cpp +++ b/src/services/gta_data/cache_file.cpp @@ -2,6 +2,14 @@ namespace big { + cache_file::cache_file(file cache_file) : + m_cache_file(cache_file), + m_data(nullptr), + m_cache_version(0), + m_cache_header() + { + } + cache_file::cache_file(file cache_file, std::uint32_t cache_version) : m_cache_file(cache_file), m_data(nullptr), @@ -78,4 +86,9 @@ namespace big m_cache_header.m_game_version = game_version; m_cache_header.m_online_version = online_version; } -} \ No newline at end of file + + void cache_file::set_cache_version(std::uint32_t cache_version) + { + m_cache_version = cache_version; + } +} diff --git a/src/services/gta_data/cache_file.hpp b/src/services/gta_data/cache_file.hpp index 3e3e68fd..5d75afc8 100644 --- a/src/services/gta_data/cache_file.hpp +++ b/src/services/gta_data/cache_file.hpp @@ -16,6 +16,12 @@ namespace big class cache_file final { public: + /// + /// + /// + /// FileMgr file object + cache_file(file cache_file); + /// /// /// @@ -60,6 +66,8 @@ namespace big /// Online Version void set_header_version(std::uint32_t game_version, float online_version); + void set_cache_version(std::uint32_t cache_version); + private: file m_cache_file; @@ -68,4 +76,4 @@ namespace big cache_header m_cache_header; cache_data m_data; }; -} \ No newline at end of file +} diff --git a/src/services/gta_data/gta_data_service.cpp b/src/services/gta_data/gta_data_service.cpp index 2c5cf0f5..ceb48354 100644 --- a/src/services/gta_data/gta_data_service.cpp +++ b/src/services/gta_data/gta_data_service.cpp @@ -62,7 +62,7 @@ namespace big { m_update_state = eGtaDataUpdateState::WAITING_FOR_SINGLE_PLAYER; g_fiber_pool->queue_job([this] { - while (*g_pointers->m_game_state != eGameState::Playing) + while (*g_pointers->m_gta.m_game_state != eGameState::Playing) { script::get_current()->yield(100ms); } @@ -70,7 +70,7 @@ namespace big session::join_type(eSessionType::SOLO); - while (!*g_pointers->m_is_session_started) + while (!*g_pointers->m_gta.m_is_session_started) { script::get_current()->yield(100ms); } diff --git a/src/services/gta_data/yim_fipackfile.cpp b/src/services/gta_data/yim_fipackfile.cpp index ae4fe9fb..303e1437 100644 --- a/src/services/gta_data/yim_fipackfile.cpp +++ b/src/services/gta_data/yim_fipackfile.cpp @@ -16,11 +16,11 @@ namespace big { std::vector non_dlc_mounted_devices_names; - uint16_t mounted_devices_len = *g_pointers->m_fidevices_len; + uint16_t mounted_devices_len = *g_pointers->m_gta.m_fidevices_len; if (mounted_devices_len) { - auto devices_arr = *(uint64_t*)g_pointers->m_fidevices; - uint8_t** current_device_mount_name_ptr = *(unsigned __int8***)g_pointers->m_fidevices; + auto devices_arr = *(uint64_t*)g_pointers->m_gta.m_fidevices; + uint8_t** current_device_mount_name_ptr = *(unsigned __int8***)g_pointers->m_gta.m_fidevices; auto device_i = 0; while (true) @@ -56,9 +56,9 @@ namespace big constexpr auto yield_increment = 80; auto i = 1; - while (g_pointers->m_fipackfile_instances[i]) + while (g_pointers->m_gta.m_fipackfile_instances[i]) { - auto* rpf = g_pointers->m_fipackfile_instances[i]; + auto* rpf = g_pointers->m_gta.m_fipackfile_instances[i]; // its hard coded in the binary? if (++i >= 3672) @@ -108,7 +108,7 @@ namespace big cb(rpf_wrapper); }); - g_pointers->m_fipackfile_unmount(default_mount_name); + g_pointers->m_gta.m_fipackfile_unmount(default_mount_name); } } else diff --git a/src/services/hotkey/hotkey_service.cpp b/src/services/hotkey/hotkey_service.cpp index af034090..1bf1b9ef 100644 --- a/src/services/hotkey/hotkey_service.cpp +++ b/src/services/hotkey/hotkey_service.cpp @@ -71,7 +71,7 @@ namespace big void hotkey_service::wndproc(eKeyState state, key_t key) { - if (const auto chat_data = *g_pointers->m_chat_data; chat_data && (chat_data->m_chat_open || chat_data->m_timer_two)) + if (const auto chat_data = *g_pointers->m_gta.m_chat_data; chat_data && (chat_data->m_chat_open || chat_data->m_timer_two)) return; //command executer is opened diff --git a/src/services/orbital_drone/orbital_drone.cpp b/src/services/orbital_drone/orbital_drone.cpp index 01fb35a0..dd640fb8 100644 --- a/src/services/orbital_drone/orbital_drone.cpp +++ b/src/services/orbital_drone/orbital_drone.cpp @@ -28,7 +28,7 @@ namespace big return; } - if (*g_pointers->m_is_session_started && gta_util::get_network_player_mgr()->m_local_net_player + if (*g_pointers->m_gta.m_is_session_started && gta_util::get_network_player_mgr()->m_local_net_player && gta_util::get_network_player_mgr()->m_local_net_player->m_player_info->m_ped) { scr_globals::globalplayer_bd.as()->Entries[self::id].OrbitalBitset.Set(eOrbitalBitset::kOrbitalCannonActive); @@ -332,7 +332,7 @@ namespace big if (ENTITY::IS_ENTITY_A_VEHICLE(ent)) { - const auto vehicle = reinterpret_cast(g_pointers->m_handle_to_ptr(ent)); + const auto vehicle = reinterpret_cast(g_pointers->m_gta.m_handle_to_ptr(ent)); if (vehicle) { for (const auto& player : g_player_service->players() | std::ranges::views::values) @@ -362,7 +362,7 @@ namespace big { for (auto ped : g_player_service->players() | std::ranges::views::values) { - if (ped && g_pointers->m_ptr_to_handle(ped->get_ped()) == ent) + if (ped && g_pointers->m_gta.m_ptr_to_handle(ped->get_ped()) == ent) { g_player_service->set_selected(ped); } @@ -379,7 +379,7 @@ namespace big Vector3 entpos = ENTITY::GET_ENTITY_COORDS(entity::get_entity_closest_to_middle_of_screen(), 0); if (g_player_service->get_selected()->is_valid() - &&ENTITY::DOES_ENTITY_EXIST(g_pointers->m_ptr_to_handle(g_player_service->get_selected()->get_ped()))) + &&ENTITY::DOES_ENTITY_EXIST(g_pointers->m_gta.m_ptr_to_handle(g_player_service->get_selected()->get_ped()))) { toxic::blame_explode_coord(g_player_service->get_selected(), m_ground_pos, eExplosionTag::EXP_TAG_ORBITAL_CANNON, 1.f, TRUE, TRUE, 1.f); diff --git a/src/services/pickups/pickup_service.cpp b/src/services/pickups/pickup_service.cpp index 75d33ca5..41b4acb1 100644 --- a/src/services/pickups/pickup_service.cpp +++ b/src/services/pickups/pickup_service.cpp @@ -43,7 +43,7 @@ namespace big { if (weapon.m_reward_ammo_hash != 0 || weapon.m_throwable) { - g_pointers->m_give_pickup_rewards(targets, weapon.m_reward_ammo_hash); + g_pointers->m_gta.m_give_pickup_rewards(targets, weapon.m_reward_ammo_hash); script::get_current()->yield(20ms); } } @@ -51,15 +51,15 @@ namespace big void pickup_service::give_armour(const int targets) const { - g_pointers->m_give_pickup_rewards(targets, RAGE_JOAAT("REWARD_ARMOUR")); + g_pointers->m_gta.m_give_pickup_rewards(targets, RAGE_JOAAT("REWARD_ARMOUR")); script::get_current()->yield(20ms); } void pickup_service::give_health(const int targets) const { - g_pointers->m_give_pickup_rewards(targets, RAGE_JOAAT("REWARD_HEALTH")); + g_pointers->m_gta.m_give_pickup_rewards(targets, RAGE_JOAAT("REWARD_HEALTH")); script::get_current()->yield(20ms); - g_pointers->m_give_pickup_rewards(targets, RAGE_JOAAT("REWARD_HEALTH")); + g_pointers->m_gta.m_give_pickup_rewards(targets, RAGE_JOAAT("REWARD_HEALTH")); script::get_current()->yield(20ms); } @@ -69,12 +69,12 @@ namespace big { if (weapon.m_reward_hash != 0) { - g_pointers->m_give_pickup_rewards(targets, weapon.m_reward_hash); + g_pointers->m_gta.m_give_pickup_rewards(targets, weapon.m_reward_hash); script::get_current()->yield(20ms); } } - g_pointers->m_give_pickup_rewards(targets, RAGE_JOAAT("REWARD_PARACHUTE")); + g_pointers->m_gta.m_give_pickup_rewards(targets, RAGE_JOAAT("REWARD_PARACHUTE")); script::get_current()->yield(20ms); } } diff --git a/src/services/player_database/player_database_service.cpp b/src/services/player_database/player_database_service.cpp index e88bac1c..4ec06820 100644 --- a/src/services/player_database/player_database_service.cpp +++ b/src/services/player_database/player_database_service.cpp @@ -119,7 +119,7 @@ namespace big bool success = false; rage::rlTaskStatus state{}; - if (g_pointers->m_start_get_session_by_gamer_handle(0, &player_handle, 1, &result, 1, &success, &state)) + if (g_pointers->m_gta.m_start_get_session_by_gamer_handle(0, &player_handle, 1, &result, 1, &success, &state)) { while (state.status == 1) script::get_current()->yield(); diff --git a/src/services/players/player.cpp b/src/services/players/player.cpp index 56d0d888..bb41e4df 100644 --- a/src/services/players/player.cpp +++ b/src/services/players/player.cpp @@ -89,7 +89,7 @@ namespace big return get_net_data()->m_external_ip; if (auto session_player = get_session_player()) - if (auto peer = g_pointers->m_get_connection_peer(gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr, + if (auto peer = g_pointers->m_gta.m_get_connection_peer(gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr, (int)get_session_player()->m_player_data.m_peer_id_2)) return netAddress{((netConnectionPeer*)peer)->m_external_ip}; @@ -102,7 +102,7 @@ namespace big return get_net_data()->m_external_port; if (auto session_player = get_session_player()) - if (auto peer = g_pointers->m_get_connection_peer(gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr, + if (auto peer = g_pointers->m_gta.m_get_connection_peer(gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr, (int)get_session_player()->m_player_data.m_peer_id_2)) return ((netConnectionPeer*)peer)->m_external_port; diff --git a/src/services/vehicle/persist_car_service.cpp b/src/services/vehicle/persist_car_service.cpp index 2d211c67..e6f4ee06 100644 --- a/src/services/vehicle/persist_car_service.cpp +++ b/src/services/vehicle/persist_car_service.cpp @@ -320,7 +320,7 @@ namespace big const auto vehicle_rotation = ENTITY::GET_ENTITY_ROTATION(vehicle, 0); bool has_collision = ENTITY::GET_ENTITY_COLLISION_DISABLED(object); bool is_visible = ENTITY::IS_ENTITY_VISIBLE(object); - CObject* cobject = (CObject*)g_pointers->m_handle_to_ptr(vehicle); + CObject* cobject = (CObject*)g_pointers->m_gta.m_handle_to_ptr(vehicle); bool is_invincible = misc::has_bit_set(&(int&)cobject->m_damage_bits, 8); Vector3 rotation; @@ -335,7 +335,7 @@ namespace big nlohmann::json persist_car_service::get_model_attachments(Vehicle vehicle, bool is_towed_vehicle) { - const auto replay_interface = *g_pointers->m_replay_interface; + const auto replay_interface = *g_pointers->m_gta.m_replay_interface; std::vector attached_objects; @@ -346,7 +346,7 @@ namespace big if (!object_ptr) continue; - const auto object = g_pointers->m_ptr_to_handle(object_ptr); + const auto object = g_pointers->m_gta.m_ptr_to_handle(object_ptr); if (!object) break; @@ -365,7 +365,7 @@ namespace big nlohmann::json persist_car_service::get_vehicle_attachents(Vehicle vehicle) { - const auto replay_interface = *g_pointers->m_replay_interface; + const auto replay_interface = *g_pointers->m_gta.m_replay_interface; const auto vehicle_interface = replay_interface->m_vehicle_interface; @@ -380,7 +380,7 @@ namespace big if (!vehicle_ptr) continue; - const auto object = g_pointers->m_ptr_to_handle(vehicle_ptr); + const auto object = g_pointers->m_gta.m_ptr_to_handle(vehicle_ptr); if (!object) break; @@ -445,7 +445,7 @@ namespace big vehicle_json[pearlescent_color_key] = pearlescent_color; bool has_collision = ENTITY::GET_ENTITY_COLLISION_DISABLED(vehicle); bool is_visible = ENTITY::IS_ENTITY_VISIBLE(vehicle); - CVehicle* cvehicle = (CVehicle*)g_pointers->m_handle_to_ptr(vehicle); + CVehicle* cvehicle = (CVehicle*)g_pointers->m_gta.m_handle_to_ptr(vehicle); bool is_invincible = misc::has_bit_set(&(int&)cvehicle->m_damage_bits, 8); vehicle_json[has_collision_key] = !has_collision; vehicle_json[is_visible_key] = is_visible; diff --git a/src/services/vehicle/vehicle_control_service.cpp b/src/services/vehicle/vehicle_control_service.cpp index 942640d0..29310145 100644 --- a/src/services/vehicle/vehicle_control_service.cpp +++ b/src/services/vehicle/vehicle_control_service.cpp @@ -73,7 +73,7 @@ namespace big controlled_vehicle new_veh{}; new_veh.handle = veh; - new_veh.ptr = (CVehicle*)g_pointers->m_handle_to_ptr(veh); + new_veh.ptr = (CVehicle*)g_pointers->m_gta.m_handle_to_ptr(veh); strcpy(new_veh.model_name, HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION(VEHICLE::GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(ENTITY::GET_ENTITY_MODEL(veh)))); new_veh.doorCount = VEHICLE::GET_NUMBER_OF_VEHICLE_DOORS(veh); new_veh.lockstate = (eVehicleLockState)VEHICLE::GET_VEHICLE_DOOR_LOCK_STATUS(veh); @@ -377,7 +377,7 @@ namespace big { if (g_local_player->m_vehicle) { - if (m_controlled_vehicle.handle != g_pointers->m_ptr_to_handle(g_local_player->m_vehicle)) + if (m_controlled_vehicle.handle != g_pointers->m_gta.m_ptr_to_handle(g_local_player->m_vehicle)) m_controlled_vehicle = vehicle_control::update_vehicle(self::veh); } } diff --git a/src/util/compile_time_helpers.hpp b/src/util/compile_time_helpers.hpp new file mode 100644 index 00000000..5873c02c --- /dev/null +++ b/src/util/compile_time_helpers.hpp @@ -0,0 +1,16 @@ +#pragma once + +namespace big +{ + template + struct compile_time_helper + { + static_assert(hash == -1); + static constexpr bool print_hash = (hash == -1); + }; + + struct cstxpr_str + { + const char* str; + }; +} \ No newline at end of file diff --git a/src/util/entity.hpp b/src/util/entity.hpp index 04a54e29..2db301ac 100644 --- a/src/util/entity.hpp +++ b/src/util/entity.hpp @@ -72,9 +72,9 @@ namespace big::entity inline bool take_control_of(Entity ent, int timeout = 300) { - auto hnd = g_pointers->m_handle_to_ptr(ent); + auto hnd = g_pointers->m_gta.m_handle_to_ptr(ent); - if (!hnd || !hnd->m_net_object || !*g_pointers->m_is_session_started) + if (!hnd || !hnd->m_net_object || !*g_pointers->m_gta.m_is_session_started) return false; if (network_has_control_of_entity(hnd->m_net_object)) @@ -82,7 +82,7 @@ namespace big::entity for (int i = 0; i < timeout; i++) { - g_pointers->m_request_control(hnd->m_net_object); + g_pointers->m_gta.m_request_control(hnd->m_net_object); if (network_has_control_of_entity(hnd->m_net_object)) return true; @@ -98,7 +98,7 @@ namespace big::entity { std::vector target_entities; target_entities.clear(); - const auto replay_interface = *g_pointers->m_replay_interface; + const auto replay_interface = *g_pointers->m_gta.m_replay_interface; if (!replay_interface) return target_entities; @@ -114,7 +114,7 @@ namespace big::entity if (vehicle_ptr == gta_util::get_local_vehicle()) continue; - const auto veh = g_pointers->m_ptr_to_handle(vehicle_ptr); + const auto veh = g_pointers->m_gta.m_ptr_to_handle(vehicle_ptr); if (!veh) break; @@ -135,7 +135,7 @@ namespace big::entity if (ped_ptr == gta_util::get_local_ped()) continue; - const auto ped = g_pointers->m_ptr_to_handle(ped_ptr); + const auto ped = g_pointers->m_gta.m_ptr_to_handle(ped_ptr); if (!ped) break; @@ -197,7 +197,7 @@ namespace big::entity Entity closest_entity{}; float distance = 1; - auto replayInterface = *g_pointers->m_replay_interface; + auto replayInterface = *g_pointers->m_gta.m_replay_interface; auto vehicleInterface = replayInterface->m_vehicle_interface; auto pedInterface = replayInterface->m_ped_interface; @@ -205,7 +205,7 @@ namespace big::entity { if (veh.m_entity_ptr) { - Vehicle handle = g_pointers->m_ptr_to_handle(veh.m_entity_ptr); + Vehicle handle = g_pointers->m_gta.m_ptr_to_handle(veh.m_entity_ptr); Vector3 pos = ENTITY::GET_ENTITY_COORDS(handle, 1); rage::fvector2 screenpos; HUD::GET_HUD_SCREEN_POSITION_FROM_WORLD_POSITION(pos.x, pos.y, pos.z, &screenpos.x, &screenpos.y); @@ -222,7 +222,7 @@ namespace big::entity { if (ped.m_entity_ptr) { - Vehicle handle = g_pointers->m_ptr_to_handle(ped.m_entity_ptr); + Vehicle handle = g_pointers->m_gta.m_ptr_to_handle(ped.m_entity_ptr); Vector3 pos = ENTITY::GET_ENTITY_COORDS(handle, 1); rage::fvector2 screenpos; HUD::GET_HUD_SCREEN_POSITION_FROM_WORLD_POSITION(pos.x, pos.y, pos.z, &screenpos.x, &screenpos.y); diff --git a/src/util/globals.hpp b/src/util/globals.hpp index 5b3fae1f..86ed90ec 100644 --- a/src/util/globals.hpp +++ b/src/util/globals.hpp @@ -13,7 +13,7 @@ namespace big::globals self::id, *scr_globals::gpbd_fm_3.at(target, scr_globals::size::gpbd_fm_3).at(510).as()}; - g_pointers->m_trigger_script_event(1, args, arg_count, 1 << target); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << target); } inline void give_remote_otr(Player target) @@ -27,7 +27,7 @@ namespace big::globals false, *scr_globals::gpbd_fm_3.at(target, scr_globals::size::gpbd_fm_3).at(510).as()}; - g_pointers->m_trigger_script_event(1, args, arg_count, 1 << target); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << target); } inline Interior get_interior_from_player(Player player) diff --git a/src/util/math.hpp b/src/util/math.hpp index 08b27c4b..9824d335 100644 --- a/src/util/math.hpp +++ b/src/util/math.hpp @@ -27,7 +27,7 @@ namespace big::math inline float calculate_distance_from_game_cam(rage::fvector3 player_position) { const Vector3 plyr_coords = {player_position.x, player_position.y, player_position.z}; - const Vector3 cam_coords = g_pointers->m_get_gameplay_cam_coords(); + const Vector3 cam_coords = g_pointers->m_gta.m_get_gameplay_cam_coords(); return (float)distance_between_vectors(plyr_coords, cam_coords); } diff --git a/src/util/model_info.hpp b/src/util/model_info.hpp index 636d6296..576d7821 100644 --- a/src/util/model_info.hpp +++ b/src/util/model_info.hpp @@ -34,7 +34,7 @@ namespace big template static T get_model(const rage::joaat_t hash) { - const auto model_table = g_pointers->m_model_table; + const auto model_table = g_pointers->m_gta.m_model_table; for (auto i = model_table->m_lookup_table[hash % model_table->m_lookup_key]; i; i = i->m_next) { if (i->m_hash == hash) diff --git a/src/util/notify.hpp b/src/util/notify.hpp index b16fb117..086a0618 100644 --- a/src/util/notify.hpp +++ b/src/util/notify.hpp @@ -89,7 +89,7 @@ namespace big::notify GRAPHICS::DRAW_SCALEFORM_MOVIE_FULLSCREEN(scaleform, 255, 255, 255, 255, 0); //fix broken scaleforms, when chat alrdy opened - if (const auto chat_data = *g_pointers->m_chat_data; chat_data && (chat_data->m_chat_open || chat_data->m_timer_two)) + if (const auto chat_data = *g_pointers->m_gta.m_chat_data; chat_data && (chat_data->m_chat_open || chat_data->m_timer_two)) HUD::CLOSE_MP_TEXT_CHAT(); } } \ No newline at end of file diff --git a/src/util/ped.hpp b/src/util/ped.hpp index bdce5017..91023929 100644 --- a/src/util/ped.hpp +++ b/src/util/ped.hpp @@ -561,7 +561,7 @@ namespace big::ped { if (p.second->get_ped()) { - if (p.second->get_ped() == g_pointers->m_handle_to_ptr(ped)) + if (p.second->get_ped() == g_pointers->m_gta.m_handle_to_ptr(ped)) return p.second; } } diff --git a/src/util/police.hpp b/src/util/police.hpp new file mode 100644 index 00000000..e2c393d7 --- /dev/null +++ b/src/util/police.hpp @@ -0,0 +1,10 @@ +#pragma once + +namespace big +{ + struct police + { + inline static memory::byte_patch* m_max_wanted_level; + inline static memory::byte_patch* m_max_wanted_level_2; + }; +} \ No newline at end of file diff --git a/src/util/session.hpp b/src/util/session.hpp index a8d5fc4c..b8625a39 100644 --- a/src/util/session.hpp +++ b/src/util/session.hpp @@ -102,7 +102,7 @@ namespace big::session bool success = false; rage::rlTaskStatus state{}; - if (g_pointers->m_start_get_session_by_gamer_handle(0, &player_handle, 1, &result, 1, &success, &state)) + if (g_pointers->m_gta.m_start_get_session_by_gamer_handle(0, &player_handle, 1, &result, 1, &success, &state)) { while (state.status == 1) script::get_current()->yield(); @@ -157,6 +157,6 @@ namespace big::session 0// bParam3 }; - g_pointers->m_trigger_script_event(1, args, arg_count, 1 << target); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << target); } } diff --git a/src/util/system.hpp b/src/util/system.hpp index 708ceb64..38156efd 100644 --- a/src/util/system.hpp +++ b/src/util/system.hpp @@ -15,7 +15,7 @@ namespace big::system for (auto& map : g_crossmap) { - auto address = g_pointers->m_get_native_handler(g_pointers->m_native_registration_table, map.second); + auto address = g_pointers->m_gta.m_get_native_handler(g_pointers->m_gta.m_native_registration_table, map.second); file << std::hex << std::uppercase << "0x" << map.first << " : GTA5.exe + 0x" << (DWORD64)address - base_address << std::endl; } diff --git a/src/util/teleport.hpp b/src/util/teleport.hpp index 8447ca2d..bee63b90 100644 --- a/src/util/teleport.hpp +++ b/src/util/teleport.hpp @@ -38,21 +38,21 @@ namespace big::teleport g.m_tp_position = {coords.x, coords.y, coords.z}; g.m_tp_player_net_id = player->get_ped()->m_net_object->m_object_id; - g.m_tp_veh_net_id = g_pointers->m_handle_to_ptr(hnd)->m_net_object->m_object_id; + g.m_tp_veh_net_id = g_pointers->m_gta.m_handle_to_ptr(hnd)->m_net_object->m_object_id; if ((player->is_valid() && PED::IS_PED_IN_ANY_VEHICLE(PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(player->id()), false)) || PLAYER::IS_REMOTE_PLAYER_IN_NON_CLONED_VEHICLE(player->id())) - g_pointers->m_clear_ped_tasks_network(player->get_ped(), true); + g_pointers->m_gta.m_clear_ped_tasks_network(player->get_ped(), true); for (int i = 0; i < 15; i++) { script::get_current()->yield(50ms); - if (auto ptr = (rage::CDynamicEntity*)g_pointers->m_handle_to_ptr(hnd)) + if (auto ptr = (rage::CDynamicEntity*)g_pointers->m_gta.m_handle_to_ptr(hnd)) { if (auto netobj = ptr->m_net_object) { - g_pointers->m_migrate_object(player->get_net_game_player(), netobj, 3); + g_pointers->m_gta.m_migrate_object(player->get_net_game_player(), netobj, 3); } } } diff --git a/src/util/toxic.hpp b/src/util/toxic.hpp index 8c9d098c..1025ef7f 100644 --- a/src/util/toxic.hpp +++ b/src/util/toxic.hpp @@ -17,13 +17,21 @@ namespace big::toxic { + struct explosion_anti_cheat_bypass + { + inline static memory::byte_patch* m_can_blame_others; + inline static memory::byte_patch* m_can_use_blocked_explosions; + }; + inline void blame_explode_coord(player_ptr to_blame, Vector3 pos, eExplosionTag explosion_type, float damage, bool is_audible, bool is_invisible, float camera_shake) { - g_pointers->m_blame_explode->apply(); - g_pointers->m_explosion_patch->apply(); + explosion_anti_cheat_bypass::m_can_blame_others->apply(); + explosion_anti_cheat_bypass::m_can_use_blocked_explosions->apply(); + FIRE::ADD_OWNED_EXPLOSION(PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(to_blame->id()), pos.x, pos.y, pos.z, (int)explosion_type, damage, is_audible, is_invisible, camera_shake); - g_pointers->m_blame_explode->restore(); - g_pointers->m_explosion_patch->restore(); + + explosion_anti_cheat_bypass::m_can_use_blocked_explosions->restore(); + explosion_anti_cheat_bypass::m_can_blame_others->restore(); } inline void blame_explode_player(player_ptr to_blame, player_ptr target, eExplosionTag explosion_type, float damage, bool is_audible, bool is_invisible, float camera_shake) @@ -37,7 +45,7 @@ namespace big::toxic const size_t arg_count = 4; int64_t args[arg_count] = {(int64_t)eRemoteEvent::StartActivity, (int64_t)self::id, (int64_t)type, (int64_t) true}; - g_pointers->m_trigger_script_event(1, args, arg_count, 1 << target->id()); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << target->id()); } inline bool set_time(player_ptr target, uint32_t millis) @@ -59,21 +67,21 @@ namespace big::toxic rage::netTimeSyncMsg msg{}; msg.action = 1; msg.counter = target->num_time_syncs_sent; - msg.token = (*g_pointers->m_network_time)->m_time_token; + msg.token = (*g_pointers->m_gta.m_network_time)->m_time_token; msg.timestamp = target->player_time_value.value() + (uint32_t)(std::chrono::time_point_cast(std::chrono::system_clock::now()) - target->player_time_value_received_time.value()) .count(); msg.increment = millis; - auto peer = g_pointers->m_get_connection_peer(gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr, + auto peer = g_pointers->m_gta.m_get_connection_peer(gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr, (int)target->get_session_player()->m_player_data.m_peer_id_2); for (int j = 0; j < 100; j++) { - g_pointers->m_sync_network_time(gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr, + g_pointers->m_gta.m_sync_network_time(gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr, peer, - (*g_pointers->m_network_time)->m_connection_identifier, + (*g_pointers->m_gta.m_network_time)->m_connection_identifier, &msg, 0x1000000);// repeatedly spamming the event will eventually cause certain bounds checks to disable for some reason } @@ -111,7 +119,7 @@ namespace big::toxic largest_counter = plyr.second->num_time_syncs_sent; }); - (*g_pointers->m_network_time)->m_time_offset = millis - timeGetTime(); + (*g_pointers->m_gta.m_network_time)->m_time_offset = millis - timeGetTime(); rage::netTimeSyncMsg msg{}; g_player_service->iterate([&largest_counter, &msg, millis](const player_entry& plyr) { @@ -125,21 +133,21 @@ namespace big::toxic msg.action = 1; msg.counter = largest_counter; - msg.token = (*g_pointers->m_network_time)->m_time_token; + msg.token = (*g_pointers->m_gta.m_network_time)->m_time_token; msg.timestamp = plyr.second->player_time_value.value() + (uint32_t)(std::chrono::time_point_cast(std::chrono::system_clock::now()) - plyr.second->player_time_value_received_time.value()) .count(); msg.increment = millis; - auto peer = g_pointers->m_get_connection_peer(gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr, + auto peer = g_pointers->m_gta.m_get_connection_peer(gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr, (int)plyr.second->get_session_player()->m_player_data.m_peer_id_2); for (int j = 0; j < 25; j++) { - g_pointers->m_sync_network_time(gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr, + g_pointers->m_gta.m_sync_network_time(gta_util::get_network()->m_game_session_ptr->m_net_connection_mgr, peer, - (*g_pointers->m_network_time)->m_connection_identifier, + (*g_pointers->m_gta.m_network_time)->m_connection_identifier, &msg, 0x1000000); } @@ -150,7 +158,6 @@ namespace big::toxic inline void warp_time_forward_all(uint32_t millis) { - set_time_all((*g_pointers->m_network_time)->m_time + millis); + set_time_all((*g_pointers->m_gta.m_network_time)->m_time + millis); } - } \ No newline at end of file diff --git a/src/util/train.hpp b/src/util/train.hpp index fd1bc07d..6f6773fc 100644 --- a/src/util/train.hpp +++ b/src/util/train.hpp @@ -11,13 +11,13 @@ namespace big::train inline auto get_all_vehicles() { std::vector result; - rage::CReplayInterface* CReplayInterface_var = *g_pointers->m_replay_interface; + rage::CReplayInterface* CReplayInterface_var = *g_pointers->m_gta.m_replay_interface; for (int i = 0; i < 300; i++) { auto vehicle_ptr = CReplayInterface_var->m_vehicle_interface->get_vehicle(i); if (vehicle_ptr) { - Vehicle vehicle_handle = g_pointers->m_ptr_to_handle(vehicle_ptr); + Vehicle vehicle_handle = g_pointers->m_gta.m_ptr_to_handle(vehicle_ptr); result.push_back(vehicle_handle); } diff --git a/src/util/troll.hpp b/src/util/troll.hpp index ac4ab8b1..f0b86ab4 100644 --- a/src/util/troll.hpp +++ b/src/util/troll.hpp @@ -32,7 +32,7 @@ namespace big::troll *script_global(1923597).at(9).as(), *script_global(1923597).at(10).as()}; - g_pointers->m_trigger_script_event(1, args, arg_count, 1 << target->id()); + g_pointers->m_gta.m_trigger_script_event(1, args, arg_count, 1 << target->id()); } } diff --git a/src/util/vehicle.hpp b/src/util/vehicle.hpp index d4a2df89..f4cf1241 100644 --- a/src/util/vehicle.hpp +++ b/src/util/vehicle.hpp @@ -13,6 +13,11 @@ namespace big::vehicle { + struct disable_collisions + { + inline static memory::byte_patch* m_patch; + }; + inline float mps_to_speed(float mps, SpeedUnit speed_unit) { switch (speed_unit) @@ -100,7 +105,7 @@ namespace big::vehicle inline Vehicle get_closest_to_location(Vector3 location, float range) { - if (const auto replay = *g_pointers->m_replay_interface; replay) + if (const auto replay = *g_pointers->m_gta.m_replay_interface; replay) { if (const auto veh_interface = replay->m_vehicle_interface; veh_interface) { @@ -122,7 +127,7 @@ namespace big::vehicle if (dist < min_dist) { - int32_t tmp_handle = g_pointers->m_ptr_to_handle(veh_ptr); + int32_t tmp_handle = g_pointers->m_gta.m_ptr_to_handle(veh_ptr); if (entity::take_control_of(tmp_handle)) { @@ -185,7 +190,7 @@ namespace big::vehicle STREAMING::SET_MODEL_AS_NO_LONGER_NEEDED(hash); - if (*g_pointers->m_is_session_started) + if (*g_pointers->m_gta.m_is_session_started) { set_mp_bitset(veh); } diff --git a/src/util/world_model.hpp b/src/util/world_model.hpp index 5c34f9e4..643ed7f3 100644 --- a/src/util/world_model.hpp +++ b/src/util/world_model.hpp @@ -10,7 +10,7 @@ namespace big::world_model static inline std::array backup; static inline void setup_backup() { - memcpy(backup.data(), g_pointers->m_world_model_spawn_bypass, patch_size); + memcpy(backup.data(), g_pointers->m_gta.m_world_model_spawn_bypass, patch_size); } inline Object spawn(Hash hash, Vector3 location = Vector3(), bool is_networked = true) @@ -27,11 +27,11 @@ namespace big::world_model } std::call_once(once_flag, setup_backup); - memset(g_pointers->m_world_model_spawn_bypass, 0x90, patch_size); + memset(g_pointers->m_gta.m_world_model_spawn_bypass, 0x90, patch_size); const auto object = OBJECT::CREATE_OBJECT(hash, location.x, location.y, location.z, is_networked, false, false); - memcpy(g_pointers->m_world_model_spawn_bypass, backup.data(), patch_size); + memcpy(g_pointers->m_gta.m_world_model_spawn_bypass, backup.data(), patch_size); STREAMING::SET_MODEL_AS_NO_LONGER_NEEDED(hash); diff --git a/src/views/core/view_active_view.cpp b/src/views/core/view_active_view.cpp index a3e65996..c806eea7 100644 --- a/src/views/core/view_active_view.cpp +++ b/src/views/core/view_active_view.cpp @@ -16,7 +16,7 @@ namespace big ImGui::SetNextWindowPos({(300.f + 20.f) * g.window.gui_scale, 100.f * g.window.gui_scale}, ImGuiCond_Always); ImGui::SetNextWindowSize({0.f, 0.f}); ImGui::SetNextWindowSizeConstraints({300.f, 100.f}, - {(float)*g_pointers->m_resolution_x - 270.f, (float)*g_pointers->m_resolution_y - 110.f}); + {(float)*g_pointers->m_gta.m_resolution_x - 270.f, (float)*g_pointers->m_gta.m_resolution_y - 110.f}); if (ImGui::Begin("main", nullptr, window_flags)) { const char* key = nullptr; diff --git a/src/views/core/view_cmd_executor.cpp b/src/views/core/view_cmd_executor.cpp index ee5ab144..b59500bc 100644 --- a/src/views/core/view_cmd_executor.cpp +++ b/src/views/core/view_cmd_executor.cpp @@ -11,8 +11,8 @@ namespace big if (!g.cmd_executor.enabled) return; - float screen_x = (float)*g_pointers->m_resolution_x; - float screen_y = (float)*g_pointers->m_resolution_y; + float screen_x = (float)*g_pointers->m_gta.m_resolution_x; + float screen_y = (float)*g_pointers->m_gta.m_resolution_y; ImGui::SetNextWindowPos(ImVec2(screen_x * 0.25f, screen_y * 0.2f), ImGuiCond_Always); ImGui::SetNextWindowBgAlpha(0.65f); diff --git a/src/views/core/view_notifications.cpp b/src/views/core/view_notifications.cpp index 5133f23b..f0089c5a 100644 --- a/src/views/core/view_notifications.cpp +++ b/src/views/core/view_notifications.cpp @@ -40,20 +40,20 @@ namespace big } } - dl->AddRectFilled({(float)*g_pointers->m_resolution_x - 360.f, 10.f + start_pos}, - {(float)*g_pointers->m_resolution_x - 10.f, start_pos + 45.f + total_size}, + dl->AddRectFilled({(float)*g_pointers->m_gta.m_resolution_x - 360.f, 10.f + start_pos}, + {(float)*g_pointers->m_gta.m_resolution_x - 10.f, start_pos + 45.f + total_size}, g.window.color); - dl->AddRectFilledMultiColor({(float)*g_pointers->m_resolution_x - 360.f, 10.f + start_pos}, {(float)*g_pointers->m_resolution_x - 255.f, start_pos + 45.f + total_size}, fadeBegin, fadeEnd, fadeEnd, fadeBegin); + dl->AddRectFilledMultiColor({(float)*g_pointers->m_gta.m_resolution_x - 360.f, 10.f + start_pos}, {(float)*g_pointers->m_gta.m_resolution_x - 255.f, start_pos + 45.f + total_size}, fadeBegin, fadeEnd, fadeEnd, fadeBegin); dl->AddText(g.window.font_sub_title, 22.f, - {(float)*g_pointers->m_resolution_x - 350.f, 15.f + start_pos}, + {(float)*g_pointers->m_gta.m_resolution_x - 350.f, 15.f + start_pos}, textCol, title.c_str()); int i = 0; for (std::string txt : split_points) { - dl->AddText({(float)*g_pointers->m_resolution_x - 350.f, 40.f + (i * 20.f) + start_pos}, textCol, txt.c_str()); + dl->AddText({(float)*g_pointers->m_gta.m_resolution_x - 350.f, 40.f + (i * 20.f) + start_pos}, textCol, txt.c_str()); i++; } diff --git a/src/views/core/view_overlay.cpp b/src/views/core/view_overlay.cpp index c7d5b8f8..d7a49786 100644 --- a/src/views/core/view_overlay.cpp +++ b/src/views/core/view_overlay.cpp @@ -26,10 +26,7 @@ namespace big ImGui::Text(std::format("Players: {}/{}", network_player_mgr->m_player_count, network_player_mgr->m_player_limit) .c_str()); - //if (g.window.ingame_overlay.show_time) - // ImGui::Text(std::format("Time: {:%d-%m-%Y %H:%M:%OS}", std::chrono::current_zone()->to_local(std::chrono::system_clock::now())).c_str()); - - if (auto replay_interface = *g_pointers->m_replay_interface; g.window.ingame_overlay.show_replay_interface) + if (auto replay_interface = *g_pointers->m_gta.m_replay_interface; g.window.ingame_overlay.show_replay_interface) { ImGui::Separator(); diff --git a/src/views/debug/view_debug_misc.cpp b/src/views/debug/view_debug_misc.cpp index a9c3f8e9..7d26a2dd 100644 --- a/src/views/debug/view_debug_misc.cpp +++ b/src/views/debug/view_debug_misc.cpp @@ -93,7 +93,7 @@ namespace big ImGui::InputScalar("Local CAutomobile", ImGuiDataType_U64, &local_vehicle, NULL, NULL, "%p", ImGuiInputTextFlags_CharsHexadecimal); } - if (auto mgr = *g_pointers->m_network_player_mgr) + if (auto mgr = *g_pointers->m_gta.m_network_player_mgr) { uint64_t local_netplayer = (uint64_t)mgr->m_local_net_player; ImGui::InputScalar("Local CNetGamePlayer", ImGuiDataType_U64, &local_netplayer, NULL, NULL, "%p", ImGuiInputTextFlags_CharsHexadecimal); @@ -105,13 +105,13 @@ namespace big } } - if (auto network = *g_pointers->m_network) + if (auto network = *g_pointers->m_gta.m_network) { uint64_t nw = (uint64_t)network; ImGui::InputScalar("Network", ImGuiDataType_U64, &nw, NULL, NULL, "%p", ImGuiInputTextFlags_CharsHexadecimal); } - if (auto omgr = *g_pointers->m_network_object_mgr) + if (auto omgr = *g_pointers->m_gta.m_network_object_mgr) { uint64_t nw = (uint64_t)omgr; ImGui::InputScalar("Network Object Mgr", ImGuiDataType_U64, &nw, NULL, NULL, "%p", ImGuiInputTextFlags_CharsHexadecimal); diff --git a/src/views/debug/view_debug_script_events.cpp b/src/views/debug/view_debug_script_events.cpp index fd6d7997..1b1b0de6 100644 --- a/src/views/debug/view_debug_script_events.cpp +++ b/src/views/debug/view_debug_script_events.cpp @@ -56,7 +56,7 @@ namespace big components::button("DEBUG_SCRIPT_EVENT_SEND_EVENT"_T, [] { args[1] = self::id;// prevent detection from AC - g_pointers->m_trigger_script_event(1, args, event_arg_count, event_everyone ? -1 : 1 << event_player_bits); + g_pointers->m_gta.m_trigger_script_event(1, args, event_arg_count, event_everyone ? -1 : 1 << event_player_bits); }); ImGui::EndTabItem(); diff --git a/src/views/debug/view_debug_threads.cpp b/src/views/debug/view_debug_threads.cpp index 18d9250e..b68ff26c 100644 --- a/src/views/debug/view_debug_threads.cpp +++ b/src/views/debug/view_debug_threads.cpp @@ -36,7 +36,7 @@ namespace big { if (ImGui::BeginTabItem("Threads")) { - if (!g_pointers->m_script_threads) + if (!g_pointers->m_gta.m_script_threads) { selected_thread = nullptr; ImGui::EndTabItem(); @@ -47,7 +47,7 @@ namespace big if (ImGui::BeginCombo("Thread", selected_thread ? selected_thread->m_name : "NONE")) { - for (auto script : *g_pointers->m_script_threads) + for (auto script : *g_pointers->m_gta.m_script_threads) { if (script) { @@ -161,7 +161,7 @@ namespace big update_free_stacks_count(); }); - if (*g_pointers->m_game_state != eGameState::Invalid && std::chrono::high_resolution_clock::now() - last_stack_update_time > 100ms) + if (*g_pointers->m_gta.m_game_state != eGameState::Invalid && std::chrono::high_resolution_clock::now() - last_stack_update_time > 100ms) { last_stack_update_time = std::chrono::high_resolution_clock::now(); g_fiber_pool->queue_job([] { diff --git a/src/views/esp/view_esp.cpp b/src/views/esp/view_esp.cpp index cf968505..1a6fd0eb 100644 --- a/src/views/esp/view_esp.cpp +++ b/src/views/esp/view_esp.cpp @@ -37,10 +37,10 @@ namespace big uint32_t ped_damage_bits = plyr->get_ped()->m_damage_bits; - if (g_pointers->m_get_screen_coords_for_world_coords(player_pos.data, &screen_x, &screen_y)) + if (g_pointers->m_gta.m_get_screen_coords_for_world_coords(player_pos.data, &screen_x, &screen_y)) { - const auto esp_x = (float)*g_pointers->m_resolution_x * screen_x; - const auto esp_y = (float)*g_pointers->m_resolution_y * screen_y; + const auto esp_x = (float)*g_pointers->m_gta.m_resolution_x * screen_x; + const auto esp_y = (float)*g_pointers->m_gta.m_resolution_y * screen_y; std::string name_str; ImVec2 name_pos = {esp_x - (62.5f * multplr), esp_y - (175.f * multplr) - 20.f}; @@ -62,8 +62,8 @@ namespace big const auto health_perc = plyr->get_ped()->m_health / (plyr->get_ped()->m_maxhealth + 0.001f); if (distance < g.esp.tracer_render_distance[1] && distance > g.esp.tracer_render_distance[0] && g.esp.tracer) - draw_list->AddLine({(float)*g_pointers->m_resolution_x * g.esp.tracer_draw_position[0], - (float)*g_pointers->m_resolution_y * g.esp.tracer_draw_position[1]}, + draw_list->AddLine({(float)*g_pointers->m_gta.m_resolution_x * g.esp.tracer_draw_position[0], + (float)*g_pointers->m_gta.m_resolution_y * g.esp.tracer_draw_position[1]}, {esp_x, esp_y}, esp_color); diff --git a/src/views/network/view_player_database.cpp b/src/views/network/view_player_database.cpp index e20db77b..4261b797 100644 --- a/src/views/network/view_player_database.cpp +++ b/src/views/network/view_player_database.cpp @@ -21,7 +21,7 @@ namespace big ImGui::SetNextItemWidth(300.f); components::input_text_with_hint("PLAYER"_T, "SEARCH"_T, search, sizeof(search), ImGuiInputTextFlags_None); - if (ImGui::ListBoxHeader("###players", {180, static_cast(*g_pointers->m_resolution_y - 400 - 38 * 4)})) + if (ImGui::ListBoxHeader("###players", {180, static_cast(*g_pointers->m_gta.m_resolution_y - 400 - 38 * 4)})) { auto& item_arr = g_player_database_service->get_players(); if (item_arr.size() > 0) @@ -78,7 +78,7 @@ namespace big if (auto selected = g_player_database_service->get_selected()) { ImGui::SameLine(); - if (ImGui::BeginChild("###selected_player", {500, static_cast(*g_pointers->m_resolution_y - 388 - 38 * 4)}, false, ImGuiWindowFlags_NoBackground)) + if (ImGui::BeginChild("###selected_player", {500, static_cast(*g_pointers->m_gta.m_resolution_y - 388 - 38 * 4)}, false, ImGuiWindowFlags_NoBackground)) { if (ImGui::InputText("NAME"_T.data(), name_buf, sizeof(name_buf))) { diff --git a/src/views/network/view_session.cpp b/src/views/network/view_session.cpp index 0cfdc449..28a7f307 100644 --- a/src/views/network/view_session.cpp +++ b/src/views/network/view_session.cpp @@ -35,13 +35,13 @@ namespace big components::input_text("SESSION_INFO"_T, base64, sizeof(base64)); components::button("JOIN_SESSION_INFO"_T, [] { rage::rlSessionInfo info; - g_pointers->m_decode_session_info(&info, base64, nullptr); + g_pointers->m_gta.m_decode_session_info(&info, base64, nullptr); session::join_session(info); }); ImGui::SameLine(); components::button("COPY_SESSION_INFO"_T, [] { char buf[0x100]{}; - g_pointers->m_encode_session_info(>a_util::get_network()->m_game_session.m_rline_session.m_session_info, buf, 0xA9, nullptr); + g_pointers->m_gta.m_encode_session_info(>a_util::get_network()->m_game_session.m_rline_session.m_session_info, buf, 0xA9, nullptr); ImGui::SetClipboardText(buf); }); @@ -62,8 +62,8 @@ namespace big { for (const auto& region_type : regions) { - components::selectable(region_type.name, *g_pointers->m_region_code == region_type.id, [®ion_type] { - *g_pointers->m_region_code = region_type.id; + components::selectable(region_type.name, *g_pointers->m_gta.m_region_code == region_type.id, [®ion_type] { + *g_pointers->m_gta.m_region_code = region_type.id; }); } ImGui::EndListBox(); @@ -94,7 +94,7 @@ namespace big components::button("SEND"_T, [] { if (const auto net_game_player = gta_util::get_network_player_mgr()->m_local_net_player; net_game_player) { - if (g_hooking->get_original()(*g_pointers->m_send_chat_ptr, + if (g_hooking->get_original()(*g_pointers->m_gta.m_send_chat_ptr, net_game_player->get_net_data(), msg, g.session.is_team)) diff --git a/src/views/network/view_session_browser.cpp b/src/views/network/view_session_browser.cpp index e07a8e7f..4d2fb3e3 100644 --- a/src/views/network/view_session_browser.cpp +++ b/src/views/network/view_session_browser.cpp @@ -23,7 +23,7 @@ namespace big ImGui::SetNextItemWidth(300.f); - if (ImGui::ListBoxHeader("###sessions", {300, static_cast(*g_pointers->m_resolution_y - 400 - 38 * 4)})) + if (ImGui::ListBoxHeader("###sessions", {300, static_cast(*g_pointers->m_gta.m_resolution_y - 400 - 38 * 4)})) { if (g_matchmaking_service->get_num_found_sessions()) { @@ -37,7 +37,7 @@ namespace big if (components::selectable(std::to_string(session.info.m_session_token), i == selected_session_idx)) { selected_session_idx = i; - g_pointers->m_encode_session_info(&session.info, session_info, 0x7D, nullptr); + g_pointers->m_gta.m_encode_session_info(&session.info, session_info, 0x7D, nullptr); } if (ImGui::IsItemHovered()) @@ -62,7 +62,7 @@ namespace big if (selected_session_idx != -1) { ImGui::SameLine(); - if (ImGui::BeginChild("###selected_session", {300, static_cast(*g_pointers->m_resolution_y - 388 - 38 * 4)}, false, ImGuiWindowFlags_NoBackground)) + if (ImGui::BeginChild("###selected_session", {300, static_cast(*g_pointers->m_gta.m_resolution_y - 388 - 38 * 4)}, false, ImGuiWindowFlags_NoBackground)) { auto& session = g_matchmaking_service->get_found_sessions()[selected_session_idx]; diff --git a/src/views/network/view_spoofing.cpp b/src/views/network/view_spoofing.cpp index a5b2a16c..de8c7465 100644 --- a/src/views/network/view_spoofing.cpp +++ b/src/views/network/view_spoofing.cpp @@ -36,7 +36,7 @@ namespace big ImGui::SameLine(); if (ImGui::InputInt("###rank", &g.spoofing.rank)) { - *g_pointers->m_force_player_card_refresh = true; + *g_pointers->m_gta.m_force_player_card_refresh = true; } } @@ -46,7 +46,7 @@ namespace big ImGui::SameLine(); if (ImGui::InputFloat("###kd_ratio", &g.spoofing.kd_ratio)) { - *g_pointers->m_force_player_card_refresh = true; + *g_pointers->m_gta.m_force_player_card_refresh = true; } } @@ -56,7 +56,7 @@ namespace big ImGui::SameLine(); if (ImGui::Combo("###badsport_select", &g.spoofing.badsport_type, "Clean Player\0Dirty Player\0Bad Sport")) { - *g_pointers->m_force_player_card_refresh = true; + *g_pointers->m_gta.m_force_player_card_refresh = true; } } diff --git a/src/views/players/view_players.cpp b/src/views/players/view_players.cpp index 9663660e..227948e8 100644 --- a/src/views/players/view_players.cpp +++ b/src/views/players/view_players.cpp @@ -71,7 +71,7 @@ namespace big { const auto player_count = g_player_service->players().size() + 1; - if (!*g_pointers->m_is_session_started && player_count < 2) + if (!*g_pointers->m_gta.m_is_session_started && player_count < 2) return; float window_pos = 110.f + g_gui_service->nav_ctr * ImGui::CalcTextSize("W").y + g_gui_service->nav_ctr * ImGui::GetStyle().ItemSpacing.y @@ -84,7 +84,7 @@ namespace big if (ImGui::Begin("playerlist", nullptr, window_flags)) { float window_height = (ImGui::CalcTextSize("A").y + ImGui::GetStyle().ItemInnerSpacing.y * 2 + 6.0f) * player_count + 10.0f; - window_height = window_height + window_pos > (float)*g_pointers->m_resolution_y - 10.f ? (float)*g_pointers->m_resolution_y - (window_pos + 40.f) : window_height; + window_height = window_height + window_pos > (float)*g_pointers->m_gta.m_resolution_y - 10.f ? (float)*g_pointers->m_gta.m_resolution_y - (window_pos + 40.f) : window_height; ImGui::PushStyleColor(ImGuiCol_FrameBg, {0.f, 0.f, 0.f, 0.f}); ImGui::PushStyleColor(ImGuiCol_ScrollbarBg, {0.f, 0.f, 0.f, 0.f}); diff --git a/src/views/self/view_mobile.cpp b/src/views/self/view_mobile.cpp index 978a817f..2a9dfddb 100644 --- a/src/views/self/view_mobile.cpp +++ b/src/views/self/view_mobile.cpp @@ -7,7 +7,7 @@ namespace big { void view::mobile() { - ImGui::SetWindowSize({0.f, (float)*g_pointers->m_resolution_y}, ImGuiCond_Always); + ImGui::SetWindowSize({0.f, (float)*g_pointers->m_gta.m_resolution_y}, ImGuiCond_Always); components::sub_title("MERRYWEATHER"_T); ImGui::Separator(); diff --git a/src/views/self/view_outfit_slots.cpp b/src/views/self/view_outfit_slots.cpp index de3ac4c1..2b559935 100644 --- a/src/views/self/view_outfit_slots.cpp +++ b/src/views/self/view_outfit_slots.cpp @@ -7,7 +7,7 @@ namespace big { void view::outfit_slots() { - if (*g_pointers->m_script_globals) + if (*g_pointers->m_gta.m_script_globals) { static int slot = 0; ImGui::SetNextItemWidth(160); diff --git a/src/views/settings/view_gta_cache.cpp b/src/views/settings/view_gta_cache.cpp index a7695527..f6fe07c0 100644 --- a/src/views/settings/view_gta_cache.cpp +++ b/src/views/settings/view_gta_cache.cpp @@ -20,7 +20,7 @@ namespace big { g_gta_data_service->set_state(eGtaDataUpdateState::NEEDS_UPDATE); - if (!*g_pointers->m_is_session_started) + if (!*g_pointers->m_gta.m_is_session_started) { g_gta_data_service->update_in_online(); } diff --git a/src/views/vehicle/view_pv.cpp b/src/views/vehicle/view_pv.cpp index 252b92bd..602ef76d 100644 --- a/src/views/vehicle/view_pv.cpp +++ b/src/views/vehicle/view_pv.cpp @@ -10,7 +10,7 @@ namespace big { void view::pv() { - ImGui::SetWindowSize({0.f, (float)*g_pointers->m_resolution_y}, ImGuiCond_Always); + ImGui::SetWindowSize({0.f, (float)*g_pointers->m_gta.m_resolution_y}, ImGuiCond_Always); if (ImGui::Checkbox("PREVIEW"_T.data(), &g.clone_pv.preview_vehicle)) { @@ -86,7 +86,7 @@ namespace big components::input_text_with_hint("MODEL_NAME"_T, "SEARCH"_T, search, sizeof(search), ImGuiInputTextFlags_None); g_mobile_service->refresh_personal_vehicles(); - if (ImGui::ListBoxHeader("###personal_veh_list", {300, static_cast(*g_pointers->m_resolution_y - 188 - 38 * num_of_rows)})) + if (ImGui::ListBoxHeader("###personal_veh_list", {300, static_cast(*g_pointers->m_gta.m_resolution_y - 188 - 38 * num_of_rows)})) { if (g_mobile_service->personal_vehicles().empty()) { diff --git a/src/views/vehicle/view_spawn_vehicle.cpp b/src/views/vehicle/view_spawn_vehicle.cpp index 5b55af01..02fe1fa3 100644 --- a/src/views/vehicle/view_spawn_vehicle.cpp +++ b/src/views/vehicle/view_spawn_vehicle.cpp @@ -9,7 +9,7 @@ namespace big { void view::spawn_vehicle() { - ImGui::SetWindowSize({0.f, (float)*g_pointers->m_resolution_y}, ImGuiCond_Always); + ImGui::SetWindowSize({0.f, (float)*g_pointers->m_gta.m_resolution_y}, ImGuiCond_Always); if (ImGui::Checkbox("PREVIEW"_T.data(), &g.spawn_vehicle.preview_vehicle)) { @@ -66,7 +66,7 @@ namespace big components::input_text_with_hint("MODEL_NAME"_T, "SEARCH"_T, search, sizeof(search), ImGuiInputTextFlags_None); - if (ImGui::ListBoxHeader("###vehicles", {300, static_cast(*g_pointers->m_resolution_y - 188 - 38 * 4)})) + if (ImGui::ListBoxHeader("###vehicles", {300, static_cast(*g_pointers->m_gta.m_resolution_y - 188 - 38 * 4)})) { if (self::veh) { diff --git a/src/views/view_context_menu.cpp b/src/views/view_context_menu.cpp index eaf642d7..ec2c751d 100644 --- a/src/views/view_context_menu.cpp +++ b/src/views/view_context_menu.cpp @@ -39,14 +39,14 @@ namespace big const auto context_target_distance = math::calculate_distance_from_game_cam(context_target_pos); const auto context_target_multplr = context_target_distance > g.esp.global_render_distance[1] ? -1.f : 6.17757f / context_target_distance; - if (g_pointers->m_get_screen_coords_for_world_coords(context_target_pos.data, &context_screen_x, &context_screen_y)) + if (g_pointers->m_gta.m_get_screen_coords_for_world_coords(context_target_pos.data, &context_screen_x, &context_screen_y)) { const auto cm = g_context_menu_service->get_context_menu(); if (cm == nullptr) return; - const auto cm_start_x = static_cast(*g_pointers->m_resolution_x) * context_screen_x + (67.5f * context_target_multplr); - const auto cm_start_y = static_cast(*g_pointers->m_resolution_y) * context_screen_y - (175.f * context_target_multplr); + const auto cm_start_x = static_cast(*g_pointers->m_gta.m_resolution_x) * context_screen_x + (67.5f * context_target_multplr); + const auto cm_start_y = static_cast(*g_pointers->m_gta.m_resolution_y) * context_screen_y - (175.f * context_target_multplr); const auto cm_col = ImGui::ColorConvertFloat4ToU32({0.549f, 0.639f, 0.710f, 0.3f}); diff --git a/src/views/view_gta_data.cpp b/src/views/view_gta_data.cpp index 49ca21af..333233fb 100644 --- a/src/views/view_gta_data.cpp +++ b/src/views/view_gta_data.cpp @@ -26,7 +26,7 @@ namespace big { ImGui::Text("GAME_CACHE_UPDATE"_T.data()); - if (*g_pointers->m_is_session_started) + if (*g_pointers->m_gta.m_is_session_started) { if (ImGui::Button("GAME_CACHE_UPDATE_CACHE"_T.data())) { @@ -47,7 +47,7 @@ namespace big g_gta_data_service->update_in_online(); } - if (*g_pointers->m_game_state == eGameState::Respawn) + if (*g_pointers->m_gta.m_game_state == eGameState::Respawn) { if (ImGui::Button("GAME_CACHE_ON_INIT"_T.data())) { diff --git a/src/views/world/view_model_swapper.cpp b/src/views/world/view_model_swapper.cpp index d625af68..9d9f0a85 100644 --- a/src/views/world/view_model_swapper.cpp +++ b/src/views/world/view_model_swapper.cpp @@ -12,7 +12,7 @@ namespace big static char dst_text[256]; static char src_text[256]; static size_t selected_index = -1; - static float width = *g_pointers->m_resolution_x / 5.0; + static float width = *g_pointers->m_gta.m_resolution_x / 5.0; ImGui::SetNextItemWidth(width); ImGui::InputText("Dst", dst_text, IM_ARRAYSIZE(dst_text)); diff --git a/src/views/world/view_spawn_ped.cpp b/src/views/world/view_spawn_ped.cpp index 71555023..032735bb 100644 --- a/src/views/world/view_spawn_ped.cpp +++ b/src/views/world/view_spawn_ped.cpp @@ -203,7 +203,7 @@ namespace big static Player selected_ped_for_player_id = -1; auto& player_arr = g_player_service->players(); - if (!*g_pointers->m_is_session_started) + if (!*g_pointers->m_gta.m_is_session_started) { selected_ped_player_id = -1; @@ -301,7 +301,7 @@ namespace big ImGui::SetItemDefaultFocus(); } - if (*g_pointers->m_is_session_started) + if (*g_pointers->m_gta.m_is_session_started) { for (auto& item : player_arr) { @@ -558,7 +558,7 @@ namespace big ImGui::SetItemDefaultFocus(); } - if (*g_pointers->m_is_session_started) + if (*g_pointers->m_gta.m_is_session_started) { for (auto& [_, plyr] : player_arr) {