Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: improve firework show performance and ensure synchronization #3

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
193 changes: 45 additions & 148 deletions client/client.lua
Original file line number Diff line number Diff line change
@@ -1,162 +1,59 @@
local particleDict = "scr_indep_fireworks"
local fireworkOver = false
local showStarted = false

RegisterNetEvent("firework:startFireworkShow")
AddEventHandler("firework:startFireworkShow", function()
for i = 1, #Config.FireworkLocations, 1 do
local fireworkPos = vector3(Config.FireworkLocations[i]["x"], Config.FireworkLocations[i]["y"], Config.FireworkLocations[i]["z"])
local fireworkType = Config.FireworkLocations[i]["Fireworktype"]
local function RequestPtfxAsset()
if not HasNamedPtfxAssetLoaded(Config.ParticleDict) then
RequestNamedPtfxAsset(Config.ParticleDict)

if fireworkType == "Battery" then
TriggerServerEvent("firework:battery", fireworkPos)
elseif fireworkType == "Rocket" then
TriggerServerEvent("firework:rocket", fireworkPos)
elseif fireworkType == "Fountain" then
TriggerServerEvent("firework:fountain", fireworkPos)
end
end
end)
while not HasNamedPtfxAssetLoaded(Config.ParticleDict) do
Wait(1)
end
end
end

RegisterNetEvent("firework:stopFireworkShow")
AddEventHandler("firework:stopFireworkShow", function()
fireworkOver = true
end)
local function fireFirework(fireworkPos, effectType)
if not Config.EffectName[effectType] then
return error("Invalid firework type")
end

