Files
community_bridge/lib/particles/client/particles.lua
T

92 lines
3.2 KiB
Lua
Raw Normal View History

2025-04-08 16:47:27 -05:00
Particle = {}
2025-02-10 01:01:32 -06:00
2025-04-19 13:26:20 -05:00
---Loads a ptfx asset into memory.
---@param dict string
---@return boolean
function LoadPtfxAsset(dict)
2025-04-08 16:47:27 -05:00
local failed = 100
2025-02-10 01:01:32 -06:00
while not HasNamedPtfxAssetLoaded(dict) and failed >= 0 do
2025-04-19 13:26:20 -05:00
RequestNamedPtfxAsset(dict)
2025-02-10 01:01:32 -06:00
failed = failed - 1
2025-04-19 13:26:20 -05:00
Wait(100)
2025-02-10 01:01:32 -06:00
end
2025-04-19 13:26:20 -05:00
assert(failed > 0, "Failed to load dict asset: " .. dict)
return HasNamedPtfxAssetLoaded(dict)
2025-04-08 16:47:27 -05:00
end
2025-02-10 01:01:32 -06:00
2025-04-19 13:26:20 -05:00
2025-04-08 16:47:27 -05:00
--- Create a particle effect at the specified position and rotation.
--- @param dict string
--- @param ptfx string
--- @param pos vector3
--- @param rot vector3
--- @param scale number
--- @param color vector3
--- @param looped boolean
--- @param loopLength number|nil
--- @return number|nil ptfxHandle -- The handle of the particle effect, or nil if it failed to create.
function Particle.Create(dict, ptfx, pos, rot, scale, color, looped, loopLength)
2025-04-19 13:26:20 -05:00
LoadPtfxAsset(dict)
2025-04-20 18:54:27 -05:00
UseParticleFxAssetNextCall(dict)
SetParticleFxNonLoopedColour(color.x, color.y, color.z)
local particle = nil
if looped then
particle = StartParticleFxLoopedAtCoord(ptfx, pos.x, pos.y, pos.z, rot.x, rot.y, rot.z, scale, false, false, false, false)
CreateThread(function()
2025-04-19 13:26:20 -05:00
if loopLength then
Wait(loopLength)
2025-04-20 18:54:27 -05:00
Particle.Remove(particle)
2025-04-19 13:26:20 -05:00
end
2025-04-20 18:54:27 -05:00
end)
else
particle = StartParticleFxNonLoopedAtCoord(ptfx, pos.x, pos.y, pos.z, rot.x, rot.y, rot.z, scale, false, false, false, false)
end
return particle
end
function Particle.Remove(particle)
if not particle then return end
StopParticleFxLooped(particle, false)
RemoveParticleFx(particle, false)
RemoveNamedPtfxAsset(particle)
2025-04-19 13:26:20 -05:00
end
function Particle.CreateOnEntity(dict, ptfx, entity, offset, rot, scale, color, looped, loopLength)
LoadPtfxAsset(dict)
2025-02-10 01:01:32 -06:00
UseParticleFxAssetNextCall(dict)
2025-04-19 13:26:20 -05:00
SetParticleFxNonLoopedColour(color.x, color.y, color.z)
local particle = nil
2025-02-10 01:01:32 -06:00
if looped then
2025-04-19 13:26:20 -05:00
particle = StartNetworkedParticleFxLoopedOnEntity(ptfx, entity, offset.x, offset.y, offset.z, rot.x, rot.y, rot.z, scale, false, false, false)
2025-02-10 01:01:32 -06:00
if loopLength then
Wait(loopLength)
2025-04-19 13:26:20 -05:00
RemoveParticleFxFromEntity(entity)
2025-02-10 01:01:32 -06:00
end
else
2025-04-19 13:26:20 -05:00
particle = StartNetworkedParticleFxLoopedOnEntity(ptfx, entity, offset.x, offset.y, offset.z, rot.x, rot.y, rot.z, scale, false, false, false)
2025-02-10 01:01:32 -06:00
end
2025-04-19 13:26:20 -05:00
RemoveNamedPtfxAsset(ptfx)
return particle
2025-02-10 01:01:32 -06:00
end
2025-04-19 13:26:20 -05:00
function Particle.CreateOnEntityBone(dict, ptfx, entity, bone, offset, rot, scale, color, looped, loopLength)
LoadPtfxAsset(dict)
UseParticleFxAssetNextCall(dict)
SetParticleFxNonLoopedColour(color.x, color.y, color.z)
local particle = nil
if looped then
particle = StartNetworkedParticleFxLoopedOnEntityBone(ptfx, entity, offset.x, offset.y, offset.z, rot.x, rot.y, rot.z, bone, scale, false, false, false)
if loopLength then
Wait(loopLength)
RemoveParticleFxFromEntity(entity)
end
else
particle = StartNetworkedParticleFxNonLoopedOnEntityBone(ptfx, entity, offset.x, offset.y, offset.z, rot.x, rot.y, rot.z, bone, scale, false, false, false)
end
RemoveNamedPtfxAsset(ptfx)
return particle
end
2025-04-08 16:47:27 -05:00
return Particle