diff --git a/resources/[qb]/qb-smallresources/client/fireworks.lua b/resources/[qb]/qb-smallresources/client/fireworks.lua index 3c7784dc3..c7525f867 100644 --- a/resources/[qb]/qb-smallresources/client/fireworks.lua +++ b/resources/[qb]/qb-smallresources/client/fireworks.lua @@ -5,30 +5,25 @@ local fireworkLoc = nil -- Modelle für Feuerwerks-Batterien und Raketen local fireworkModels = { ["firework1"] = "ind_prop_firework_01", -- Rakete für firework1 - ["firework2"] = "ind_prop_firework_04", -- Standard-Batterie für firework2 - ["firework3"] = "ind_prop_firework_03", -- Große Batterie für firework3 - ["firework4"] = "prop_firework_03" -- Alternative Batterie für firework4 (Fontäne) + ["firework2"] = "ind_prop_firework_04", -- Standard-Batterie für firework2 (Bunte Sterne) + ["firework3"] = "ind_prop_firework_03", -- Große Batterie für firework3 (Massive Show) + ["firework4"] = "prop_firework_03" -- Fontäne für firework4 (Kreischende Fontäne) } --- Verbesserte Feuerwerkseffekte ohne Flammen -local fireworkEffects = { - -- Bunte Explosionseffekte - "scr_indep_firework_starburst", - "scr_indep_firework_shotburst", - "scr_indep_firework_trailburst", - "scr_xmas_firework_burst_fizzle", - "scr_firework_indep_burst_rwb", - "scr_firework_indep_spiral_burst_rwb", - "scr_firework_indep_ring_burst_rwb", - -- Konfetti und Funken - "scr_indep_firework_sparkle_spawn", - "scr_xmas_firework_sparkle_spawn", - -- Trails - "proj_indep_flare_trail", - "scr_indep_firework_trail_spawn" +-- Spezifische Effekte für jeden Feuerwerkstyp +local firework2Effects = { + "scr_indep_firework_starburst", -- Sternenförmige Explosionen + "scr_firework_indep_spiral_burst_rwb", -- Spiralförmige Explosionen + "scr_indep_firework_shotburst" -- Schrotartige Explosionen } --- Funktion zum Starten einer Feuerwerksrakete +local firework3Effects = { + "scr_firework_indep_ring_burst_rwb", -- Ringförmige Explosionen + "scr_firework_indep_burst_rwb", -- Massive Explosionen + "scr_xmas_firework_burst_fizzle" -- Knisternde Explosionen +} + +-- Funktion zum Starten einer Feuerwerksrakete (firework1) local function launchFireworkRocket(coords) -- Lade das Raketenmodell local rocketModel = "ind_prop_firework_01" @@ -117,42 +112,43 @@ local function launchFireworkRocket(coords) -- Explosionseffekt in der Luft local explosionHeight = startZ + height - -- Wähle mehrere zufällige Effekte für die Explosion + -- Hauptexplosion - Spezifisch für Rakete: Große Explosion mit Sternen + UseParticleFxAssetNextCall("proj_indep_firework_v2") + StartParticleFxNonLoopedAtCoord( + "scr_firework_indep_burst_rwb", + coords.x, coords.y, explosionHeight, + 0.0, 0.0, 0.0, + 3.0, -- Größere Skalierung für bessere Sichtbarkeit + false, false, false + ) + + -- Explosionsgeräusch + PlaySoundFromCoord(-1, "DISTANT_FIREWORK_BURST_01", + coords.x, coords.y, explosionHeight, + "dlc_sum20_beach_party_sounds", true, 50, false) + + Wait(300) + + -- Sekundäre Explosionen - Kleinere Sterne, die sich ausbreiten for i = 1, 5 do - -- Wähle einen zufälligen Effekt aus der Liste - local effectIndex = math.random(1, #fireworkEffects) - local effect = fireworkEffects[effectIndex] - - -- Bestimme das richtige Asset für diesen Effekt - local effectAsset = "scr_indep_fireworks" -- Standard - - if effect:find("xmas") then - effectAsset = "proj_xmas_firework" - elseif effect:find("indep_burst") or effect:find("indep_spiral") or effect:find("indep_ring") then - effectAsset = "proj_indep_firework_v2" - elseif effect:find("flare") then - effectAsset = "proj_indep_firework" - end - -- Leichte Variation in der Position local offsetX = math.random(-5, 5) local offsetY = math.random(-5, 5) local offsetZ = math.random(-5, 5) - -- Starte den Effekt - UseParticleFxAssetNextCall(effectAsset) + UseParticleFxAssetNextCall("scr_indep_fireworks") StartParticleFxNonLoopedAtCoord( - effect, + "scr_indep_firework_starburst", coords.x + offsetX, coords.y + offsetY, explosionHeight + offsetZ, 0.0, 0.0, 0.0, - math.random(20, 30) / 10, -- Größere Skalierung für bessere Sichtbarkeit + math.random(15, 25) / 10, false, false, false ) - -- Explosionsgeräusch - PlaySoundFromCoord(-1, "DISTANT_FIREWORK_BURST_0" .. math.random(1, 3), + -- Sekundäres Explosionsgeräusch + PlaySoundFromCoord(-1, "DISTANT_FIREWORK_BURST_0" .. math.random(2, 3), coords.x + offsetX, coords.y + offsetY, explosionHeight + offsetZ, - "dlc_sum20_beach_party_sounds", true, 50, false) + "dlc_sum20_beach_party_sounds", true, 30, false) Wait(math.random(100, 300)) end @@ -302,14 +298,10 @@ local function launchFireworkFountain(coords) DeleteEntity(fountain) end --- Funktion zum Starten einer Feuerwerks-Batterie ohne Flammeneffekte -local function startFireworkBattery(coords, itemName) - -- Wähle ein Batteriemodell basierend auf dem Item - local batteryModel = fireworkModels[itemName] or "ind_prop_firework_04" -- Standard, falls nicht definiert - - print("Verwende Batteriemodell: " .. batteryModel) - - -- Lade das Modell +-- Funktion für bunte Sterne (firework2) +local function startFireworkColorStars(coords) + -- Lade das Batteriemodell + local batteryModel = "ind_prop_firework_04" RequestModel(GetHashKey(batteryModel)) while not HasModelLoaded(GetHashKey(batteryModel)) do Wait(10) @@ -317,7 +309,7 @@ local function startFireworkBattery(coords, itemName) -- Erstelle die Batterie local battery = CreateObject(GetHashKey(batteryModel), - coords.x, coords.y, coords.z - 0.5, -- Leicht in den Boden eingelassen + coords.x, coords.y, coords.z - 0.5, true, true, false) -- Stelle die Batterie richtig auf den Boden @@ -330,9 +322,7 @@ local function startFireworkBattery(coords, itemName) -- Lade die Feuerwerkseffekte local ptfxAssets = { "scr_indep_fireworks", - "proj_xmas_firework", - "proj_indep_firework_v2", - "proj_indep_firework" + "proj_indep_firework_v2" } for _, asset in ipairs(ptfxAssets) do @@ -342,7 +332,7 @@ local function startFireworkBattery(coords, itemName) end end - -- Füge einen Zündungseffekt hinzu (kleiner Funke statt Flamme) + -- Füge einen Zündungseffekt hinzu UseParticleFxAssetNextCall("scr_indep_fireworks") local ignitionEffect = StartParticleFxLoopedOnEntity("scr_indep_firework_sparkle_spawn", battery, 0.0, 0.0, 0.2, 0.0, 0.0, 0.0, 0.5, false, false, false) @@ -356,16 +346,10 @@ local function startFireworkBattery(coords, itemName) -- Stoppe den Zündungseffekt StopParticleFxLooped(ignitionEffect, 0) - -- Bestimme die Anzahl der Schüsse basierend auf dem Item - local numShots = 15 -- Standard + -- Anzahl der Schüsse für firework2 + local numShots = 15 - if itemName == "firework3" then - numShots = 30 -- Mehr Schüsse für firework3 (große Batterie) - elseif itemName == "firework2" then - numShots = 15 -- Standard für firework2 - end - - print("Starte Feuerwerks-Batterie mit " .. numShots .. " Schüssen") + print("Starte bunte Sterne mit " .. numShots .. " Schüssen") -- Starte die Feuerwerksschüsse for i = 1, numShots do @@ -390,19 +374,14 @@ local function startFireworkBattery(coords, itemName) -- Explosionseffekt in der Luft (nur Partikel, keine echte Explosion) local explosionHeight = coords.z + height - -- Wähle einen zufälligen Effekt aus der Liste - local effectIndex = math.random(1, #fireworkEffects) - local effect = fireworkEffects[effectIndex] + -- Wähle einen zufälligen Effekt aus der Liste für firework2 + local effect = firework2Effects[math.random(1, #firework2Effects)] -- Bestimme das richtige Asset für diesen Effekt local effectAsset = "scr_indep_fireworks" -- Standard - if effect:find("xmas") then - effectAsset = "proj_xmas_firework" - elseif effect:find("indep_burst") or effect:find("indep_spiral") or effect:find("indep_ring") then + if effect:find("indep_burst") or effect:find("indep_spiral") or effect:find("indep_ring") then effectAsset = "proj_indep_firework_v2" - elseif effect:find("flare") then - effectAsset = "proj_indep_firework" end -- Starte den Haupteffekt @@ -415,25 +394,176 @@ local function startFireworkBattery(coords, itemName) false, false, false ) - -- Füge zusätzliche Effekte für mehr Volumen hinzu + -- Explosionsgeräusch + PlaySoundFromCoord(-1, "DISTANT_FIREWORK_BURST_0" .. math.random(1, 3), + coords.x + offsetX, coords.y + offsetY, explosionHeight, + "dlc_sum20_beach_party_sounds", true, 50, false) + + -- Warte zwischen den Schüssen + -- Schnellere Abfolge gegen Ende für ein Finale + local waitTime = 0 + if i < numShots * 0.7 then + waitTime = math.random(300, 800) + else + waitTime = math.random(100, 300) + end + Wait(waitTime) + end + + -- Warte nach dem letzten Schuss + Wait(2000) + + -- Finale mit mehreren gleichzeitigen Effekten + for i = 1, 5 do + local finalOffsetX = math.random(-15, 15) + local finalOffsetY = math.random(-15, 15) + local finalHeight = math.random(30, 50) + + -- Wähle einen zufälligen Effekt für das Finale + local finalEffect = firework2Effects[math.random(1, #firework2Effects)] + + -- Bestimme das richtige Asset für diesen Effekt + local finalEffectAsset = "scr_indep_fireworks" -- Standard + + if finalEffect:find("indep_burst") or finalEffect:find("indep_spiral") or finalEffect:find("indep_ring") then + finalEffectAsset = "proj_indep_firework_v2" + end + + UseParticleFxAssetNextCall(finalEffectAsset) + StartParticleFxNonLoopedAtCoord( + finalEffect, + coords.x + finalOffsetX, + coords.y + finalOffsetY, + coords.z + finalHeight, + 0.0, 0.0, 0.0, + math.random(25, 35) / 10, -- Größere Skalierung für das Finale + false, false, false + ) + + -- Finale-Geräusch + PlaySoundFromCoord(-1, "DISTANT_FIREWORK_BURST_0" .. math.random(1, 3), + coords.x + finalOffsetX, coords.y + finalOffsetY, coords.z + finalHeight, + "dlc_sum20_beach_party_sounds", true, 50, false) + + Wait(100) + end + + -- Lösche die Batterie nach einer Weile + Wait(5000) + DeleteEntity(battery) +end + +-- Funktion für massive Show (firework3) +local function startFireworkMassiveShow(coords) + -- Lade das Batteriemodell + local batteryModel = "ind_prop_firework_03" + RequestModel(GetHashKey(batteryModel)) + while not HasModelLoaded(GetHashKey(batteryModel)) do + Wait(10) + end + + -- Erstelle die Batterie + local battery = CreateObject(GetHashKey(batteryModel), + coords.x, coords.y, coords.z - 0.5, + true, true, false) + + -- Stelle die Batterie richtig auf den Boden + PlaceObjectOnGroundProperly(battery) + FreezeEntityPosition(battery, true) + + -- Warte kurz, damit die Batterie sichtbar ist + Wait(500) + + -- Lade die Feuerwerkseffekte + local ptfxAssets = { + "scr_indep_fireworks", + "proj_indep_firework_v2", + "proj_xmas_firework" + } + + for _, asset in ipairs(ptfxAssets) do + RequestNamedPtfxAsset(asset) + while not HasNamedPtfxAssetLoaded(asset) do + Wait(10) + end + end + + -- Füge einen Zündungseffekt hinzu + UseParticleFxAssetNextCall("scr_indep_fireworks") + local ignitionEffect = StartParticleFxLoopedOnEntity("scr_indep_firework_sparkle_spawn", + battery, 0.0, 0.0, 0.2, 0.0, 0.0, 0.0, 0.5, false, false, false) + + -- Zündungsgeräusch + PlaySoundFromEntity(-1, "DISTANT_FIREWORK_LAUNCH_01", battery, "dlc_sum20_beach_party_sounds", true, 20) + + -- Warte kurz für den Zündungseffekt + Wait(1000) + + -- Stoppe den Zündungseffekt + StopParticleFxLooped(ignitionEffect, 0) + + -- Anzahl der Schüsse für firework3 + local numShots = 30 + + print("Starte massive Show mit " .. numShots .. " Schüssen") + + -- Starte die Feuerwerksschüsse + for i = 1, numShots do + -- Bestimme die Höhe und Position des Schusses + local height = math.random(30, 50) + local offsetX = math.random(-15, 15) * (i / numShots) -- Größere Streuung bei späteren Schüssen + local offsetY = math.random(-15, 15) * (i / numShots) + + -- Starteffekt (kleiner Funke statt Flamme) + UseParticleFxAssetNextCall("scr_indep_fireworks") + StartParticleFxNonLoopedAtCoord("scr_indep_firework_sparkle_spawn", + coords.x, coords.y, coords.z + 0.5, + 0.0, 0.0, 0.0, + 0.8, false, false, false) + + -- Abschussgeräusch + PlaySoundFromEntity(-1, "DISTANT_FIREWORK_LAUNCH_01", battery, "dlc_sum20_beach_party_sounds", true, 20) + + -- Warte kurz für den visuellen Effekt des Aufstiegs + Wait(math.random(100, 200)) + + -- Explosionseffekt in der Luft (nur Partikel, keine echte Explosion) + local explosionHeight = coords.z + height + + -- Wähle einen zufälligen Effekt aus der Liste für firework3 + local effect = firework3Effects[math.random(1, #firework3Effects)] + + -- Bestimme das richtige Asset für diesen Effekt + local effectAsset = "proj_indep_firework_v2" -- Standard für firework3 + + if effect:find("xmas") then + effectAsset = "proj_xmas_firework" + end + + -- Starte den Haupteffekt + UseParticleFxAssetNextCall(effectAsset) + StartParticleFxNonLoopedAtCoord( + effect, + coords.x + offsetX, coords.y + offsetY, explosionHeight, + 0.0, 0.0, 0.0, + math.random(25, 35) / 10, -- Größere Skalierung für bessere Sichtbarkeit + false, false, false + ) + + -- Füge zusätzliche Effekte für mehr Volumen hinzu (nur bei firework3) for j = 1, 2 do - local subOffsetX = math.random(-3, 3) - local subOffsetY = math.random(-3, 3) - local subOffsetZ = math.random(-3, 3) + local subOffsetX = math.random(-5, 5) + local subOffsetY = math.random(-5, 5) + local subOffsetZ = math.random(-5, 5) -- Wähle einen anderen zufälligen Effekt - local subEffectIndex = math.random(1, #fireworkEffects) - local subEffect = fireworkEffects[subEffectIndex] + local subEffect = firework3Effects[math.random(1, #firework3Effects)] -- Bestimme das richtige Asset für diesen Effekt - local subEffectAsset = "scr_indep_fireworks" -- Standard + local subEffectAsset = "proj_indep_firework_v2" -- Standard für firework3 if subEffect:find("xmas") then subEffectAsset = "proj_xmas_firework" - elseif subEffect:find("indep_burst") or subEffect:find("indep_spiral") or subEffect:find("indep_ring") then - subEffectAsset = "proj_indep_firework_v2" - elseif subEffect:find("flare") then - subEffectAsset = "proj_indep_firework" end UseParticleFxAssetNextCall(subEffectAsset) @@ -468,24 +598,19 @@ local function startFireworkBattery(coords, itemName) Wait(2000) -- Finale mit mehreren gleichzeitigen Effekten - for i = 1, 8 do - local finalOffsetX = math.random(-15, 15) - local finalOffsetY = math.random(-15, 15) + for i = 1, 10 do + local finalOffsetX = math.random(-20, 20) + local finalOffsetY = math.random(-20, 20) local finalHeight = math.random(30, 50) -- Wähle einen zufälligen Effekt für das Finale - local finalEffectIndex = math.random(1, #fireworkEffects) - local finalEffect = fireworkEffects[finalEffectIndex] + local finalEffect = firework3Effects[math.random(1, #firework3Effects)] -- Bestimme das richtige Asset für diesen Effekt - local finalEffectAsset = "scr_indep_fireworks" -- Standard + local finalEffectAsset = "proj_indep_firework_v2" -- Standard für firework3 if finalEffect:find("xmas") then finalEffectAsset = "proj_xmas_firework" - elseif finalEffect:find("indep_burst") or finalEffect:find("indep_spiral") or finalEffect:find("indep_ring") then - finalEffectAsset = "proj_indep_firework_v2" - elseif finalEffect:find("flare") then - finalEffectAsset = "proj_indep_firework" end UseParticleFxAssetNextCall(finalEffectAsset) @@ -495,7 +620,7 @@ local function startFireworkBattery(coords, itemName) coords.y + finalOffsetY, coords.z + finalHeight, 0.0, 0.0, 0.0, - math.random(25, 35) / 10, -- Größere Skalierung für das Finale + math.random(30, 40) / 10, -- Größere Skalierung für das Finale false, false, false ) @@ -503,7 +628,6 @@ local function startFireworkBattery(coords, itemName) PlaySoundFromCoord(-1, "DISTANT_FIREWORK_BURST_0" .. math.random(1, 3), coords.x + finalOffsetX, coords.y + finalOffsetY, coords.z + finalHeight, "dlc_sum20_beach_party_sounds", true, 50, false) - Wait(100) end @@ -557,12 +681,18 @@ local function startFirework(asset, coords, itemName) if itemName == "firework1" then -- Rakete für firework1 launchFireworkRocket(coords) + elseif itemName == "firework2" then + -- Bunte Sterne für firework2 + startFireworkColorStars(coords) + elseif itemName == "firework3" then + -- Massive Show für firework3 + startFireworkMassiveShow(coords) elseif itemName == "firework4" then -- Kreischende Fontäne für firework4 launchFireworkFountain(coords) else - -- Batterie für alle anderen - startFireworkBattery(coords, itemName) + -- Fallback: Bunte Sterne + startFireworkColorStars(coords) end fireworkLoc = nil @@ -668,10 +798,14 @@ RegisterCommand('feuerwerk', function(source, args) -- Starte das passende Feuerwerk if itemName == "firework1" then launchFireworkRocket(coords) + elseif itemName == "firework2" then + startFireworkColorStars(coords) + elseif itemName == "firework3" then + startFireworkMassiveShow(coords) elseif itemName == "firework4" then launchFireworkFountain(coords) else - startFireworkBattery(coords, itemName) + startFireworkColorStars(coords) end end) @@ -693,7 +827,7 @@ RegisterCommand('rakete', function() launchFireworkRocket(coords) end) -RegisterCommand('batterie', function() +RegisterCommand('buntesterne', function() local playerPed = PlayerPedId() local coords = GetEntityCoords(playerPed) @@ -706,11 +840,11 @@ RegisterCommand('batterie', function() -- Spiele die Feuerzeug-Animation ab playLighterAnimation() - -- Starte die Standard-Batterie (firework2) - startFireworkBattery(coords, "firework2") + -- Starte die bunten Sterne (firework2) + startFireworkColorStars(coords) end) -RegisterCommand('grossebatterie', function() +RegisterCommand('massiveshow', function() local playerPed = PlayerPedId() local coords = GetEntityCoords(playerPed) @@ -723,8 +857,8 @@ RegisterCommand('grossebatterie', function() -- Spiele die Feuerzeug-Animation ab playLighterAnimation() - -- Starte die große Batterie (firework3) - startFireworkBattery(coords, "firework3") + -- Starte die massive Show (firework3) + startFireworkMassiveShow(coords) end) RegisterCommand('fontaene', function() @@ -743,4 +877,5 @@ RegisterCommand('fontaene', function() -- Starte die kreischende Fontäne (firework4) launchFireworkFountain(coords) end) - + +