monitor/resource/menu/client/cl_ptfx.lua
2025-04-16 22:30:27 +07:00

142 lines
4.1 KiB
Lua

-- Prevent running if menu is disabled
if not TX_MENU_ENABLED then return end
-- ===============
-- This file contains the particle effects feature
-- that happens when a player switches mode (god, noclip, super jump, normal)
-- ===============
local PTFX_DICT, PTFX_ASSET, PTFX_SCALE, PTFX_DURATION, PTFX_AUDIONAME, PTFX_AUDIOREF, LOOP_AMOUNT, LOOP_DELAY
if IS_FIVEM then
PTFX_DICT = 'core'
PTFX_ASSET = 'ent_dst_elec_fire_sp'
PTFX_SCALE = 1.75
PTFX_DURATION = 1500
PTFX_AUDIONAME = 'ent_amb_elec_crackle'
PTFX_AUDIOREF = 0
LOOP_AMOUNT = 7
LOOP_DELAY = 75
else
PTFX_DICT = 'core'
PTFX_ASSET = 'fire_wrecked_hot_air_balloon'
PTFX_SCALE = 1.5
PTFX_DURATION = 1250
PTFX_AUDIONAME = 'Man_On_Fire'
PTFX_AUDIOREF = 'REKR_Dispute_Sounds'
LOOP_AMOUNT = 1
LOOP_DELAY = 0
end
local function playPtfxSoundFivem(index, tgtPedId, isSelf)
-- -- Apparently we _need_ to network this, so disabling the sound if not self
-- if not isSelf then return end
PlaySoundFromEntity(
-1,
PTFX_AUDIONAME,
tgtPedId,
PTFX_AUDIOREF,
false,
0
)
end
local function playPtfxSoundRedm(index, tgtPedId, isSelf)
--FIXME: I gave up on making sound work in RedM, it's too much of a hassle
-- -- Play only the first time
-- if index ~= 1 then return end
-- -- -- Apparently we _need_ to network this, so disabling the sound if not self
-- -- if not isSelf then return end
-- local loadAttempts = 1
-- while PTFX_AUDIOREF ~= 0 and not PrepareSoundset(PTFX_AUDIOREF, 0) and loadAttempts <= 60 do
-- loadAttempts = loadAttempts + 1
-- Citizen.Wait(5)
-- end
-- PlaySoundFromEntityWithSet(
-- -1,
-- PTFX_AUDIONAME,
-- tgtPedId,
-- PTFX_AUDIOREF,
-- false,
-- 0
-- )
-- -- PlaySoundFromEntity(
-- -- PTFX_AUDIONAME,
-- -- tgtPedId,
-- -- PTFX_AUDIOREF,
-- -- false,
-- -- true,
-- -- 0
-- -- )
-- CreateThread(function()
-- Wait(3000)
-- ReleaseSoundset(audioRef)
-- end)
end
local playPtfxSound = IS_FIVEM and playPtfxSoundFivem or playPtfxSoundRedm
-- Applies the particle effect to a ped
function CreatePlayerModePtfxLoop(tgtPedId, isSelf)
CreateThread(function()
if tgtPedId <= 0 or tgtPedId == nil then return end
RequestNamedPtfxAsset(PTFX_DICT)
-- Wait until it's done loading.
while not HasNamedPtfxAssetLoaded(PTFX_DICT) do
Wait(5)
end
local particleTbl = {}
for i = 0, LOOP_AMOUNT do
UseParticleFxAsset(PTFX_DICT)
playPtfxSound(i, tgtPedId, isSelf)
local partiResult = StartParticleFxLoopedOnEntity(
PTFX_ASSET,
tgtPedId,
0.0, 0.0, 0.0, -- offset
0.0, 0.0, 0.0, -- rot
PTFX_SCALE,
false, false, false -- axis
)
particleTbl[#particleTbl + 1] = partiResult
Wait(LOOP_DELAY)
end
Wait(PTFX_DURATION)
for _, parti in ipairs(particleTbl) do
StopParticleFxLooped(parti, true)
end
RemoveNamedPtfxAsset(PTFX_DICT)
end)
end
-- DEBUG Test Command
-- RegisterCommand('ptfx', function()
-- CreateThread(function()
-- Wait(500)
-- while true do
-- -- get nearby players to receive the ptfx sync event
-- local players = GetActivePlayers()
-- local nearbyPlayers = {}
-- for _, player in ipairs(players) do
-- nearbyPlayers[#nearbyPlayers + 1] = GetPlayerServerId(player)
-- end
-- TriggerServerEvent('txsv:req:changePlayerMode', 'none', nearbyPlayers)
-- Wait(5000)
-- end
-- end)
-- end)
RegisterNetEvent('txcl:showPtfx', function(tgtSrc)
debugPrint('Syncing particle effect for target netId', tgtSrc)
local tgtPlayer = GetPlayerFromServerId(tgtSrc)
if tgtPlayer == -1 then return end
CreatePlayerModePtfxLoop(GetPlayerPed(tgtPlayer), false)
end)