forked from Simnation/Main
firework
This commit is contained in:
parent
050ff54c7d
commit
1841025156
6 changed files with 316 additions and 881 deletions
5
resources/[standalone]/vms_firework/README.md
Normal file
5
resources/[standalone]/vms_firework/README.md
Normal file
|
@ -0,0 +1,5 @@
|
|||

|
||||
|
||||
# vms_firework
|
||||
|
||||
### https://discord.gg/k4YNwYxE4h
|
111
resources/[standalone]/vms_firework/client.lua
Normal file
111
resources/[standalone]/vms_firework/client.lua
Normal file
|
@ -0,0 +1,111 @@
|
|||
local function DrawText3D(coords, text)
|
||||
local camCoords = GetFinalRenderedCamCoord()
|
||||
local distance = #(coords - camCoords)
|
||||
local scale = (0.8 / distance) * 2
|
||||
local fov = (1 / GetGameplayCamFov()) * 100
|
||||
scale = scale * fov
|
||||
SetTextScale(0.0 * scale, 0.55 * scale)
|
||||
SetTextFont(4)
|
||||
SetTextProportional(1)
|
||||
SetTextDropShadow()
|
||||
SetTextColour(240, 240, 240, 185)
|
||||
BeginTextCommandDisplayText('STRING')
|
||||
SetTextCentre(true)
|
||||
AddTextComponentSubstringPlayerName(text)
|
||||
SetDrawOrigin(coords.xyz, 0)
|
||||
EndTextCommandDisplayText(0.0, 0.0)
|
||||
ClearDrawOrigin()
|
||||
end
|
||||
|
||||
local function reqAnimDict(dict)
|
||||
while not HasAnimDictLoaded(dict) do
|
||||
RequestAnimDict(dict)
|
||||
Wait(2)
|
||||
end
|
||||
end
|
||||
|
||||
local function reqParticle(dict)
|
||||
RequestNamedPtfxAsset(dict)
|
||||
while not HasNamedPtfxAssetLoaded(dict) do
|
||||
Wait(1)
|
||||
end
|
||||
end
|
||||
|
||||
for k, v in pairs(Config.Fireworks) do
|
||||
if v.command then
|
||||
RegisterCommand(v.command, function(source, args, rawCommand)
|
||||
TriggerEvent('vms_firework:startFirework', k)
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
local hasBox = nil
|
||||
RegisterNetEvent('vms_firework:startFirework', function(type)
|
||||
if Config.DisableMultiplyFireworks then
|
||||
if hasBox then
|
||||
return Config.Notification(Config.Translate['CANNOT_START'], 4500, 'error')
|
||||
end
|
||||
end
|
||||
if Config.Fireworks[type] then
|
||||
local myFirework = Config.Fireworks[type]
|
||||
local myPed = PlayerPedId()
|
||||
local myOffset = GetOffsetFromEntityInWorldCoords(myPed, 0, .6, 0)
|
||||
local fireworkShoots = myFirework.shoots
|
||||
local secondsToStart = myFirework.timeToStart
|
||||
reqAnimDict(Config.PlacingAnimation[1])
|
||||
TaskPlayAnim(myPed, Config.PlacingAnimation[1], Config.PlacingAnimation[2], -1, -8.0, 3000, 0, 0, false, false, false)
|
||||
Citizen.Wait((GetAnimDuration(Config.PlacingAnimation[1], Config.PlacingAnimation[2]) * 1000) - 2050)
|
||||
hasBox = CreateObject(myFirework.prop, myOffset.x, myOffset.y, myOffset.z, true, false, false)
|
||||
PlaceObjectOnGroundProperly(hasBox)
|
||||
FreezeEntityPosition(hasBox, true)
|
||||
Config.Notification(Config.Translate['YOU_PLACE_FIREWORK'], 4500, 'success')
|
||||
local boxCoords = GetEntityCoords(hasBox)
|
||||
while secondsToStart > 0 do
|
||||
secondsToStart = secondsToStart - 5
|
||||
if Config.Enable3DText then
|
||||
DrawText3D(boxCoords, secondsToStart/1000)
|
||||
end
|
||||
Citizen.Wait(0)
|
||||
end
|
||||
|
||||
for k, v in pairs(myFirework.particles) do
|
||||
reqParticle(v.name)
|
||||
end
|
||||
|
||||
while fireworkShoots ~= 0 do
|
||||
fireworkShoots = fireworkShoots - 1
|
||||
for k, v in pairs(myFirework.particles) do
|
||||
UseParticleFxAsset(v.name)
|
||||
local effect = StartNetworkedParticleFxNonLoopedAtCoord(
|
||||
v.effect,
|
||||
boxCoords.x + (v.randomizeXY == true and math.random(-10, 10) or 0.0),
|
||||
boxCoords.y + (v.randomizeXY == true and math.random(-10, 10) or 0.0),
|
||||
boxCoords.z + v.plusHeight,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
v.scale,
|
||||
false,
|
||||
false,
|
||||
false
|
||||
)
|
||||
if Config.Debug then
|
||||
print('[ Shoots left: '..fireworkShoots..' ]', "ID: "..k, v.name, v.effect)
|
||||
end
|
||||
Citizen.Wait(v.timeToNextShoot)
|
||||
end
|
||||
Citizen.Wait(myFirework.timeBetweenShoots or 300)
|
||||
end
|
||||
NetworkFadeOutEntity(hasBox, true, false)
|
||||
if Config.Debug then
|
||||
print('Prop is removed')
|
||||
end
|
||||
Citizen.Wait(5000)
|
||||
DeleteEntity(hasBox)
|
||||
hasBox = nil
|
||||
end
|
||||
end)
|
||||
|
||||
RegisterNetEvent('vms_firework:notification', function(message, time, type)
|
||||
Config.Notification(Config.Translate[message], time, type)
|
||||
end)
|
146
resources/[standalone]/vms_firework/config.lua
Normal file
146
resources/[standalone]/vms_firework/config.lua
Normal file
|
@ -0,0 +1,146 @@
|
|||
-- Hi, if you like the script, join the discord: https://discord.gg/k4YNwYxE4h
|
||||
|
||||
Config = {}
|
||||
|
||||
Config.Debug = false
|
||||
|
||||
Config.Core = "ESX" -- "ESX" / "QB-Core"
|
||||
|
||||
if Config.Core == "ESX" then
|
||||
ESX = exports['es_extended']:getSharedObject()
|
||||
elseif Config.Core == "QB-Core" then
|
||||
QBCore = exports['qb-core']:GetCoreObject()
|
||||
end
|
||||
|
||||
Config.Notification = function(message, time, type)
|
||||
if type == "success" then
|
||||
exports["vms_notify"]:Notification("FIREWORK", message, time, "#27FF09", "fa-solid fa-fire")
|
||||
-- TriggerEvent('esx:showNotification', message) --[ ESX ]
|
||||
-- TriggerEvent('QBCore:Notify', message, 'success', time) -- [ QB-Core ]
|
||||
|
||||
elseif type == "error" then
|
||||
exports["vms_notify"]:Notification("FIREWORK", message, time, "#FF0909", "fa-solid fa-fire")
|
||||
-- TriggerEvent('esx:showNotification', message) --[ ESX ]
|
||||
-- TriggerEvent('QBCore:Notify', message, 'error', time) -- [ QB-Core ]
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
Config.Translate = {
|
||||
['CANNOT_START'] = "You can't set off several fireworks at once, wait until the current one goes off", -- Only if: Config.DisableMultiplyFireworks = true
|
||||
['NEED_LIGHTER'] = "You need have lighter!", -- Only if: Config.NeedLighter = true
|
||||
['YOU_PLACE_FIREWORK'] = "You place the firework!",
|
||||
}
|
||||
|
||||
Config.Enable3DText = true -- 3DText on fireworks, shows the time to go off
|
||||
|
||||
Config.PlacingAnimation = {'anim@mp_fireworks', 'place_firework_3_box'} -- Animation of placing firework
|
||||
|
||||
Config.DisableMultiplyFireworks = false -- if you set it true, the player will be able to place one firework, the next one only after he finishes shooting
|
||||
|
||||
Config.NeedLighter = true
|
||||
Config.LighterItem = 'bread'
|
||||
|
||||
|
||||
Config.Fireworks = {
|
||||
[1] = {
|
||||
item = 'firework_1', -- name or nil
|
||||
itemRemovable = true, -- if it is on the item, is it to be removed after use
|
||||
command = 'fire_1', -- name of command or nil
|
||||
shoots = 50, -- count of shots
|
||||
prop = "ind_prop_firework_03",
|
||||
timeToStart = 5500, -- +/- 5000 == 5 seconds
|
||||
timeBetweenShoots = 1250,
|
||||
particles = {
|
||||
{name = "scr_indep_fireworks", effect = "scr_indep_firework_starburst", scale = 2.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 120},
|
||||
{name = "proj_indep_firework", effect = "scr_indep_firework_grd_burst", scale = 2.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 300},
|
||||
{name = "proj_indep_firework", effect = "scr_indep_firework_air_burst", scale = 2.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 600},
|
||||
},
|
||||
},
|
||||
[2] = {
|
||||
item = 'firework_2',
|
||||
itemRemovable = true,
|
||||
command = 'fire_2',
|
||||
shoots = 80,
|
||||
prop = "ind_prop_firework_03",
|
||||
timeToStart = 5500,
|
||||
timeBetweenShoots = 250,
|
||||
particles = {
|
||||
{name = "scr_indep_fireworks", effect = "scr_indep_firework_trailburst", scale = 2.0, plusHeight = 10.0, randomizeXY = true, timeToNextShoot = 125},
|
||||
{name = "proj_indep_firework_v2", effect = "scr_firework_indep_burst_rwb", scale = 1.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 125},
|
||||
{name = "proj_xmas_firework", effect = "scr_firework_xmas_ring_burst_rgw", scale = 1.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 125},
|
||||
},
|
||||
},
|
||||
[3] = {
|
||||
item = 'firework_3',
|
||||
itemRemovable = true,
|
||||
command = 'fire_3',
|
||||
shoots = 80,
|
||||
prop = "ind_prop_firework_03",
|
||||
timeToStart = 5500,
|
||||
timeBetweenShoots = 250,
|
||||
particles = {
|
||||
{name = "proj_indep_firework", effect = "scr_indep_firework_air_burst", scale = 1.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 125},
|
||||
{name = "proj_indep_firework_v2", effect = "scr_firework_indep_spiral_burst_rwb", scale = 1.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 125},
|
||||
{name = "proj_indep_firework_v2", effect = "scr_firework_indep_repeat_burst_rwb", scale = 1.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 125},
|
||||
{name = "scr_indep_fireworks", effect = "scr_indep_firework_starburst", scale = 1.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 125},
|
||||
},
|
||||
},
|
||||
[4] = {
|
||||
item = 'firework_4',
|
||||
itemRemovable = true,
|
||||
command = 'fire_4',
|
||||
shoots = 50,
|
||||
prop = "ind_prop_firework_03",
|
||||
timeToStart = 5000,
|
||||
timeBetweenShoots = 550,
|
||||
particles = {
|
||||
{name = "scr_indep_fireworks", effect = "scr_indep_firework_trailburst", scale = 4.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 10},
|
||||
},
|
||||
},
|
||||
[5] = {
|
||||
item = 'fontain_4',
|
||||
itemRemovable = true,
|
||||
command = 'fontain_4',
|
||||
shoots = 80,
|
||||
prop = "ind_prop_firework_04",
|
||||
timeToStart = 3500,
|
||||
timeBetweenShoots = 700,
|
||||
particles = {
|
||||
{name = "scr_indep_fireworks", effect = "scr_indep_firework_fountain", scale = 0.25, plusHeight = 0.25, randomizeXY = false, timeToNextShoot = 500},
|
||||
},
|
||||
},
|
||||
--[[
|
||||
[6] = {
|
||||
item = nil,
|
||||
itemRemovable = false,
|
||||
command = '',
|
||||
shoots = 1,
|
||||
prop = "ind_prop_firework_04",
|
||||
timeToStart = 1000,
|
||||
timeBetweenShoots = 100,
|
||||
particles = {
|
||||
-- {name = "proj_indep_firework", effect = "scr_indep_firework_grd_burst", scale = 2.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 600},
|
||||
-- {name = "proj_indep_firework", effect = "scr_indep_firework_air_burst", scale = 2.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 600},
|
||||
|
||||
-- {name = "proj_indep_firework_v2", effect = "scr_firework_indep_burst_rwb", scale = 1.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 2025},
|
||||
-- {name = "proj_indep_firework_v2", effect = "scr_firework_indep_spiral_burst_rwb", scale = 1.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 2025},
|
||||
-- {name = "proj_indep_firework_v2", effect = "scr_firework_indep_ring_burst_rwb", scale = 1.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 2025},
|
||||
-- {name = "proj_indep_firework_v2", effect = "scr_xmas_firework_burst_fizzle", scale = 1.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 2025},
|
||||
-- {name = "proj_indep_firework_v2", effect = "scr_firework_indep_repeat_burst_rwb", scale = 1.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 2025},
|
||||
|
||||
-- {name = "proj_xmas_firework", effect = "scr_firework_xmas_ring_burst_rgw", scale = 1.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 2025},
|
||||
-- {name = "proj_xmas_firework", effect = "scr_firework_xmas_burst_rgw", scale = 1.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 2025},
|
||||
-- {name = "proj_xmas_firework", effect = "scr_firework_xmas_repeat_burst_rgw", scale = 1.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 2025},
|
||||
-- {name = "proj_xmas_firework", effect = "scr_firework_xmas_spiral_burst_rgw", scale = 1.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 2025},
|
||||
|
||||
-- {name = "scr_indep_fireworks", effect = "scr_indep_firework_starburst", scale = 1.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 2025},
|
||||
-- {name = "scr_indep_fireworks", effect = "scr_indep_firework_shotburst", scale = 1.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 2025},
|
||||
-- {name = "scr_indep_fireworks", effect = "scr_indep_firework_trailburst", scale = 1.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 2025},
|
||||
-- {name = "scr_indep_fireworks", effect = "scr_indep_firework_trailburst_spawn", scale = 1.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 2025},
|
||||
-- {name = "scr_indep_fireworks", effect = "scr_indep_firework_burst_spawn", scale = 1.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 2025},
|
||||
-- {name = "scr_indep_fireworks", effect = "scr_indep_firework_fountain", scale = 1.0, plusHeight = 50.0, randomizeXY = true, timeToNextShoot = 2025},
|
||||
},
|
||||
}
|
||||
]]
|
||||
}
|
17
resources/[standalone]/vms_firework/fxmanifest.lua
Normal file
17
resources/[standalone]/vms_firework/fxmanifest.lua
Normal file
|
@ -0,0 +1,17 @@
|
|||
fx_version 'cerulean'
|
||||
game 'gta5'
|
||||
lua54 'yes'
|
||||
|
||||
author 'vames™️'
|
||||
description 'vms_firework'
|
||||
version '1.0.0'
|
||||
|
||||
shared_script 'config.lua'
|
||||
|
||||
client_scripts {
|
||||
'client.lua'
|
||||
}
|
||||
|
||||
server_scripts {
|
||||
'server.lua'
|
||||
}
|
37
resources/[standalone]/vms_firework/server.lua
Normal file
37
resources/[standalone]/vms_firework/server.lua
Normal file
|
@ -0,0 +1,37 @@
|
|||
if Config.Core == "ESX" then
|
||||
for k, v in pairs(Config.Fireworks) do
|
||||
if v.item then
|
||||
ESX.RegisterUsableItem(v.item, function(source)
|
||||
local xPlayer = ESX.GetPlayerFromId(source)
|
||||
if Config.NeedLighter then
|
||||
local isHaveLighter = xPlayer.getInventoryItem(Config.LighterItem).count
|
||||
if isHaveLighter == 0 then
|
||||
return TriggerClientEvent('vms_firework:notification', source, 'NEED_LIGHTER', 5000, 'error')
|
||||
end
|
||||
end
|
||||
if v.itemRemovable then
|
||||
xPlayer.removeInventoryItem(v.item, 1)
|
||||
end
|
||||
TriggerClientEvent('vms_firework:startFirework', source, k)
|
||||
end)
|
||||
end
|
||||
end
|
||||
elseif Config.Core == "QB-Core" then
|
||||
for k, v in pairs(Config.Fireworks) do
|
||||
if v.item then
|
||||
QBCore.Functions.CreateUseableItem(v.item, function(source, item)
|
||||
local Player = QBCore.Functions.GetPlayer(source)
|
||||
if Config.NeedLighter then
|
||||
local isHaveLighter = Player.Functions.GetItemByName(Config.LighterItem)
|
||||
if isHaveLighter == nil or isHaveLighter.amount == 0 then
|
||||
return TriggerClientEvent('vms_firework:notification', source, 'NEED_LIGHTER', 5000, 'error')
|
||||
end
|
||||
end
|
||||
if v.itemRemovable then
|
||||
Player.Functions.RemoveItem(v.item, 1, false)
|
||||
end
|
||||
TriggerClientEvent('vms_firework:startFirework', source, k)
|
||||
end)
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue