diff --git a/src/backend/looped/vehicle/keep_vehicle_repaired.cpp b/src/backend/looped/vehicle/keep_vehicle_repaired.cpp index f6311a9f..26cf0ad0 100644 --- a/src/backend/looped/vehicle/keep_vehicle_repaired.cpp +++ b/src/backend/looped/vehicle/keep_vehicle_repaired.cpp @@ -10,18 +10,42 @@ namespace big virtual void on_tick() override { - auto veh = self::veh; + 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)) { - for (int i = 0; i < 6; i++) + 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; } } @@ -30,32 +54,19 @@ namespace big 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); - } - - if (!VEHICLE::IS_VEHICLE_WINDOW_INTACT(veh, 7)) //Rear window - VEHICLE::FIX_VEHICLE_WINDOW(veh, 7); - - 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); - } - - if (!g.vehicle.keep_vehicle_clean) - { - VEHICLE::SET_VEHICLE_DIRT_LEVEL(veh, 0.f); + return; } } } }; - keep_vehicle_repaired g_keep_vehicle_repaired("keepfixed", "KEEP_VEHICLE_FIXED", "KEEP_VEHICLE_FIXED_DESC", - g.vehicle.keep_vehicle_repaired); + keep_vehicle_repaired + g_keep_vehicle_repaired("keepfixed", "KEEP_VEHICLE_FIXED", "KEEP_VEHICLE_FIXED_DESC", g.vehicle.keep_vehicle_repaired); } diff --git a/src/util/vehicle.cpp b/src/util/vehicle.cpp index 2013f973..3e7760ae 100644 --- a/src/util/vehicle.cpp +++ b/src/util/vehicle.cpp @@ -137,6 +137,13 @@ namespace big::vehicle return true; } + void repair_engine_from_water(Vehicle veh) + { + auto cvehicle = (uint8_t*)g_pointers->m_gta.m_handle_to_ptr(veh); + // fix vehicle being completly fucked after going into water. + cvehicle[0xD8] &= ~(1 << 0); + } + bool repair(Vehicle veh) { if (!ENTITY::IS_ENTITY_A_VEHICLE(veh) || !entity::take_control_of(veh, 0)) @@ -144,6 +151,8 @@ namespace big::vehicle return false; } + repair_engine_from_water(veh); + VEHICLE::SET_VEHICLE_FIXED(veh); VEHICLE::SET_VEHICLE_DIRT_LEVEL(veh, 0.f); diff --git a/src/util/vehicle.hpp b/src/util/vehicle.hpp index 3595ba91..4fa93140 100644 --- a/src/util/vehicle.hpp +++ b/src/util/vehicle.hpp @@ -25,6 +25,7 @@ namespace big::vehicle void bring(Vehicle veh, Vector3 location, bool put_in = true, int seatIdx = -1); Vehicle get_closest_to_location(Vector3 location, float range); bool set_plate(Vehicle veh, const char* plate); + void repair_engine_from_water(Vehicle veh); bool repair(Vehicle veh); Vehicle spawn(Hash hash, Vector3 location, float heading, bool is_networked = true, bool script_veh = false); Vehicle clone_from_vehicle_data(std::map& data, Vector3 location, float heading); @@ -37,7 +38,7 @@ namespace big::vehicle void set_engine_state(Vehicle current_vehicle, bool state, bool immediately, bool disable_auto_start); void downgrade(Vehicle vehicle); bool remote_control_vehicle(Vehicle veh); - + /* Set doorId to eDoorId::VEH_EXT_DOOR_INVALID_ID or simply -1 to apply to all vehicle doors. */