65 lines
		
	
	
		
			No EOL
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			No EOL
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
local PlayerParticles = {}
 | 
						|
 | 
						|
function PtfxThis(asset)
 | 
						|
    while not HasNamedPtfxAssetLoaded(asset) do
 | 
						|
        RequestNamedPtfxAsset(asset)
 | 
						|
        Wait(10)
 | 
						|
    end
 | 
						|
    UseParticleFxAsset(asset)
 | 
						|
end
 | 
						|
 | 
						|
function PtfxStart()
 | 
						|
    LocalPlayer.state:set('ptfx', true, true)
 | 
						|
end
 | 
						|
 | 
						|
function PtfxStop()
 | 
						|
    LocalPlayer.state:set('ptfx', nil, true)
 | 
						|
end
 | 
						|
 | 
						|
AddStateBagChangeHandler('ptfx', '', function(bagName, key, value, _unused, replicated)
 | 
						|
    local plyId = tonumber(bagName:gsub('player:', ''), 10)
 | 
						|
 | 
						|
    if (PlayerParticles[plyId] and value) or (not PlayerParticles[plyId] and not value) then return end
 | 
						|
 | 
						|
    local ply = GetPlayerFromServerId(plyId)
 | 
						|
    if ply <= 0 then return end
 | 
						|
 | 
						|
    local plyPed = GetPlayerPed(ply)
 | 
						|
    if not DoesEntityExist(plyPed) then return end
 | 
						|
 | 
						|
    local stateBag = Player(plyId).state
 | 
						|
 | 
						|
    if value then
 | 
						|
        local boneIndex = stateBag.ptfxBone and GetPedBoneIndex(plyPed, stateBag.ptfxBone) or GetEntityBoneIndexByName(stateBag.ptfxName, "VFX")
 | 
						|
        local entityTarget = plyPed
 | 
						|
 | 
						|
        if stateBag.ptfxPropNet then
 | 
						|
            local propObj = NetToObj(stateBag.ptfxPropNet)
 | 
						|
            if DoesEntityExist(propObj) then
 | 
						|
                entityTarget = propObj
 | 
						|
            end
 | 
						|
        end
 | 
						|
 | 
						|
        PtfxThis(stateBag.ptfxAsset)
 | 
						|
 | 
						|
        local offset = stateBag.ptfxOffset
 | 
						|
        local rot = stateBag.ptfxRot
 | 
						|
        PlayerParticles[plyId] = StartNetworkedParticleFxLoopedOnEntityBone(stateBag.ptfxName, entityTarget, offset.x, offset.y, offset.z, rot.x, rot.y, rot.z, boneIndex, (stateBag.ptfxScale or 1) + 0.0, false, false, false)
 | 
						|
 | 
						|
        local color = stateBag.ptfxColor
 | 
						|
        if color then
 | 
						|
            if color[1] and type(color[1]) == 'table' then
 | 
						|
                local randomIndex = math.random(1, #color)
 | 
						|
                color = color[randomIndex]
 | 
						|
            end
 | 
						|
            SetParticleFxLoopedAlpha(PlayerParticles[plyId], color.A)
 | 
						|
            SetParticleFxLoopedColour(PlayerParticles[plyId], color.R / 255, color.G / 255, color.B / 255, false)
 | 
						|
        end
 | 
						|
        DebugPrint("Started PTFX: " .. PlayerParticles[plyId])
 | 
						|
    else
 | 
						|
        DebugPrint("Stopped PTFX: " .. PlayerParticles[plyId])
 | 
						|
        StopParticleFxLooped(PlayerParticles[plyId], false)
 | 
						|
        RemoveNamedPtfxAsset(stateBag.ptfxAsset)
 | 
						|
        PlayerParticles[plyId] = nil
 | 
						|
    end
 | 
						|
end) |