fix(vehicle): fix repair not working after going in water (#2996)

This commit is contained in:
Quentin 2024-05-01 23:25:30 +02:00 committed by GitHub
parent 3470660b8d
commit 435963d3b6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 41 additions and 20 deletions

View File

@ -10,18 +10,42 @@ namespace big
virtual void on_tick() override 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)) if (!ENTITY::IS_ENTITY_A_VEHICLE(veh) || !entity::take_control_of(veh, 0))
{ {
return; return;
} }
if (VEHICLE::GET_DOES_VEHICLE_HAVE_DAMAGE_DECALS(veh)) 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)) if (VEHICLE::IS_VEHICLE_DOOR_DAMAGED(veh, i))
{ {
VEHICLE::SET_VEHICLE_FIXED(veh); 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)) 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); 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) 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); VEHICLE::SET_VEHICLE_FIXED(veh);
} return;
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);
} }
} }
} }
}; };
keep_vehicle_repaired g_keep_vehicle_repaired("keepfixed", "KEEP_VEHICLE_FIXED", "KEEP_VEHICLE_FIXED_DESC", keep_vehicle_repaired
g.vehicle.keep_vehicle_repaired); g_keep_vehicle_repaired("keepfixed", "KEEP_VEHICLE_FIXED", "KEEP_VEHICLE_FIXED_DESC", g.vehicle.keep_vehicle_repaired);
} }

View File

@ -137,6 +137,13 @@ namespace big::vehicle
return true; 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) bool repair(Vehicle veh)
{ {
if (!ENTITY::IS_ENTITY_A_VEHICLE(veh) || !entity::take_control_of(veh, 0)) if (!ENTITY::IS_ENTITY_A_VEHICLE(veh) || !entity::take_control_of(veh, 0))
@ -144,6 +151,8 @@ namespace big::vehicle
return false; return false;
} }
repair_engine_from_water(veh);
VEHICLE::SET_VEHICLE_FIXED(veh); VEHICLE::SET_VEHICLE_FIXED(veh);
VEHICLE::SET_VEHICLE_DIRT_LEVEL(veh, 0.f); VEHICLE::SET_VEHICLE_DIRT_LEVEL(veh, 0.f);

View File

@ -25,6 +25,7 @@ namespace big::vehicle
void bring(Vehicle veh, Vector3 location, bool put_in = true, int seatIdx = -1); void bring(Vehicle veh, Vector3 location, bool put_in = true, int seatIdx = -1);
Vehicle get_closest_to_location(Vector3 location, float range); Vehicle get_closest_to_location(Vector3 location, float range);
bool set_plate(Vehicle veh, const char* plate); bool set_plate(Vehicle veh, const char* plate);
void repair_engine_from_water(Vehicle veh);
bool repair(Vehicle veh); bool repair(Vehicle veh);
Vehicle spawn(Hash hash, Vector3 location, float heading, bool is_networked = true, bool script_veh = false); Vehicle spawn(Hash hash, Vector3 location, float heading, bool is_networked = true, bool script_veh = false);
Vehicle clone_from_vehicle_data(std::map<int, int32_t>& data, Vector3 location, float heading); Vehicle clone_from_vehicle_data(std::map<int, int32_t>& 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 set_engine_state(Vehicle current_vehicle, bool state, bool immediately, bool disable_auto_start);
void downgrade(Vehicle vehicle); void downgrade(Vehicle vehicle);
bool remote_control_vehicle(Vehicle veh); bool remote_control_vehicle(Vehicle veh);
/* /*
Set doorId to eDoorId::VEH_EXT_DOOR_INVALID_ID or simply -1 to apply to all vehicle doors. Set doorId to eDoorId::VEH_EXT_DOOR_INVALID_ID or simply -1 to apply to all vehicle doors.
*/ */