#include "natives.hpp" #include "backend/looped_command.hpp" #include "gta/enums.hpp" #include "core/data/ptfx_effects.hpp" namespace big { class ptfx_looped : looped_command { using looped_command::looped_command; PedBones ptfx_ped_bones[5] = { PedBones::SKEL_Head, PedBones::SKEL_L_Hand, PedBones::SKEL_R_Hand, PedBones::SKEL_L_Foot, PedBones::SKEL_R_Foot }; const char* ptfx_vehicle_pos[4] = { "wheel_lf", "wheel_lr", "wheel_rf", "wheel_rr" }; void show_player_ptfx_effect(const char* fx_name, const char* name) { STREAMING::REQUEST_NAMED_PTFX_ASSET(fx_name); for (const auto& ptfx_bone : ptfx_ped_bones) { GRAPHICS::USE_PARTICLE_FX_ASSET(fx_name); GRAPHICS::START_NETWORKED_PARTICLE_FX_NON_LOOPED_ON_PED_BONE(name, self::ped, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, (int)ptfx_bone, g.self.ptfx_effects.size, 1, 1, 1); STREAMING::REMOVE_PTFX_ASSET(); } } void show_vehicle_ptfx_effect(const char* fx_name, const char* name) { for (const auto& ptfx_bone : ptfx_vehicle_pos) { GRAPHICS::USE_PARTICLE_FX_ASSET(fx_name); Vector3 bone_pos = ENTITY::GET_WORLD_POSITION_OF_ENTITY_BONE(self::veh, ENTITY::GET_ENTITY_BONE_INDEX_BY_NAME(self::veh, ptfx_bone)); GRAPHICS::START_NETWORKED_PARTICLE_FX_NON_LOOPED_AT_COORD(name, bone_pos.x, bone_pos.y, bone_pos.z, 0.f, 0.f, 0.f, g.self.ptfx_effects.size, 0.f, 0.f, 0.f, 0); } } virtual void on_tick() override { if (self::veh == 0) show_player_ptfx_effect(g.self.ptfx_effects.asset, g.self.ptfx_effects.effect); else show_vehicle_ptfx_effect(g.self.ptfx_effects.asset, g.self.ptfx_effects.effect); } }; ptfx_looped g_ptfx_looped("ptfx", "Enable PTFX", "Show nice PTFX Effects on your character", g.self.ptfx_effects.show); }