--================================-- -- FIRE SCRIPT v1.7.4 -- -- by GIMI (+ foregz, Albo1125) -- -- License: GNU GPL 3.0 -- --================================-- local syncInProgress = false --================================-- -- CHAT -- --================================-- TriggerEvent("chat:addTemplate", "firescript", '
{0} {1}
') TriggerEvent('chat:addSuggestion', '/startfire', 'Creates a fire', { { name = "spread", help = "How many times can the fire spread?" }, { name = "chance", help = "0 - 100; How quickly the fire spreads?" }, { name = "dispatch", help = "true or false (default false)" } }) TriggerEvent('chat:addSuggestion', '/stopfire', 'Stops the fire', { { name = "index", help = "The fire's index" } }) TriggerEvent('chat:addSuggestion', '/stopallfires', 'Stops all fires') TriggerEvent('chat:addSuggestion', '/registerscenario', 'Registers a new fire configuration') TriggerEvent('chat:addSuggestion', '/addflame', 'Adds a flame to a scenario', { { name = "scenarioID", help = "The scenario" }, { name = "spread", help = "How many times can the flame spread?" }, { name = "chance", help = "How many out of 100 chances should the fire spread? (0-100)" } }) TriggerEvent('chat:addSuggestion', '/removeflame', 'Removes a flame from a scenario', { { name = "scenarioID", help = "The fire ID" }, { name = "flameID", help = "The flame ID" } }) TriggerEvent('chat:addSuggestion', '/removescenario', 'Removes a scenario', { { name = "scenarioID", help = "The fire ID" } }) TriggerEvent('chat:addSuggestion', '/startscenario', 'Starts a scenario', { { name = "scenarioID", help = "The fire ID" }, { name = "triggerDispatch", help = "true / false - should the script trigger dispatch after spawning the fire? (default false)" } }) TriggerEvent('chat:addSuggestion', '/stopscenario', 'Stops a scenario', { { name = "scenarioID", help = "The fire ID" } }) TriggerEvent('chat:addSuggestion', '/firewl', 'Manages the fire script whitelist', { { name = "action", help = "add / remove" }, { name = "playerID", help = "The player's server ID" } }) TriggerEvent('chat:addSuggestion', '/firewlreload', 'Reloads the whitelist from the config') TriggerEvent('chat:addSuggestion', '/firedispatch', 'Manages the fire script dispatch subscribers', { { name = "action", help = "add / remove" }, { name = "playerID", help = "The player's server ID" } }) TriggerEvent('chat:addSuggestion', '/remindme', 'Sets the GPS waypoint to the specified dispatch call.', { { name = "dispatchID", help = "The dispatch identifier (number)" } }) TriggerEvent('chat:addSuggestion', '/cleardispatch', 'Clears navigation to the last dispatch call.', { { name = "dispatchID", help = "(optional) The dispatch identifier, if filled in, the call's blip will be removed." } }) TriggerEvent('chat:addSuggestion', '/randomfires', 'Manages the random fire spawner', { { name = "action", help = "add / remove / enable / disable" }, { name = "p2", help = "(optional) For add / remove action, fill in the scenario ID." } }) --================================-- -- SYNC ON CONNECT -- --================================-- RegisterNetEvent('playerSpawned') AddEventHandler( 'playerSpawned', function() print("Requested synchronization..") TriggerServerEvent('fireManager:requestSync') end ) RegisterNetEvent('onClientResourceStart') AddEventHandler( 'onClientResourceStart', function(resourceName) if resourceName == GetCurrentResourceName() then -- Check the command whitelist TriggerServerEvent('fireManager:checkWhitelist') end end ) --================================-- -- COMMANDS -- --================================-- RegisterCommand( 'remindme', function(source, args, rawCommand) local dispatchNumber = tonumber(args[1]) if not dispatchNumber then sendMessage("Invalid argument.") return end local success = Dispatch:remind(dispatchNumber) if not success then sendMessage("Couldn't find the specified dispatch.") return end end, false ) RegisterCommand( 'cleardispatch', function(source, args, rawCommand) Dispatch:clear(tonumber(args[1])) end, false ) RegisterCommand( 'startfire', function(source, args, rawCommand) local maxSpread = tonumber(args[1]) local probability = tonumber(args[2]) local triggerDispatch = args[3] == "true" TriggerServerEvent('fireManager:command:startfire', GetEntityCoords(GetPlayerPed(-1)), maxSpread, probability, triggerDispatch) end, false ) RegisterCommand( 'registerscenario', function(source, args, rawCommand) local coords = nil local x = tonumber(args[1]) local y = tonumber(args[2]) local z = tonumber(args[3]) if x and y and z then coords = vector3(x, y, z) end TriggerServerEvent('fireManager:command:registerscenario', coords or GetEntityCoords(GetPlayerPed(-1))) end, false ) RegisterCommand( 'addflame', function(source, args, rawCommand) local registeredFireID = tonumber(args[1]) local spread = tonumber(args[2]) local chance = tonumber(args[3]) local coords = nil local x = tonumber(args[4]) local y = tonumber(args[5]) local z = tonumber(args[6]) if x and y and z then coords = vector3(x, y, z) end if registeredFireID and spread and chance then TriggerServerEvent('fireManager:command:addflame', registeredFireID, coords or GetEntityCoords(GetPlayerPed(-1)), spread, chance) end end, false ) -- Aliases RegisterCommand( 'registerfire', function(source, args, rawCommand) ExecuteCommand("registerscenario" .. rawCommand:sub(13)) end, false ) RegisterCommand( 'removeregisteredfire', function(source, args, rawCommand) ExecuteCommand("removescenario" .. rawCommand:sub(21)) end, false ) RegisterCommand( 'startregisteredfire', function(source, args, rawCommand) ExecuteCommand("startscenario" .. rawCommand:sub(20)) end, false ) RegisterCommand( 'stopregisteredfire', function(source, args, rawCommand) ExecuteCommand("stopscenario" .. rawCommand:sub(19)) end, false ) --================================-- -- EVENTS -- --================================-- RegisterNetEvent('fireClient:synchronizeFlames') AddEventHandler( 'fireClient:synchronizeFlames', function(fires) syncInProgress = true Fire:removeAll( function() for k, v in pairs(fires) do for _k, _v in ipairs(v) do Fire:createFlame(k, _k, _v) end end syncInProgress = false end ) end ) RegisterNetEvent('fireClient:removeFire') AddEventHandler( 'fireClient:removeFire', function(fireIndex) while syncInProgress do Citizen.Wait(10) end Fire:remove(fireIndex) end ) RegisterNetEvent('fireClient:removeAllFires') AddEventHandler( 'fireClient:removeAllFires', function() while syncInProgress do Citizen.Wait(10) end Fire:removeAll() end ) RegisterNetEvent("fireClient:removeFlame") AddEventHandler( "fireClient:removeFlame", function(fireIndex, flameIndex) while syncInProgress do Citizen.Wait(10) end Fire:removeFlame(fireIndex, flameIndex) end ) RegisterNetEvent("fireClient:createFlame") AddEventHandler( "fireClient:createFlame", function(fireIndex, flameIndex, coords) syncInProgress = true Fire:createFlame(fireIndex, flameIndex, coords) syncInProgress = false end ) -- Dispatch if Config.Dispatch.enabled == true then RegisterNetEvent('fd:dispatch') AddEventHandler( 'fd:dispatch', function(coords) local streetName, crossingRoad = GetStreetNameAtCoord(coords.x, coords.y, coords.z) local streetName = GetStreetNameFromHashKey(streetName) local text = ("A fire broke out at %s."):format((crossingRoad > 0) and streetName .. " / " .. GetStreetNameFromHashKey(crossingRoad) or streetName) TriggerServerEvent('fireDispatch:create', text, coords) end ) end RegisterNetEvent('fireClient:createDispatch') AddEventHandler( 'fireClient:createDispatch', function(dispatchNumber, coords) Dispatch:create(dispatchNumber, coords) end )