CreateThread(function()
RequestPtfxAsset()

RegisterNetEvent("firework:battery")
AddEventHandler("firework:battery", function(fireworkPos)
print("HI")
RequestNamedPtfxAsset(particleDict)
while not HasNamedPtfxAssetLoaded(particleDict) do
Wait(1)
end

UseParticleFxAssetNextCall(particleDict)
local particle = StartNetworkedParticleFxNonLoopedAtCoord("scr_indep_firework_trailburst", fireworkPos, 0.0, 0.0, 0.0, math.random() * 0.5 + 0.8, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle2 = StartNetworkedParticleFxNonLoopedAtCoord("scr_indep_firework_trailburst", fireworkPos, 0.0, 0.0, 0.0, math.random() * 0.5 + 0.8, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle3 = StartNetworkedParticleFxNonLoopedAtCoord("scr_indep_firework_trailburst", fireworkPos, 0.0, 0.0, 0.0, math.random() * 0.5 + 0.8, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle4 = StartNetworkedParticleFxNonLoopedAtCoord("scr_indep_firework_trailburst", fireworkPos, 0.0, 0.0, 0.0, math.random() * 0.5 + 0.8, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle5 = StartNetworkedParticleFxNonLoopedAtCoord("scr_indep_firework_trailburst", fireworkPos, 0.0, 0.0, 0.0, math.random() * 0.5 + 0.8, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle6 = StartNetworkedParticleFxNonLoopedAtCoord("scr_indep_firework_trailburst", fireworkPos, 0.0, 0.0, 0.0, math.random() * 0.5 + 0.8, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle7 = StartNetworkedParticleFxNonLoopedAtCoord("scr_indep_firework_trailburst", fireworkPos, 0.0, 0.0, 0.0, math.random() * 0.5 + 0.8, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle8 = StartNetworkedParticleFxNonLoopedAtCoord("scr_indep_firework_trailburst", fireworkPos, 0.0, 0.0, 0.0, math.random() * 0.5 + 0.8, false, false, false, false)
Wait(4000)
UseParticleFxAssetNextCall(particleDict)
local particle9 = StartNetworkedParticleFxNonLoopedAtCoord("scr_indep_firework_trailburst", fireworkPos, 0.0, 0.0, 0.0, math.random() * 0.5 + 1.8, false, false, false, false)
while showStarted do
for i = 1, 10, 1 do
local wait = math.random(500, 1000)

if fireworkOver then
return
else
TriggerEvent("firework:battery", fireworkPos)
end
end)
Wait(wait)

RegisterNetEvent("firework:rocket")
AddEventHandler("firework:rocket", function(fireworkPos)
while not HasNamedPtfxAssetLoaded(particleDict) do
Wait(1)
end
UseParticleFxAssetNextCall(particleDict)
local particle = StartParticleFxNonLoopedAtCoord("scr_indep_firework_starburst", fireworkPos, 0.0, 0.0, 0.0, 2.5, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle2 = StartParticleFxNonLoopedAtCoord("scr_indep_firework_starburst", fireworkPos, 0.0, 0.0, 0.0, 2.5, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle3 = StartParticleFxNonLoopedAtCoord("scr_indep_firework_starburst", fireworkPos, 0.0, 0.0, 0.0, 2.5, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle4 = StartParticleFxNonLoopedAtCoord("scr_indep_firework_starburst", fireworkPos, 0.0, 0.0, 0.0, 2.5, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle5 = StartParticleFxNonLoopedAtCoord("scr_indep_firework_starburst", fireworkPos, 0.0, 0.0, 0.0, 2.5, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle6 = StartParticleFxNonLoopedAtCoord("scr_indep_firework_starburst", fireworkPos, 0.0, 0.0, 0.0, 2.5, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle7 = StartParticleFxNonLoopedAtCoord("scr_indep_firework_starburst", fireworkPos, 0.0, 0.0, 0.0, 2.5, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle8 = StartParticleFxNonLoopedAtCoord("scr_indep_firework_starburst", fireworkPos, 0.0, 0.0, 0.0, 2.5, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle9 = StartParticleFxNonLoopedAtCoord("scr_indep_firework_starburst", fireworkPos, 0.0, 0.0, 0.0, 2.5, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle10 = StartParticleFxNonLoopedAtCoord("scr_indep_firework_starburst", fireworkPos, 0.0, 0.0, 0.0, 2.5, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle11 = StartParticleFxNonLoopedAtCoord("scr_indep_firework_starburst", fireworkPos, 0.0, 0.0, 0.0, 2.5, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle12 = StartParticleFxNonLoopedAtCoord("scr_indep_firework_starburst", fireworkPos, 0.0, 0.0, 0.0, 2.5, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle13 = StartParticleFxNonLoopedAtCoord("scr_indep_firework_starburst", fireworkPos, 0.0, 0.0, 0.0, 2.5, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle14 = StartParticleFxNonLoopedAtCoord("scr_indep_firework_starburst", fireworkPos, 0.0, 0.0, 0.0, 2.5, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle15 = StartParticleFxNonLoopedAtCoord("scr_indep_firework_starburst", fireworkPos, 0.0, 0.0, 0.0, 2.5, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(Config.ParticleDict)

if fireworkOver then
StartParticleFxNonLoopedAtCoord(Config.EffectName[effectType], fireworkPos.x, fireworkPos.y,
fireworkPos.z, 0.0, 0.0, 0.0,
2.5, false, false, false)
Wait(1500)
end
end
end)
end

local function startShow()
if showStarted then
return
else
TriggerEvent("firework:rocket", fireworkPos)
end
end)

RegisterNetEvent("firework:fountain")
AddEventHandler("firework:fountain", function(fireworkPos)
RequestNamedPtfxAsset(particleDict)
while not HasNamedPtfxAssetLoaded(particleDict) do
Wait(1)
end

UseParticleFxAssetNextCall(particleDict)
local particle = StartNetworkedParticleFxNonLoopedAtCoord("scr_indep_firework_fountain", fireworkPos, 0.0, 0.0, 0.0, math.random() * 0.5 + 0.8, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle2 = StartNetworkedParticleFxNonLoopedAtCoord("scr_indep_firework_fountain", fireworkPos, 0.0, 0.0, 0.0, math.random() * 0.5 + 0.8, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle3 = StartNetworkedParticleFxNonLoopedAtCoord("scr_indep_firework_fountain", fireworkPos, 0.0, 0.0, 0.0, math.random() * 0.5 + 0.8, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle4 = StartNetworkedParticleFxNonLoopedAtCoord("scr_indep_firework_fountain", fireworkPos, 0.0, 0.0, 0.0, math.random() * 0.5 + 0.8, false, false, false, false)
Wait(1500)
UseParticleFxAssetNextCall(particleDict)
local particle5 = StartNetworkedParticleFxNonLoopedAtCoord("scr_indep_firework_fountain", fireworkPos, 0.0, 0.0, 0.0, math.random() * 0.5 + 0.8, false, false, false, false)
Wait(2500)
UseParticleFxAssetNextCall(particleDict)
local particle6 = StartNetworkedParticleFxNonLoopedAtCoord("scr_indep_firework_fountain", fireworkPos, 0.0, 0.0, 0.0, math.random() * 1.5 + 1.8, false, false, false, false)
Wait(2500)
UseParticleFxAssetNextCall(particleDict)
local particle7 = StartNetworkedParticleFxNonLoopedAtCoord("scr_indep_firework_fountain", fireworkPos, 0.0, 0.0, 0.0, math.random() * 1.5 + 1.8, false, false, false, false)
Wait(2500)
UseParticleFxAssetNextCall(particleDict)
local particle8 = StartNetworkedParticleFxNonLoopedAtCoord("scr_indep_firework_fountain", fireworkPos, 0.0, 0.0, 0.0, math.random() * 1.5 + 1.8, false, false, false, false)
showStarted = true

if fireworkOver then
return
else
TriggerEvent("firework:rocket", fireworkPos)
for _, data in pairs(Config.FireworkLocations) do
local position = data.position
local effectName = data.effectName

fireFirework(position, effectName)
end
end

RegisterNetEvent("firework:startFireworkShow", function()
startShow()
end)

RegisterNetEvent("firework:stopFireworkShow", function()
showStarted = false
end)
33 changes: 20 additions & 13 deletions config.lua
Original file line number Diff line number Diff line change
@@ -1,17 +1,24 @@
Config = {}
Config.ParticleDict = "scr_indep_fireworks"

Config.EffectName = {
["Battery"] = "scr_indep_firework_trailburst",
["Rocket"] = "scr_indep_firework_starburst",
["Fountain"] = "scr_indep_firework_fountain",
}

Config.FireworkLocations = {
{ ["x"] = -1934.69, ["y"] = -1333.48, ["z"] = 20.74, ["Fireworktype"] = "Battery"},
{ ["x"] = -1800.69, ["y"] = -1333.48, ["z"] = 20.74, ["Fireworktype"] = "Rocket"},
{ ["x"] = -1752.13, ["y"] = -1486.68, ["z"] = 20.74, ["Fireworktype"] = "Fountain"},
{ ["x"] = -1896.52, ["y"] = -1491.06, ["z"] = 20.74, ["Fireworktype"] = "Rocket"},
{ ["x"] = -1714.08, ["y"] = -1404.71, ["z"] = 20.74, ["Fireworktype"] = "Battery"},
{ ["x"] = -1635.27, ["y"] = -1574.06, ["z"] = 20.74, ["Fireworktype"] = "Fountain"},
{ ["x"] = -1714.08, ["y"] = -1404.71, ["z"] = 20.74, ["Fireworktype"] = "Battery"},
{ ["x"] = -1661.6, ["y"] = -1477.31, ["z"] = 20.74, ["Fireworktype"] = "Rocket"},
{ ["x"] = -1784.64, ["y"] = -1309.06, ["z"] = 20.74, ["Fireworktype"] = "Fountain"},
{ ["x"] = -1778.74, ["y"] = -1399.71, ["z"] = 20.74, ["Fireworktype"] = "Rocket"},
{ ["x"] = -1826.71, ["y"] = -1523.61, ["z"] = 20.74, ["Fireworktype"] = "Fountain"},
{ ["x"] = -1766.11, ["y"] = -1638.99, ["z"] = 20.74, ["Fireworktype"] = "Rocket"},
{ ["x"] = -1687.31, ["y"] = -1557.52, ["z"] = 20.74, ["Fireworktype"] = "Battery"},
{ position = vec3(-1934.69, -1333.48, 20.74), effectName = "Battery" },
{ position = vec3(-1800.69, -1333.48, 20.74), effectName = "Rocket" },
{ position = vec3(-1752.13, -1486.68, 20.74), effectName = "Fountain" },
{ position = vec3(-1896.52, -1491.06, 20.74), effectName = "Rocket" },
{ position = vec3(-1714.08, -1404.71, 20.74), effectName = "Battery" },
{ position = vec3(-1635.27, -1574.06, 20.74), effectName = "Fountain" },
{ position = vec3(-1714.08, -1404.71, 20.74), effectName = "Battery" },
{ position = vec3(-1661.6, -1477.31, 20.74), effectName = "Rocket" },
{ position = vec3(-1784.64, -1309.06, 20.74), effectName = "Fountain" },
{ position = vec3(-1778.74, -1399.71, 20.74), effectName = "Rocket" },
{ position = vec3(-1826.71, -1523.61, 20.74), effectName = "Fountain" },
{ position = vec3(-1766.11, -1638.99, 20.74), effectName = "Rocket" },
{ position = vec3(-1687.31, -1557.52, 20.74), effectName = "Battery" },
}
95 changes: 55 additions & 40 deletions server/server.lua
Original file line number Diff line number Diff line change
@@ -1,57 +1,72 @@
GetTime = function()
local timestamp = os.time()
local d = os.date("*t", timestamp).wday
local h = tonumber(os.date("%H", timestamp))
local m = tonumber(os.date("%M", timestamp))
local showStarted = false

return {d = d, h = h, m = m}
function IsNewYear()
local time = os.date("*t")
return time.month == 1 and time.day == 1
end

CreateThread(function()
while true do
Wait(0)
time = GetTime()
if time.h == 0 and time.m == 0 then
FireworkShow()
break
end
end
end)
Wait(1000)
local time = os.date("*t")

CreateThread(function()
while true do
Wait(0)
time = GetTime()
if time.h == 0 and time.m == 15 then
print("^1Fireworkshow is over.^0")
TriggerClientEvent("firework:stopFireworkShow", -1)
break
if IsNewYear() then
if time.hour == 0 and time.min == 0 then
FireworkShow()
elseif time.hour == 0 and time.min == 15 then
StopFireworkShow()
break
end
end
end
end)

FireworkShow = function()
print("It's new year! Time to shine. Starting Fireworkshow....")
TriggerClientEvent("firework:startFireworkShow", -1)
function FireworkShow()
if not showStarted then
TriggerClientEvent("firework:startFireworkShow", -1)

showStarted = true

print("^2Fireworkshow started manually.^0")
else
print("^1Fireworkshow is already running.^0")
end
end

RegisterCommand("fireworkshow", function(source)
print("^2Fireworkshow started manually.^0")
TriggerClientEvent("firework:startFireworkShow", source)
end)
function StopFireworkShow()
if showStarted then
TriggerClientEvent("firework:stopFireworkShow", -1)

RegisterNetEvent("firework:battery")
AddEventHandler("firework:battery", function(fireworkPos)
TriggerClientEvent("firework:battery", -1, fireworkPos)
end)
showStarted = false

RegisterNetEvent("firework:rocket")
AddEventHandler("firework:rocket", function(fireworkPos)
TriggerClientEvent("firework:rocket", -1, fireworkPos)
end)
print("^1Fireworkshow stopped manually.^0")
else
print("^1Fireworkshow is not running.^0")
end
end

RegisterCommand("firework", function(source, args, rawCommand)
local type = tostring(args[1])

RegisterNetEvent("firework:fountain")
AddEventHandler("firework:fountain", function(fireworkPos)
TriggerClientEvent("firework:fountain", -1, fireworkPos)
if type == "start" then
FireworkShow()
elseif type == "stop" then
StopFireworkShow()
elseif type == "status" then
print("Fireworkshow is running: " .. tostring(showStarted))
else
print("----------")
print("firework start - Start the firework show")
print("firework stop - Stop the firework show")
print("firework status - Check if the firework show is running")
print("----------")
end
end, true)

AddEventHandler("playerJoining", function()
local playerId = source

if showStarted then
TriggerClientEvent("firework:startFireworkShow", playerId)
end
end)