142 lines
4.1 KiB
Lua
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)
|