From b18ac649051ed956a97e19e25c3120012ad09650 Mon Sep 17 00:00:00 2001 From: gir489 <100792176+gir489returns@users.noreply.github.com> Date: Sat, 10 Aug 2024 19:12:29 -0400 Subject: [PATCH] Prevent vehicle looped functions from running on vehicles we are not currently driving. (#3548) --- .../looped/vehicle/keep_vehicle_clean.cpp | 41 ++--- .../looped/vehicle/keep_vehicle_repaired.cpp | 151 +++++++++--------- 2 files changed, 100 insertions(+), 92 deletions(-) diff --git a/src/backend/looped/vehicle/keep_vehicle_clean.cpp b/src/backend/looped/vehicle/keep_vehicle_clean.cpp index 693a9121..283cdc7a 100644 --- a/src/backend/looped/vehicle/keep_vehicle_clean.cpp +++ b/src/backend/looped/vehicle/keep_vehicle_clean.cpp @@ -1,21 +1,22 @@ -#include "backend/looped_command.hpp" -#include "natives.hpp" - -namespace big -{ - class keep_vehicle_clean : looped_command - { - using looped_command::looped_command; - - virtual void on_tick() override - { - if (ENTITY::DOES_ENTITY_EXIST(self::veh)) - { - VEHICLE::SET_VEHICLE_DIRT_LEVEL(self::veh, 0.0f); - } - } - }; - - keep_vehicle_clean - g_keep_vehicle_clean("keepvehicleclean", "KEEP_VEHICLE_CLEAN_CMD", "KEEP_VEHICLE_CLEAN_CMD_DESC", g.vehicle.keep_vehicle_clean); +#include "backend/looped_command.hpp" +#include "natives.hpp" +#include "gta/vehicle_values.hpp" + +namespace big +{ + class keep_vehicle_clean : looped_command + { + using looped_command::looped_command; + + virtual void on_tick() override + { + if (self::veh != 0 && VEHICLE::GET_PED_IN_VEHICLE_SEAT(self::veh, SEAT_DRIVER, FALSE) == self::ped) + { + VEHICLE::SET_VEHICLE_DIRT_LEVEL(self::veh, 0.0f); + } + } + }; + + keep_vehicle_clean + g_keep_vehicle_clean("keepvehicleclean", "KEEP_VEHICLE_CLEAN_CMD", "KEEP_VEHICLE_CLEAN_CMD_DESC", g.vehicle.keep_vehicle_clean); } \ No newline at end of file diff --git a/src/backend/looped/vehicle/keep_vehicle_repaired.cpp b/src/backend/looped/vehicle/keep_vehicle_repaired.cpp index 26cf0ad0..90670ccf 100644 --- a/src/backend/looped/vehicle/keep_vehicle_repaired.cpp +++ b/src/backend/looped/vehicle/keep_vehicle_repaired.cpp @@ -1,72 +1,79 @@ -#include "backend/looped_command.hpp" -#include "natives.hpp" -#include "util/vehicle.hpp" - -namespace big -{ - class keep_vehicle_repaired : looped_command - { - using looped_command::looped_command; - - virtual void on_tick() override - { - const auto veh = self::veh; - if (!ENTITY::IS_ENTITY_A_VEHICLE(veh) || !entity::take_control_of(veh, 0)) - { - return; - } - - if (VEHICLE::GET_DOES_VEHICLE_HAVE_DAMAGE_DECALS(veh)) - { - if (!g.vehicle.keep_vehicle_clean) - { - VEHICLE::SET_VEHICLE_DIRT_LEVEL(veh, 0.f); - } - - // Rear window - constexpr int rear_window_index = 7; - if (!VEHICLE::IS_VEHICLE_WINDOW_INTACT(veh, rear_window_index)) - { - VEHICLE::FIX_VEHICLE_WINDOW(veh, rear_window_index); - } - - g_pointers->m_gta.m_decal_manager_remove(g_pointers->m_gta.m_decal_manager, g_pointers->m_gta.m_handle_to_ptr(veh), -1, 0, 0x00'01'E0'00); - - if (!g.vehicle.god_mode) - { - VEHICLE::SET_VEHICLE_DEFORMATION_FIXED(veh); - } - - vehicle::repair_engine_from_water(veh); - - const auto door_count = VEHICLE::GET_NUMBER_OF_VEHICLE_DOORS(veh); - for (int i = 0; i < door_count; i++) - { - if (VEHICLE::IS_VEHICLE_DOOR_DAMAGED(veh, i)) - { - VEHICLE::SET_VEHICLE_FIXED(veh); - return; - } - } - - for (int i = 0; i <= 14; i++) - { - if (VEHICLE::DOES_EXTRA_EXIST(veh, i) && VEHICLE::IS_VEHICLE_EXTRA_TURNED_ON(veh, i) && VEHICLE::IS_EXTRA_BROKEN_OFF(veh, i)) - { - VEHICLE::SET_VEHICLE_FIXED(veh); - return; - } - } - - if (VEHICLE::IS_VEHICLE_BUMPER_BOUNCING(veh, TRUE) || VEHICLE::IS_VEHICLE_BUMPER_BOUNCING(veh, FALSE) || VEHICLE::GET_VEHICLE_NUM_OF_BROKEN_LOOSEN_PARTS(veh) > 0) - { - VEHICLE::SET_VEHICLE_FIXED(veh); - return; - } - } - } - }; - - keep_vehicle_repaired - g_keep_vehicle_repaired("keepfixed", "KEEP_VEHICLE_FIXED", "KEEP_VEHICLE_FIXED_DESC", g.vehicle.keep_vehicle_repaired); -} +#include "backend/looped_command.hpp" +#include "natives.hpp" +#include "util/vehicle.hpp" +#include "gta/vehicle_values.hpp" + +namespace big +{ + class keep_vehicle_repaired : looped_command + { + using looped_command::looped_command; + + virtual void on_tick() override + { + Vehicle veh = self::veh; + + if (veh == 0 || VEHICLE::GET_PED_IN_VEHICLE_SEAT(self::veh, SEAT_DRIVER, FALSE) != self::ped) + { + return; + } + + if (!entity::take_control_of(veh, 0)) + { + return; + } + + if (VEHICLE::GET_DOES_VEHICLE_HAVE_DAMAGE_DECALS(veh)) + { + if (!g.vehicle.keep_vehicle_clean) + { + VEHICLE::SET_VEHICLE_DIRT_LEVEL(veh, 0.f); + } + + // Rear window + constexpr int rear_window_index = 7; + if (!VEHICLE::IS_VEHICLE_WINDOW_INTACT(veh, rear_window_index)) + { + VEHICLE::FIX_VEHICLE_WINDOW(veh, rear_window_index); + } + + g_pointers->m_gta.m_decal_manager_remove(g_pointers->m_gta.m_decal_manager, g_pointers->m_gta.m_handle_to_ptr(veh), -1, 0, 0x0001E000); + + if (!g.vehicle.god_mode) + { + VEHICLE::SET_VEHICLE_DEFORMATION_FIXED(veh); + } + + vehicle::repair_engine_from_water(veh); + + const auto door_count = VEHICLE::GET_NUMBER_OF_VEHICLE_DOORS(veh); + for (int i = 0; i < door_count; i++) + { + if (VEHICLE::IS_VEHICLE_DOOR_DAMAGED(veh, i)) + { + VEHICLE::SET_VEHICLE_FIXED(veh); + return; + } + } + + for (int i = 0; i <= 14; i++) + { + if (VEHICLE::DOES_EXTRA_EXIST(veh, i) && VEHICLE::IS_VEHICLE_EXTRA_TURNED_ON(veh, i) && VEHICLE::IS_EXTRA_BROKEN_OFF(veh, i)) + { + VEHICLE::SET_VEHICLE_FIXED(veh); + return; + } + } + + if (VEHICLE::IS_VEHICLE_BUMPER_BOUNCING(veh, TRUE) || VEHICLE::IS_VEHICLE_BUMPER_BOUNCING(veh, FALSE) || VEHICLE::GET_VEHICLE_NUM_OF_BROKEN_LOOSEN_PARTS(veh) > 0) + { + VEHICLE::SET_VEHICLE_FIXED(veh); + return; + } + } + } + }; + + keep_vehicle_repaired + g_keep_vehicle_repaired("keepfixed", "KEEP_VEHICLE_FIXED", "KEEP_VEHICLE_FIXED_DESC", g.vehicle.keep_vehicle_repaired); +}