Skip to content

Commit

Permalink
fix(vehicle): fix repair not working after going in water (#2996)
Browse files Browse the repository at this point in the history
  • Loading branch information
xiaoxiao921 committed May 1, 2024
1 parent 3470660 commit 435963d
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 20 deletions.
49 changes: 30 additions & 19 deletions src/backend/looped/vehicle/keep_vehicle_repaired.cpp
Expand Up @@ -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;
}
}

Expand All @@ -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);
}
9 changes: 9 additions & 0 deletions src/util/vehicle.cpp
Expand Up @@ -137,13 +137,22 @@ 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))
{
return false;
}

repair_engine_from_water(veh);

VEHICLE::SET_VEHICLE_FIXED(veh);
VEHICLE::SET_VEHICLE_DIRT_LEVEL(veh, 0.f);

Expand Down
3 changes: 2 additions & 1 deletion src/util/vehicle.hpp
Expand Up @@ -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<int, int32_t>& data, Vector3 location, float heading);
Expand All @@ -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.
*/
Expand Down

0 comments on commit 435963d

Please sign in to comment.