2021-08-16 23:11:08 +02:00
|
|
|
#include "backend/looped/looped.hpp"
|
2023-06-06 07:40:40 +00:00
|
|
|
#include "backend/looped_command.hpp"
|
2023-02-13 20:38:30 +00:00
|
|
|
#include "natives.hpp"
|
2023-07-19 11:21:34 -04:00
|
|
|
#include "util/mobile.hpp"
|
2021-08-16 23:11:08 +02:00
|
|
|
|
|
|
|
namespace big
|
|
|
|
{
|
2023-06-06 07:40:40 +00:00
|
|
|
class vehicle_godmode_internal : looped_command
|
2021-08-16 23:11:08 +02:00
|
|
|
{
|
2023-06-06 07:40:40 +00:00
|
|
|
using looped_command::looped_command;
|
|
|
|
|
|
|
|
uint32_t last_bits = 0;
|
|
|
|
float last_water_collistion_strength = 0;
|
|
|
|
bool last_driving = false;
|
2021-08-16 23:11:08 +02:00
|
|
|
|
2023-07-19 11:21:34 -04:00
|
|
|
void apply_godmode_to_vehicle(CVehicle* vehicle, bool personal_vehicle = false)
|
2023-02-13 20:38:30 +00:00
|
|
|
{
|
2023-07-19 11:21:34 -04:00
|
|
|
if (vehicle == nullptr)
|
2023-02-13 20:38:30 +00:00
|
|
|
{
|
2023-06-06 07:40:40 +00:00
|
|
|
return;
|
2023-02-13 20:38:30 +00:00
|
|
|
}
|
|
|
|
|
2023-07-19 11:21:34 -04:00
|
|
|
if (!personal_vehicle)
|
2023-06-06 07:40:40 +00:00
|
|
|
{
|
2023-07-19 11:21:34 -04:00
|
|
|
if (!PED::GET_PED_CONFIG_FLAG(self::ped, 62, false))
|
2023-06-06 07:40:40 +00:00
|
|
|
{
|
2023-07-19 11:21:34 -04:00
|
|
|
if (last_driving)
|
|
|
|
{
|
|
|
|
vehicle->m_deform_god = 0x9C;
|
|
|
|
vehicle->m_damage_bits = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
last_driving = false;
|
|
|
|
return;
|
2023-06-06 07:40:40 +00:00
|
|
|
}
|
2023-02-13 20:38:30 +00:00
|
|
|
|
2023-07-19 11:21:34 -04:00
|
|
|
last_driving = true;
|
2023-06-06 07:40:40 +00:00
|
|
|
}
|
2023-02-13 20:38:30 +00:00
|
|
|
|
2023-06-06 07:40:40 +00:00
|
|
|
if (g.vehicle.god_mode || g.vehicle.proof_collision)
|
|
|
|
{
|
2023-07-19 11:21:34 -04:00
|
|
|
vehicle->m_deform_god = 0x8C;
|
2023-06-06 07:40:40 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2023-07-19 11:21:34 -04:00
|
|
|
vehicle->m_deform_god = 0x9C;
|
2023-06-06 07:40:40 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t bits = g.vehicle.proof_mask;
|
|
|
|
uint32_t changed_bits = bits ^ last_bits;
|
|
|
|
uint32_t changed_or_enabled_bits = bits | changed_bits;
|
2022-07-12 22:42:07 +08:00
|
|
|
|
2023-06-06 07:40:40 +00:00
|
|
|
if (changed_or_enabled_bits)
|
|
|
|
{
|
2023-07-19 11:21:34 -04:00
|
|
|
uint32_t unchanged_bits = vehicle->m_damage_bits & ~changed_or_enabled_bits;
|
|
|
|
vehicle->m_damage_bits = unchanged_bits | bits;
|
|
|
|
if (personal_vehicle == false)
|
|
|
|
{
|
|
|
|
last_bits = bits;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void on_tick() override
|
|
|
|
{
|
|
|
|
if (g_local_player)
|
|
|
|
{
|
|
|
|
Vehicle personal_vehicle = mobile::mechanic::get_personal_vehicle();
|
|
|
|
if (ENTITY::DOES_ENTITY_EXIST(personal_vehicle))
|
|
|
|
{
|
|
|
|
const auto personal_vehicle_ptr = reinterpret_cast<CVehicle*>(g_pointers->m_gta.m_handle_to_ptr(personal_vehicle));
|
|
|
|
apply_godmode_to_vehicle(personal_vehicle_ptr, true);
|
|
|
|
}
|
|
|
|
apply_godmode_to_vehicle(g_local_player->m_vehicle);
|
2023-06-06 07:40:40 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void on_disable() override
|
2022-07-12 22:42:07 +08:00
|
|
|
{
|
2023-06-06 07:40:40 +00:00
|
|
|
if (g_local_player && g_local_player->m_vehicle)
|
|
|
|
{
|
|
|
|
g_local_player->m_vehicle->m_deform_god = 0x9C;
|
|
|
|
g_local_player->m_vehicle->m_damage_bits = 0;
|
|
|
|
}
|
2022-07-12 22:42:07 +08:00
|
|
|
}
|
2023-06-06 07:40:40 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
static bool true_ref = true;
|
|
|
|
vehicle_godmode_internal g_vehicle_godmode_internal("$$vehgodmode", "", "", true_ref);
|
|
|
|
bool_command g_vehicle_godmode("vehgodmode", "Vehicle God Mode", "Prevents your vehicle from taking any form of damage",
|
|
|
|
g.vehicle.god_mode);
|
2021-08-16 23:11:08 +02:00
|
|
|
}
|