1
0
Fork 0
forked from Simnation/Main
Main/resources/[qb]/qb-smallresources/client/fireworks.lua

882 lines
30 KiB
Lua
Raw Normal View History

2025-06-07 08:51:21 +02:00
local QBCore = exports['qb-core']:GetCoreObject()
local fireworkTime = 0
local fireworkLoc = nil
2025-07-02 16:24:15 +02:00
2025-07-02 16:51:27 +02:00
-- Modelle für Feuerwerks-Batterien und Raketen
local fireworkModels = {
["firework1"] = "ind_prop_firework_01", -- Rakete für firework1
2025-07-02 17:30:08 +02:00
["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)
2025-07-02 16:24:15 +02:00
}
2025-07-02 17:30:08 +02:00
-- 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
2025-06-07 08:51:21 +02:00
}
2025-07-02 17:30:08 +02:00
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)
2025-07-02 16:51:27 +02:00
local function launchFireworkRocket(coords)
-- Lade das Raketenmodell
local rocketModel = "ind_prop_firework_01"
RequestModel(GetHashKey(rocketModel))
while not HasModelLoaded(GetHashKey(rocketModel)) do
Wait(10)
end
2025-07-02 16:41:58 +02:00
2025-07-02 16:51:27 +02:00
-- Erstelle die Rakete
local rocket = CreateObject(GetHashKey(rocketModel),
coords.x, coords.y, coords.z - 0.5,
true, true, false)
-- Stelle die Rakete richtig auf den Boden
PlaceObjectOnGroundProperly(rocket)
FreezeEntityPosition(rocket, true)
-- Warte kurz, damit die Rakete sichtbar ist
Wait(500)
-- Lade die Feuerwerkseffekte
local ptfxAssets = {
"scr_indep_fireworks",
"proj_xmas_firework",
"proj_indep_firework_v2",
"proj_indep_firework"
}
for _, asset in ipairs(ptfxAssets) do
RequestNamedPtfxAsset(asset)
while not HasNamedPtfxAssetLoaded(asset) do
Wait(10)
end
2025-07-02 16:41:58 +02:00
end
2025-07-02 16:51:27 +02:00
-- Füge einen Zündungseffekt hinzu (kleiner Funke statt Flamme)
UseParticleFxAssetNextCall("scr_indep_fireworks")
local ignitionEffect = StartParticleFxLoopedOnEntity("scr_indep_firework_sparkle_spawn",
rocket, 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", rocket, "dlc_sum20_beach_party_sounds", true, 20)
-- Warte kurz für den Zündungseffekt
Wait(1000)
-- Stoppe den Zündungseffekt
StopParticleFxLooped(ignitionEffect, 0)
-- Löse die Rakete vom Boden
FreezeEntityPosition(rocket, false)
-- Füge einen Aufstiegseffekt hinzu
UseParticleFxAssetNextCall("scr_indep_fireworks")
local trailEffect = StartParticleFxLoopedOnEntity("scr_indep_firework_trail_spawn",
rocket, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, false, false, false)
-- Bewege die Rakete nach oben
local startTime = GetGameTimer()
local duration = 3000 -- 3 Sekunden Aufstieg
local height = math.random(40, 60)
local startZ = GetEntityCoords(rocket).z
-- Aufstiegsschleife mit leichter Schwankung
while GetGameTimer() - startTime < duration do
local progress = (GetGameTimer() - startTime) / duration
local newZ = startZ + (height * progress)
-- Leichte Schwankung für realistischen Flug
local wobbleX = math.sin(GetGameTimer() * 0.01) * 0.3 * progress
local wobbleY = math.cos(GetGameTimer() * 0.01) * 0.3 * progress
SetEntityCoords(rocket,
coords.x + wobbleX,
coords.y + wobbleY,
newZ)
Wait(0)
end
-- Stoppe den Aufstiegseffekt
StopParticleFxLooped(trailEffect, 0)
-- Verstecke die Rakete
SetEntityVisible(rocket, false, 0)
-- Explosionseffekt in der Luft
local explosionHeight = startZ + height
2025-07-02 17:30:08 +02:00
-- 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
2025-07-02 16:51:27 +02:00
for i = 1, 5 do
-- Leichte Variation in der Position
local offsetX = math.random(-5, 5)
local offsetY = math.random(-5, 5)
local offsetZ = math.random(-5, 5)
2025-07-02 17:30:08 +02:00
UseParticleFxAssetNextCall("scr_indep_fireworks")
2025-07-02 16:51:27 +02:00
StartParticleFxNonLoopedAtCoord(
2025-07-02 17:30:08 +02:00
"scr_indep_firework_starburst",
2025-07-02 16:51:27 +02:00
coords.x + offsetX, coords.y + offsetY, explosionHeight + offsetZ,
0.0, 0.0, 0.0,
2025-07-02 17:30:08 +02:00
math.random(15, 25) / 10,
2025-07-02 16:51:27 +02:00
false, false, false
)
2025-07-02 17:30:08 +02:00
-- Sekundäres Explosionsgeräusch
PlaySoundFromCoord(-1, "DISTANT_FIREWORK_BURST_0" .. math.random(2, 3),
2025-07-02 16:51:27 +02:00
coords.x + offsetX, coords.y + offsetY, explosionHeight + offsetZ,
2025-07-02 17:30:08 +02:00
"dlc_sum20_beach_party_sounds", true, 30, false)
2025-07-02 16:51:27 +02:00
Wait(math.random(100, 300))
2025-07-02 17:08:18 +02:00
end
2025-07-02 16:51:27 +02:00
-- Lösche die Rakete nach einer Weile
Wait(5000)
DeleteEntity(rocket)
end
2025-07-02 17:20:48 +02:00
-- Funktion für eine kreischende Fontäne (firework4)
local function launchFireworkFountain(coords)
-- Lade das Fontänenmodell
local fountainModel = "prop_firework_03"
RequestModel(GetHashKey(fountainModel))
while not HasModelLoaded(GetHashKey(fountainModel)) do
Wait(10)
end
-- Erstelle die Fontäne
local fountain = CreateObject(GetHashKey(fountainModel),
coords.x, coords.y, coords.z - 0.5,
true, true, false)
-- Stelle die Fontäne richtig auf den Boden
PlaceObjectOnGroundProperly(fountain)
FreezeEntityPosition(fountain, true)
-- Warte kurz, damit die Fontäne sichtbar ist
Wait(500)
-- Lade die Feuerwerkseffekte
local ptfxAssets = {
"scr_indep_fireworks",
"core"
}
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",
fountain, 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", fountain, "dlc_sum20_beach_party_sounds", true, 20)
-- Warte kurz für den Zündungseffekt
Wait(1000)
-- Stoppe den Zündungseffekt
StopParticleFxLooped(ignitionEffect, 0)
-- Starte die Fontäne
print("Starte kreischende Fontäne")
-- Dauer der Fontäne
local fountainDuration = 15000 -- 15 Sekunden
local startTime = GetGameTimer()
-- Haupteffekt der Fontäne (kontinuierlich)
UseParticleFxAssetNextCall("scr_indep_fireworks")
local mainEffect = StartParticleFxLoopedOnEntity("scr_indep_firework_fountain",
fountain, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 2.0, false, false, false)
-- Kreischendes Geräusch in Schleife
local lastSoundTime = 0
-- Fontänen-Schleife
while GetGameTimer() - startTime < fountainDuration do
-- Füge zusätzliche Funkeneffekte hinzu
if math.random(1, 100) > 70 then -- 30% Chance pro Frame
UseParticleFxAssetNextCall("scr_indep_fireworks")
StartParticleFxNonLoopedOnEntity(
"scr_indep_firework_sparkle_spawn",
fountain,
math.random(-10, 10) / 10, math.random(-10, 10) / 10, math.random(5, 15) / 10,
0.0, 0.0, 0.0,
math.random(10, 20) / 10,
false, false, false
)
end
-- Kreischendes Geräusch alle 500-1500ms
if GetGameTimer() - lastSoundTime > math.random(500, 1500) then
-- Wähle zufällig zwischen verschiedenen Geräuschen
local sounds = {
"POLICE_SIREN_WAIL", -- Kreischendes Geräusch
"CAR_BOMB_TICK", -- Tickendes Geräusch
"DISTANT_FIREWORK_LAUNCH_01" -- Startgeräusch
}
local sound = sounds[math.random(1, #sounds)]
PlaySoundFromEntity(-1, sound, fountain, "dlc_sum20_beach_party_sounds", true, math.random(10, 30))
lastSoundTime = GetGameTimer()
end
-- Intensivere Effekte gegen Ende
local progress = (GetGameTimer() - startTime) / fountainDuration
if progress > 0.7 and math.random(1, 100) > 50 then -- 50% Chance in der letzten Phase
-- Zusätzliche Funken in verschiedenen Höhen
UseParticleFxAssetNextCall("core")
StartParticleFxNonLoopedOnEntity(
"ent_sht_electrical_box_sp",
fountain,
0.0, 0.0, math.random(5, 20) / 10,
0.0, 0.0, 0.0,
math.random(15, 25) / 10,
false, false, false
)
end
Wait(0)
end
-- Stoppe den Haupteffekt
StopParticleFxLooped(mainEffect, 0)
-- Finale der Fontäne
print("Fontänen-Finale")
-- Mehrere intensive Funkeneffekte für das Finale
for i = 1, 10 do
UseParticleFxAssetNextCall("scr_indep_fireworks")
StartParticleFxNonLoopedOnEntity(
"scr_indep_firework_starburst",
fountain,
0.0, 0.0, math.random(5, 15) / 10,
0.0, 0.0, 0.0,
math.random(15, 25) / 10,
false, false, false
)
-- Finale-Geräusch
PlaySoundFromEntity(-1, "DISTANT_FIREWORK_BURST_0" .. math.random(1, 3),
fountain, "dlc_sum20_beach_party_sounds", true, 40)
Wait(math.random(100, 300))
end
-- Lösche die Fontäne nach einer Weile
Wait(2000)
DeleteEntity(fountain)
end
2025-07-02 17:30:08 +02:00
-- Funktion für bunte Sterne (firework2)
local function startFireworkColorStars(coords)
-- Lade das Batteriemodell
local batteryModel = "ind_prop_firework_04"
2025-07-02 16:34:41 +02:00
RequestModel(GetHashKey(batteryModel))
while not HasModelLoaded(GetHashKey(batteryModel)) do
2025-07-02 16:24:15 +02:00
Wait(10)
end
2025-07-02 16:34:41 +02:00
-- Erstelle die Batterie
local battery = CreateObject(GetHashKey(batteryModel),
2025-07-02 17:30:08 +02:00
coords.x, coords.y, coords.z - 0.5,
2025-07-02 16:24:15 +02:00
true, true, false)
2025-07-02 16:34:41 +02:00
-- Stelle die Batterie richtig auf den Boden
PlaceObjectOnGroundProperly(battery)
FreezeEntityPosition(battery, true)
2025-07-02 16:24:15 +02:00
2025-07-02 16:34:41 +02:00
-- Warte kurz, damit die Batterie sichtbar ist
2025-07-02 16:24:15 +02:00
Wait(500)
2025-07-02 16:41:58 +02:00
-- Lade die Feuerwerkseffekte
local ptfxAssets = {
"scr_indep_fireworks",
2025-07-02 17:30:08 +02:00
"proj_indep_firework_v2"
2025-07-02 16:41:58 +02:00
}
for _, asset in ipairs(ptfxAssets) do
RequestNamedPtfxAsset(asset)
while not HasNamedPtfxAssetLoaded(asset) do
Wait(10)
end
2025-07-02 16:24:15 +02:00
end
2025-07-02 17:30:08 +02:00
-- Füge einen Zündungseffekt hinzu
2025-07-02 16:41:58 +02:00
UseParticleFxAssetNextCall("scr_indep_fireworks")
local ignitionEffect = StartParticleFxLoopedOnEntity("scr_indep_firework_sparkle_spawn",
2025-07-02 16:34:41 +02:00
battery, 0.0, 0.0, 0.2, 0.0, 0.0, 0.0, 0.5, false, false, false)
2025-07-02 16:24:15 +02:00
-- Zündungsgeräusch
2025-07-02 16:34:41 +02:00
PlaySoundFromEntity(-1, "DISTANT_FIREWORK_LAUNCH_01", battery, "dlc_sum20_beach_party_sounds", true, 20)
2025-07-02 16:24:15 +02:00
-- Warte kurz für den Zündungseffekt
Wait(1000)
-- Stoppe den Zündungseffekt
StopParticleFxLooped(ignitionEffect, 0)
2025-07-02 17:30:08 +02:00
-- Anzahl der Schüsse für firework2
local numShots = 15
2025-07-02 16:24:15 +02:00
2025-07-02 17:30:08 +02:00
print("Starte bunte Sterne mit " .. numShots .. " Schüssen")
2025-07-02 16:34:41 +02:00
-- 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(-10, 10) * (i / numShots) -- Größere Streuung bei späteren Schüssen
local offsetY = math.random(-10, 10) * (i / numShots)
2025-07-02 16:41:58 +02:00
-- Starteffekt (kleiner Funke statt Flamme)
UseParticleFxAssetNextCall("scr_indep_fireworks")
StartParticleFxNonLoopedAtCoord("scr_indep_firework_sparkle_spawn",
2025-07-02 16:34:41 +02:00
coords.x, coords.y, coords.z + 0.5,
0.0, 0.0, 0.0,
0.8, false, false, false)
2025-07-02 16:24:15 +02:00
2025-07-02 16:34:41 +02:00
-- 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
2025-07-02 17:30:08 +02:00
-- Wähle einen zufälligen Effekt aus der Liste für firework2
local effect = firework2Effects[math.random(1, #firework2Effects)]
2025-07-02 16:41:58 +02:00
-- Bestimme das richtige Asset für diesen Effekt
local effectAsset = "scr_indep_fireworks" -- Standard
2025-07-02 17:30:08 +02:00
if effect:find("indep_burst") or effect:find("indep_spiral") or effect:find("indep_ring") then
2025-07-02 16:41:58 +02:00
effectAsset = "proj_indep_firework_v2"
end
2025-07-02 16:34:41 +02:00
-- Starte den Haupteffekt
2025-07-02 16:41:58 +02:00
UseParticleFxAssetNextCall(effectAsset)
2025-07-02 16:24:15 +02:00
StartParticleFxNonLoopedAtCoord(
2025-07-02 16:34:41 +02:00
effect,
coords.x + offsetX, coords.y + offsetY, explosionHeight,
2025-07-02 16:24:15 +02:00
0.0, 0.0, 0.0,
2025-07-02 16:34:41 +02:00
math.random(20, 30) / 10, -- Größere Skalierung für bessere Sichtbarkeit
2025-07-02 16:24:15 +02:00
false, false, false
)
2025-07-02 17:30:08 +02:00
-- 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)
2025-07-02 16:41:58 +02:00
for j = 1, 2 do
2025-07-02 17:30:08 +02:00
local subOffsetX = math.random(-5, 5)
local subOffsetY = math.random(-5, 5)
local subOffsetZ = math.random(-5, 5)
2025-07-02 16:34:41 +02:00
2025-07-02 16:41:58 +02:00
-- Wähle einen anderen zufälligen Effekt
2025-07-02 17:30:08 +02:00
local subEffect = firework3Effects[math.random(1, #firework3Effects)]
2025-07-02 16:41:58 +02:00
-- Bestimme das richtige Asset für diesen Effekt
2025-07-02 17:30:08 +02:00
local subEffectAsset = "proj_indep_firework_v2" -- Standard für firework3
2025-07-02 16:41:58 +02:00
if subEffect:find("xmas") then
subEffectAsset = "proj_xmas_firework"
end
UseParticleFxAssetNextCall(subEffectAsset)
2025-07-02 16:34:41 +02:00
StartParticleFxNonLoopedAtCoord(
2025-07-02 16:41:58 +02:00
subEffect,
2025-07-02 16:34:41 +02:00
coords.x + offsetX + subOffsetX,
coords.y + offsetY + subOffsetY,
explosionHeight + subOffsetZ,
0.0, 0.0, 0.0,
math.random(15, 25) / 10,
false, false, false
)
end
2025-07-02 16:24:15 +02:00
-- Explosionsgeräusch
PlaySoundFromCoord(-1, "DISTANT_FIREWORK_BURST_0" .. math.random(1, 3),
2025-07-02 16:34:41 +02:00
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
2025-07-02 17:30:08 +02:00
for i = 1, 10 do
local finalOffsetX = math.random(-20, 20)
local finalOffsetY = math.random(-20, 20)
2025-07-02 16:34:41 +02:00
local finalHeight = math.random(30, 50)
2025-07-02 16:41:58 +02:00
-- Wähle einen zufälligen Effekt für das Finale
2025-07-02 17:30:08 +02:00
local finalEffect = firework3Effects[math.random(1, #firework3Effects)]
2025-07-02 16:41:58 +02:00
-- Bestimme das richtige Asset für diesen Effekt
2025-07-02 17:30:08 +02:00
local finalEffectAsset = "proj_indep_firework_v2" -- Standard für firework3
2025-07-02 16:41:58 +02:00
if finalEffect:find("xmas") then
finalEffectAsset = "proj_xmas_firework"
end
UseParticleFxAssetNextCall(finalEffectAsset)
2025-07-02 16:34:41 +02:00
StartParticleFxNonLoopedAtCoord(
2025-07-02 16:41:58 +02:00
finalEffect,
2025-07-02 16:34:41 +02:00
coords.x + finalOffsetX,
coords.y + finalOffsetY,
coords.z + finalHeight,
0.0, 0.0, 0.0,
2025-07-02 17:30:08 +02:00
math.random(30, 40) / 10, -- Größere Skalierung für das Finale
2025-07-02 16:34:41 +02:00
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,
2025-07-02 16:24:15 +02:00
"dlc_sum20_beach_party_sounds", true, 50, false)
2025-07-02 16:34:41 +02:00
Wait(100)
2025-07-02 16:24:15 +02:00
end
2025-07-02 16:34:41 +02:00
-- Lösche die Batterie nach einer Weile
2025-07-02 16:24:15 +02:00
Wait(5000)
2025-07-02 16:34:41 +02:00
DeleteEntity(battery)
2025-07-02 16:24:15 +02:00
end
2025-06-07 08:51:21 +02:00
local function DrawText3D(x, y, z, text)
SetTextScale(0.35, 0.35)
SetTextFont(4)
SetTextProportional(true)
SetTextColour(255, 255, 255, 215)
BeginTextCommandDisplayText('STRING')
SetTextCentre(true)
AddTextComponentSubstringPlayerName(text)
SetDrawOrigin(x, y, z, 0)
EndTextCommandDisplayText(0.0, 0.0)
local factor = (string.len(text)) / 370
DrawRect(0.0, 0.0 + 0.0125, 0.017 + factor, 0.03, 0, 0, 0, 75)
ClearDrawOrigin()
end
local function fireworkText()
CreateThread(function()
while true do
Wait(0)
if fireworkTime > 0 and fireworkLoc then
DrawText3D(fireworkLoc.x, fireworkLoc.y, fireworkLoc.z, Lang:t('firework.time_left') .. fireworkTime)
end
if fireworkTime <= 0 then break end
end
end)
end
2025-07-02 16:24:15 +02:00
-- Verbesserte Feuerwerk-Startfunktion
2025-07-02 16:41:58 +02:00
local function startFirework(asset, coords, itemName)
2025-06-07 08:51:21 +02:00
fireworkTime = Config.Fireworks.delay
fireworkLoc = { x = coords.x, y = coords.y, z = coords.z }
2025-07-02 16:16:40 +02:00
2025-06-07 08:51:21 +02:00
CreateThread(function()
fireworkText()
while fireworkTime > 0 do
Wait(1000)
2025-07-02 16:16:40 +02:00
fireworkTime = fireworkTime - 1
2025-06-07 08:51:21 +02:00
end
2025-06-22 17:32:14 +02:00
2025-07-02 16:51:27 +02:00
print("Countdown beendet, starte Feuerwerk: " .. itemName)
2025-06-22 17:32:14 +02:00
2025-07-02 16:51:27 +02:00
-- Wähle die richtige Feuerwerksart basierend auf dem Item
if itemName == "firework1" then
-- Rakete für firework1
launchFireworkRocket(coords)
2025-07-02 17:30:08 +02:00
elseif itemName == "firework2" then
-- Bunte Sterne für firework2
startFireworkColorStars(coords)
elseif itemName == "firework3" then
-- Massive Show für firework3
startFireworkMassiveShow(coords)
2025-07-02 17:20:48 +02:00
elseif itemName == "firework4" then
-- Kreischende Fontäne für firework4
launchFireworkFountain(coords)
2025-07-02 16:51:27 +02:00
else
2025-07-02 17:30:08 +02:00
-- Fallback: Bunte Sterne
startFireworkColorStars(coords)
2025-07-02 16:24:15 +02:00
end
2025-07-02 16:16:40 +02:00
2025-06-07 08:51:21 +02:00
fireworkLoc = nil
end)
end
2025-07-02 16:34:41 +02:00
-- Animation für das Anzünden mit Feuerzeug
local function playLighterAnimation()
local ped = PlayerPedId()
-- Lade die Animation
RequestAnimDict("anim@mp_player_intmenu@key_fob@")
while not HasAnimDictLoaded("anim@mp_player_intmenu@key_fob@") do
Wait(10)
end
-- Spiele die Animation ab
TaskPlayAnim(ped, "anim@mp_player_intmenu@key_fob@", "fob_click", 3.0, 3.0, -1, 49, 0, false, false, false)
-- Erstelle ein Feuerzeug-Objekt in der Hand
local coords = GetEntityCoords(ped)
local lighter = CreateObject(GetHashKey("prop_cs_lighter_01"), coords.x, coords.y, coords.z, true, true, true)
AttachEntityToEntity(lighter, ped, GetPedBoneIndex(ped, 57005), 0.1, 0.05, 0.0, -60.0, 0.0, 0.0, true, true, false, true, 1, true)
2025-07-02 16:41:58 +02:00
-- Füge einen kleinen Funkeneffekt statt Flamme hinzu
RequestNamedPtfxAsset("scr_indep_fireworks")
while not HasNamedPtfxAssetLoaded("scr_indep_fireworks") do
2025-07-02 16:34:41 +02:00
Wait(10)
end
2025-07-02 16:41:58 +02:00
UseParticleFxAssetNextCall("scr_indep_fireworks")
local spark = StartParticleFxLoopedOnEntity("scr_indep_firework_sparkle_spawn", lighter, 0.0, 0.0, 0.15, 0.0, 0.0, 0.0, 0.15, false, false, false)
2025-07-02 16:34:41 +02:00
-- Warte 2 Sekunden
Wait(2000)
-- Stoppe die Animation und lösche das Feuerzeug
StopAnimTask(ped, "anim@mp_player_intmenu@key_fob@", "fob_click", 1.0)
2025-07-02 16:41:58 +02:00
StopParticleFxLooped(spark, 0)
2025-07-02 16:34:41 +02:00
DeleteEntity(lighter)
end
-- Überprüfe, ob der Spieler ein Feuerzeug hat
local function hasLighter()
local hasItem = QBCore.Functions.HasItem("lighter")
return hasItem
end
2025-06-07 08:51:21 +02:00
RegisterNetEvent('fireworks:client:UseFirework', function(itemName, assetName)
2025-07-02 16:24:15 +02:00
print("Feuerwerk-Event ausgelöst mit Item: " .. itemName)
2025-06-22 17:32:14 +02:00
2025-07-02 16:34:41 +02:00
-- Überprüfe zuerst, ob der Spieler ein Feuerzeug hat
if not hasLighter() then
QBCore.Functions.Notify(Lang:t('firework.no_lighter'), 'error')
return
end
2025-06-07 08:51:21 +02:00
QBCore.Functions.Progressbar('spawn_object', Lang:t('firework.place_progress'), 3000, false, true, {
disableMovement = true,
disableCarMovement = true,
disableMouse = false,
disableCombat = true,
}, {
animDict = 'anim@narcotics@trash',
anim = 'drop_front',
flags = 16,
}, {}, {}, function() -- Done
StopAnimTask(PlayerPedId(), 'anim@narcotics@trash', 'drop_front', 1.0)
TriggerServerEvent('consumables:server:UseFirework', itemName)
TriggerEvent('qb-inventory:client:ItemBox', QBCore.Shared.Items[itemName], 'remove')
local pos = GetEntityCoords(PlayerPedId())
2025-06-22 17:32:14 +02:00
2025-07-02 16:34:41 +02:00
print("Feuerwerk platziert, beginne Anzündung")
-- Spiele die Feuerzeug-Animation ab
playLighterAnimation()
2025-06-22 17:32:14 +02:00
2025-07-02 16:41:58 +02:00
-- Starte das Feuerwerk mit dem Itemnamen
startFirework(assetName, pos, itemName)
2025-06-07 08:51:21 +02:00
end, function() -- Cancel
StopAnimTask(PlayerPedId(), 'anim@narcotics@trash', 'drop_front', 1.0)
QBCore.Functions.Notify(Lang:t('firework.canceled'), 'error')
end)
end)
2025-07-02 16:24:15 +02:00
2025-07-02 16:51:27 +02:00
-- Test-Befehl für verschiedene Feuerwerkstypen
RegisterCommand('feuerwerk', function(source, args)
local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed)
-- Überprüfe zuerst, ob der Spieler ein Feuerzeug hat
if not hasLighter() then
QBCore.Functions.Notify(Lang:t('firework.no_lighter'), 'error')
return
end
-- Item-Name als Argument
local itemName = args[1] or "firework1"
-- Spiele die Feuerzeug-Animation ab
playLighterAnimation()
-- Starte das passende Feuerwerk
if itemName == "firework1" then
launchFireworkRocket(coords)
2025-07-02 17:30:08 +02:00
elseif itemName == "firework2" then
startFireworkColorStars(coords)
elseif itemName == "firework3" then
startFireworkMassiveShow(coords)
2025-07-02 17:20:48 +02:00
elseif itemName == "firework4" then
launchFireworkFountain(coords)
2025-07-02 16:51:27 +02:00
else
2025-07-02 17:30:08 +02:00
startFireworkColorStars(coords)
2025-07-02 16:51:27 +02:00
end
end)
-- Spezielle Test-Befehle für die verschiedenen Feuerwerkstypen
RegisterCommand('rakete', function()
2025-07-02 16:19:35 +02:00
local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed)
2025-07-02 16:34:41 +02:00
-- Überprüfe zuerst, ob der Spieler ein Feuerzeug hat
if not hasLighter() then
QBCore.Functions.Notify(Lang:t('firework.no_lighter'), 'error')
return
end
2025-07-02 16:51:27 +02:00
-- Spiele die Feuerzeug-Animation ab
playLighterAnimation()
2025-07-02 16:19:35 +02:00
2025-07-02 16:51:27 +02:00
-- Starte die Rakete (firework1)
launchFireworkRocket(coords)
end)
2025-07-02 17:30:08 +02:00
RegisterCommand('buntesterne', function()
2025-07-02 16:51:27 +02:00
local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed)
-- Überprüfe zuerst, ob der Spieler ein Feuerzeug hat
if not hasLighter() then
QBCore.Functions.Notify(Lang:t('firework.no_lighter'), 'error')
return
end
2025-07-02 16:41:58 +02:00
2025-07-02 16:34:41 +02:00
-- Spiele die Feuerzeug-Animation ab
playLighterAnimation()
2025-07-02 17:30:08 +02:00
-- Starte die bunten Sterne (firework2)
startFireworkColorStars(coords)
2025-07-02 16:41:58 +02:00
end)
2025-07-02 17:30:08 +02:00
RegisterCommand('massiveshow', function()
2025-07-02 16:41:58 +02:00
local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed)
-- Überprüfe zuerst, ob der Spieler ein Feuerzeug hat
if not hasLighter() then
QBCore.Functions.Notify(Lang:t('firework.no_lighter'), 'error')
return
end
-- Spiele die Feuerzeug-Animation ab
playLighterAnimation()
2025-07-02 17:30:08 +02:00
-- Starte die massive Show (firework3)
startFireworkMassiveShow(coords)
2025-07-02 16:19:35 +02:00
end)
2025-07-02 17:20:48 +02:00
RegisterCommand('fontaene', function()
local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed)
-- Überprüfe zuerst, ob der Spieler ein Feuerzeug hat
if not hasLighter() then
QBCore.Functions.Notify(Lang:t('firework.no_lighter'), 'error')
return
end
-- Spiele die Feuerzeug-Animation ab
playLighterAnimation()
-- Starte die kreischende Fontäne (firework4)
launchFireworkFountain(coords)
end)
2025-07-02 17:30:08 +02:00