Initial commit
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
--================================--
|
||||
-- FIRE SCRIPT v1.7.2 --
|
||||
-- by GIMI (+ foregz, Albo1125) --
|
||||
-- License: GNU GPL 3.0 --
|
||||
--================================--
|
||||
|
||||
Dispatch = {
|
||||
_players = {},
|
||||
_firefighters = {},
|
||||
lastNumber = 0,
|
||||
expectingInfo = {},
|
||||
__index = self,
|
||||
init = function(object)
|
||||
object = object or {_players = {}, _firefighters = {}, lastNumber = 0, expectingInfo = {}}
|
||||
setmetatable(object, self)
|
||||
return object
|
||||
end
|
||||
}
|
||||
|
||||
function Dispatch:create(text, coords)
|
||||
text = tostring(text)
|
||||
|
||||
if not (text and coords) then
|
||||
return
|
||||
end
|
||||
|
||||
self.lastNumber = self.lastNumber + 1
|
||||
|
||||
for k, v in pairs(self._players) do
|
||||
sendMessage(k, text, ("Dispatch (#%s)"):format(self.lastNumber))
|
||||
TriggerClientEvent('fireClient:createDispatch', k, self.lastNumber, coords)
|
||||
end
|
||||
end
|
||||
|
||||
function Dispatch:subscribe(serverId, isFirefighter)
|
||||
serverId = tonumber(serverId)
|
||||
self._players[serverId] = true
|
||||
if isFirefighter then
|
||||
self:addFirefighter(serverId)
|
||||
end
|
||||
end
|
||||
|
||||
function Dispatch:unsubscribe(serverId)
|
||||
serverId = tonumber(serverId)
|
||||
self._players[serverId] = nil
|
||||
self:removeFirefighter(serverId)
|
||||
end
|
||||
|
||||
function Dispatch:addFirefighter(serverId)
|
||||
serverId = tonumber(serverId)
|
||||
self._firefighters[serverId] = true
|
||||
end
|
||||
|
||||
function Dispatch:removeFirefighter(serverId)
|
||||
serverId = tonumber(serverId)
|
||||
self._firefighters[serverId] = nil
|
||||
end
|
||||
|
||||
function Dispatch:firefighters()
|
||||
return table.length(self._firefighters)
|
||||
end
|
||||
|
||||
function Dispatch:players()
|
||||
return table.length(self._players)
|
||||
end
|
||||
|
||||
function Dispatch:getRandomPlayer()
|
||||
if not next(self._players) then
|
||||
return false
|
||||
end
|
||||
return table.random(self._players)
|
||||
end
|
||||
@@ -0,0 +1,337 @@
|
||||
--================================--
|
||||
-- FIRE SCRIPT v1.7.3 --
|
||||
-- by GIMI (+ foregz, Albo1125) --
|
||||
-- License: GNU GPL 3.0 --
|
||||
--================================--
|
||||
|
||||
Fire = {
|
||||
registered = {},
|
||||
random = {},
|
||||
active = {},
|
||||
binds = {},
|
||||
activeBinds = {},
|
||||
__index = self,
|
||||
init = function(o)
|
||||
o = o or {registered = {}, random = {}, active = {}, binds = {}, activeBinds = {}}
|
||||
setmetatable(o, self)
|
||||
self.__index = self
|
||||
return o
|
||||
end
|
||||
}
|
||||
|
||||
function Fire:create(coords, maximumSpread, spreadChance)
|
||||
maximumSpread = maximumSpread and maximumSpread or Config.Fire.maximumSpreads
|
||||
spreadChance = spreadChance and spreadChance or Config.Fire.fireSpreadChance
|
||||
|
||||
local fireIndex = highestIndex(self.active)
|
||||
fireIndex = fireIndex + 1
|
||||
|
||||
self.active[fireIndex] = {
|
||||
maxSpread = maxSpread,
|
||||
spreadChance = spreadChance
|
||||
}
|
||||
|
||||
self:createFlame(fireIndex, coords)
|
||||
|
||||
local spread = true
|
||||
|
||||
-- Spreading
|
||||
Citizen.CreateThread(
|
||||
function()
|
||||
while spread do
|
||||
Citizen.Wait(2000)
|
||||
local index, flames = highestIndex(self.active, fireIndex)
|
||||
if flames ~= 0 and flames <= maximumSpread then
|
||||
for k, v in ipairs(self.active[fireIndex]) do
|
||||
index, flames = highestIndex(self.active, fireIndex)
|
||||
local rndSpread = math.random(100)
|
||||
if count ~= 0 and flames <= maximumSpread and rndSpread <= spreadChance then
|
||||
local x = self.active[fireIndex][k].x
|
||||
local y = self.active[fireIndex][k].y
|
||||
local z = self.active[fireIndex][k].z
|
||||
|
||||
local xSpread = math.random(-3, 3)
|
||||
local ySpread = math.random(-3, 3)
|
||||
|
||||
coords = vector3(x + xSpread, y + ySpread, z)
|
||||
|
||||
self:createFlame(fireIndex, coords)
|
||||
end
|
||||
end
|
||||
elseif flames == 0 then
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
self.active[fireIndex].stopSpread = function()
|
||||
spread = false
|
||||
end
|
||||
|
||||
return fireIndex
|
||||
end
|
||||
|
||||
function Fire:createFlame(fireIndex, coords)
|
||||
local flameIndex = highestIndex(self.active, fireIndex) + 1
|
||||
self.active[fireIndex][flameIndex] = coords
|
||||
TriggerClientEvent('fireClient:createFlame', -1, fireIndex, flameIndex, coords)
|
||||
end
|
||||
|
||||
function Fire:remove(fireIndex)
|
||||
if not (self.active[fireIndex] and next(self.active[fireIndex])) then
|
||||
return false
|
||||
end
|
||||
|
||||
self.active[fireIndex].stopSpread()
|
||||
TriggerClientEvent('fireClient:removeFire', -1, fireIndex)
|
||||
|
||||
if self.activeBinds[fireIndex] then
|
||||
self.binds[self.activeBinds[fireIndex]][fireIndex] = nil
|
||||
|
||||
if self.activeBinds[fireIndex] == self.currentRandom and next(self.binds[self.activeBinds[fireIndex]]) == nil then
|
||||
self.currentRandom = nil
|
||||
end
|
||||
end
|
||||
|
||||
self.active[fireIndex] = {}
|
||||
return true
|
||||
end
|
||||
|
||||
function Fire:removeFlame(fireIndex, flameIndex)
|
||||
if self.active[fireIndex] and self.active[fireIndex][flameIndex] then
|
||||
self.active[fireIndex][flameIndex] = nil
|
||||
if type(next(self.active[fireIndex])) == "string" and self.activeBinds[fireIndex] then
|
||||
self.binds[self.activeBinds[fireIndex]][fireIndex] = nil
|
||||
|
||||
if self.activeBinds[fireIndex] == self.currentRandom and next(self.binds[self.activeBinds[fireIndex]]) == nil then
|
||||
self.currentRandom = nil
|
||||
end
|
||||
|
||||
self.activeBinds[fireIndex] = nil
|
||||
end
|
||||
end
|
||||
TriggerClientEvent('fireClient:removeFlame', -1, fireIndex, flameIndex)
|
||||
end
|
||||
|
||||
function Fire:removeAll()
|
||||
TriggerClientEvent('fireClient:removeAllFires', -1)
|
||||
for k, v in pairs(self.active) do
|
||||
if v.stopSpread then
|
||||
v.stopSpread()
|
||||
end
|
||||
end
|
||||
self.active = {}
|
||||
self.binds = {}
|
||||
self.currentRandom = nil
|
||||
end
|
||||
|
||||
function Fire:register(coords)
|
||||
local registeredFireID = highestIndex(self.registered) + 1
|
||||
|
||||
self.registered[registeredFireID] = {
|
||||
flames = {}
|
||||
}
|
||||
|
||||
if coords then
|
||||
self.registered[registeredFireID].dispatchCoords = coords
|
||||
end
|
||||
|
||||
self:saveRegistered()
|
||||
|
||||
return registeredFireID
|
||||
end
|
||||
|
||||
function Fire:startRegistered(registeredFireID, triggerDispatch, dispatchPlayer)
|
||||
if not self.registered[registeredFireID] then
|
||||
return false
|
||||
end
|
||||
|
||||
if not self.binds[registeredFireID] then
|
||||
self.binds[registeredFireID] = {}
|
||||
end
|
||||
|
||||
for k, v in pairs(self.registered[registeredFireID].flames) do
|
||||
local fireID = Fire:create(v.coords, v.spread, v.chance)
|
||||
self.binds[registeredFireID][fireID] = true
|
||||
self.activeBinds[fireID] = registeredFireID
|
||||
Citizen.Wait(10)
|
||||
end
|
||||
|
||||
if self.registered[registeredFireID].dispatchCoords and triggerDispatch and dispatchPlayer then
|
||||
local dispatchCoords = self.registered[registeredFireID].dispatchCoords
|
||||
Citizen.SetTimeout(
|
||||
Config.Dispatch.timeout,
|
||||
function()
|
||||
if Config.Dispatch.enabled then
|
||||
Dispatch.expectingInfo[dispatchPlayer] = true
|
||||
end
|
||||
TriggerClientEvent('fd:dispatch', dispatchPlayer, dispatchCoords)
|
||||
end
|
||||
)
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function Fire:stopRegistered(registeredFireID)
|
||||
if not self.binds[registeredFireID] then
|
||||
return false
|
||||
end
|
||||
|
||||
for k, v in pairs(self.binds[registeredFireID]) do
|
||||
self.activeBinds[k] = nil
|
||||
Fire:remove(k)
|
||||
Citizen.Wait(10)
|
||||
end
|
||||
|
||||
self.binds[registeredFireID] = nil
|
||||
|
||||
if self.currentRandom and self.currentRandom == registeredFireID then
|
||||
self.currentRandom = nil
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function Fire:deleteRegistered(registeredFireID)
|
||||
if not self.registered[registeredFireID] then
|
||||
return false
|
||||
end
|
||||
|
||||
if self.registered[registeredFireID].random then
|
||||
self:setRandom(registeredFireID, false)
|
||||
end
|
||||
|
||||
self.registered[registeredFireID] = nil
|
||||
|
||||
self:saveRegistered()
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function Fire:addFlame(registeredFireID, coords, spread, chance)
|
||||
if not (registeredFireID and coords and spread and chance and self.registered[registeredFireID]) then
|
||||
return false
|
||||
end
|
||||
|
||||
local flameID = highestIndex(self.registered[registeredFireID].flames) + 1
|
||||
|
||||
self.registered[registeredFireID].flames[flameID] = {}
|
||||
self.registered[registeredFireID].flames[flameID].coords = coords
|
||||
self.registered[registeredFireID].flames[flameID].spread = spread
|
||||
self.registered[registeredFireID].flames[flameID].chance = chance
|
||||
|
||||
self:saveRegistered()
|
||||
|
||||
return flameID
|
||||
end
|
||||
|
||||
function Fire:deleteFlame(registeredFireID, flameID)
|
||||
if not (self.registered[registeredFireID] and self.registered[registeredFireID].flames[flameID]) then
|
||||
return false
|
||||
end
|
||||
|
||||
table.remove(self.registered[registeredFireID].flames, flameID)
|
||||
|
||||
self:saveRegistered()
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function Fire:setRandom(registeredFireID, random)
|
||||
random = random or nil
|
||||
registeredFireID = tonumber(registeredFireID)
|
||||
|
||||
if not registeredFireID or not self.registered[registeredFireID] then
|
||||
return false
|
||||
end
|
||||
|
||||
self.registered[registeredFireID].random = random
|
||||
self.random[registeredFireID] = random
|
||||
|
||||
self:saveRegistered()
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function Fire:startSpawner(frequency, chance)
|
||||
frequency = tonumber(frequency) or Config.Fire.spawner.interval
|
||||
chance = tonumber(chance) or Config.Fire.spawner.chance
|
||||
|
||||
if self._stopSpawner or not self.random or not frequency then
|
||||
return false
|
||||
end
|
||||
|
||||
local spawnerActive = true
|
||||
|
||||
self._stopSpawner = function()
|
||||
spawnerActive = nil
|
||||
end
|
||||
|
||||
Citizen.CreateThread(
|
||||
function()
|
||||
while spawnerActive do
|
||||
if next(self.random) and not self.currentRandom and Dispatch:firefighters() >= Config.Fire.spawner.players then
|
||||
if math.random(100) < chance then
|
||||
local randomRegisteredFireID = table.random(self.random)
|
||||
local randomPlayer = Dispatch:getRandomPlayer()
|
||||
|
||||
if randomRegisteredFireID and randomPlayer then
|
||||
if self:startRegistered(randomRegisteredFireID, true, randomPlayer) then
|
||||
self.currentRandom = randomRegisteredFireID
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Citizen.Wait(frequency)
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function Fire:stopSpawner()
|
||||
if self._stopSpawner then
|
||||
self._stopSpawner()
|
||||
self._stopSpawner = nil
|
||||
end
|
||||
end
|
||||
|
||||
-- Saving registered fires
|
||||
|
||||
function Fire:saveRegistered()
|
||||
saveData(self.registered, "fires")
|
||||
end
|
||||
|
||||
function Fire:loadRegistered()
|
||||
local firesFile = loadData("fires")
|
||||
if firesFile ~= nil then
|
||||
for index, fire in pairs(firesFile) do
|
||||
for _, flame in pairs(fire.flames) do
|
||||
flame.coords = vector3(flame.coords.x, flame.coords.y, flame.coords.z)
|
||||
end
|
||||
if fire.dispatchCoords then
|
||||
fire.dispatchCoords = vector3(fire.dispatchCoords.x, fire.dispatchCoords.y, fire.dispatchCoords.z)
|
||||
end
|
||||
end
|
||||
self.registered = firesFile
|
||||
self:updateRandom()
|
||||
else
|
||||
saveData({}, "fires")
|
||||
end
|
||||
end
|
||||
|
||||
function Fire:updateRandom() -- Creates a table containing all fires with random flag enabled
|
||||
self.random = {}
|
||||
if not (self.registered and next(self.registered) ~= nil) then
|
||||
return
|
||||
end
|
||||
for k, v in pairs(self.registered) do
|
||||
if v.random == true then
|
||||
self.random[k] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,580 @@
|
||||
--================================--
|
||||
-- FIRE SCRIPT v1.7.4 --
|
||||
-- by GIMI (+ foregz, Albo1125) --
|
||||
-- License: GNU GPL 3.0 --
|
||||
--================================--
|
||||
|
||||
--================================--
|
||||
-- VERSION CHECK --
|
||||
--================================--
|
||||
|
||||
Version = "1.7.4"
|
||||
LatestVersionFeed = "https://api.github.com/repos/gimicze/firescript/releases/latest"
|
||||
|
||||
Citizen.CreateThread(
|
||||
checkVersion
|
||||
)
|
||||
|
||||
--================================--
|
||||
-- INITIALIZE --
|
||||
--================================--
|
||||
|
||||
function onResourceStart(resourceName)
|
||||
if (GetCurrentResourceName() == resourceName) then
|
||||
Whitelist:load()
|
||||
Fire:loadRegistered()
|
||||
if Config.Fire.spawner.enableOnStartup and Config.Fire.spawner.interval then
|
||||
if not Fire:startSpawner() then
|
||||
sendMessage(0, "Couldn't start fire spawner.")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
RegisterNetEvent('onResourceStart')
|
||||
AddEventHandler(
|
||||
'onResourceStart',
|
||||
onResourceStart
|
||||
)
|
||||
|
||||
--================================--
|
||||
-- CLEAN-UP --
|
||||
--================================--
|
||||
|
||||
function onPlayerDropped()
|
||||
Whitelist:removePlayer(source)
|
||||
Dispatch:unsubscribe(source)
|
||||
end
|
||||
|
||||
RegisterNetEvent('playerDropped')
|
||||
AddEventHandler(
|
||||
'playerDropped',
|
||||
onPlayerDropped
|
||||
)
|
||||
|
||||
--================================--
|
||||
-- COMMANDS --
|
||||
--================================--
|
||||
|
||||
RegisterNetEvent('fireManager:command:startfire')
|
||||
AddEventHandler(
|
||||
'fireManager:command:startfire',
|
||||
function(coords, maxSpread, chance, triggerDispatch)
|
||||
if not Whitelist:isWhitelisted(source, "firescript.start") then
|
||||
sendMessage(source, "Insufficient permissions.")
|
||||
return
|
||||
end
|
||||
|
||||
local _source = source
|
||||
|
||||
local maxSpread = (maxSpread ~= nil and tonumber(maxSpread) ~= nil) and tonumber(maxSpread) or Config.Fire.maximumSpreads
|
||||
local chance = (chance ~= nil and tonumber(chance) ~= nil) and tonumber(chance) or Config.Fire.fireSpreadChance
|
||||
|
||||
local fireIndex = Fire:create(coords, maxSpread, chance)
|
||||
|
||||
sendMessage(source, "Spawned fire #" .. fireIndex)
|
||||
|
||||
if triggerDispatch then
|
||||
Citizen.SetTimeout(
|
||||
Config.Dispatch.timeout,
|
||||
function()
|
||||
if Config.Dispatch.enabled and not Config.Dispatch.disableCalls then
|
||||
Dispatch.expectingInfo[_source] = true
|
||||
end
|
||||
TriggerClientEvent('fd:dispatch', _source, coords)
|
||||
end
|
||||
)
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
RegisterNetEvent('fireManager:command:registerscenario')
|
||||
AddEventHandler(
|
||||
'fireManager:command:registerscenario',
|
||||
function(coords)
|
||||
if not Whitelist:isWhitelisted(source, "firescript.manage") then
|
||||
sendMessage(source, "Insufficient permissions.")
|
||||
return
|
||||
end
|
||||
|
||||
local registeredFireID = Fire:register(coords)
|
||||
|
||||
sendMessage(source, "Created scenario #" .. registeredFireID)
|
||||
end
|
||||
)
|
||||
|
||||
RegisterNetEvent('fireManager:command:addflame')
|
||||
AddEventHandler(
|
||||
'fireManager:command:addflame',
|
||||
function(registeredFireID, coords, spread, chance)
|
||||
if not Whitelist:isWhitelisted(source, "firescript.manage") then
|
||||
sendMessage(source, "Insufficient permissions.")
|
||||
return
|
||||
end
|
||||
|
||||
local registeredFireID = tonumber(registeredFireID)
|
||||
local spread = tonumber(spread)
|
||||
local chance = tonumber(chance)
|
||||
|
||||
if not (coords and registeredFireID and spread and chance) then
|
||||
return
|
||||
end
|
||||
|
||||
local flameID = Fire:addFlame(registeredFireID, coords, spread, chance)
|
||||
|
||||
if not flameID then
|
||||
sendMessage(source, "No such scenario.")
|
||||
return
|
||||
end
|
||||
|
||||
sendMessage(source, "Added flame #" .. flameID)
|
||||
end
|
||||
)
|
||||
|
||||
RegisterCommand(
|
||||
'stopfire',
|
||||
function(source, args, rawCommand)
|
||||
if not Whitelist:isWhitelisted(source, "firescript.stop") then
|
||||
sendMessage(source, "Insufficient permissions.")
|
||||
return
|
||||
end
|
||||
|
||||
local fireIndex = tonumber(args[1])
|
||||
|
||||
if not fireIndex then
|
||||
return
|
||||
end
|
||||
|
||||
if Fire:remove(fireIndex) then
|
||||
sendMessage(source, "Stopping fire #" .. fireIndex)
|
||||
TriggerClientEvent("pNotify:SendNotification", source, {
|
||||
text = "Fire " .. fireIndex .. " going out...",
|
||||
type = "info",
|
||||
timeout = 5000,
|
||||
layout = "centerRight",
|
||||
queue = "fire"
|
||||
})
|
||||
end
|
||||
end,
|
||||
false
|
||||
)
|
||||
|
||||
RegisterCommand(
|
||||
'stopallfires',
|
||||
function(source, args, rawCommand)
|
||||
if not Whitelist:isWhitelisted(source, "firescript.stop") then
|
||||
sendMessage(source, "Insufficient permissions.")
|
||||
return
|
||||
end
|
||||
|
||||
Fire:removeAll()
|
||||
|
||||
sendMessage(source, "Stopping fires")
|
||||
TriggerClientEvent("pNotify:SendNotification", source, {
|
||||
text = "Fires going out...",
|
||||
type = "info",
|
||||
timeout = 5000,
|
||||
layout = "centerRight",
|
||||
queue = "fire"
|
||||
})
|
||||
end,
|
||||
false
|
||||
)
|
||||
|
||||
RegisterCommand(
|
||||
'removeflame',
|
||||
function(source, args, rawCommand)
|
||||
if not Whitelist:isWhitelisted(source, "firescript.manage") then
|
||||
sendMessage(source, "Insufficient permissions.")
|
||||
return
|
||||
end
|
||||
|
||||
local registeredFireID = tonumber(args[1])
|
||||
local flameID = tonumber(args[2])
|
||||
|
||||
if not (registeredFireID and flameID) then
|
||||
return
|
||||
end
|
||||
|
||||
local success = Fire:deleteFlame(registeredFireID, flameID)
|
||||
|
||||
if not success then
|
||||
sendMessage(source, "No such fire or flame registered.")
|
||||
return
|
||||
end
|
||||
|
||||
sendMessage(source, "Removed flame #" .. flameID)
|
||||
end,
|
||||
false
|
||||
)
|
||||
|
||||
RegisterCommand(
|
||||
'removescenario',
|
||||
function(source, args, rawCommand)
|
||||
if not Whitelist:isWhitelisted(source, "firescript.manage") then
|
||||
sendMessage(source, "Insufficient permissions.")
|
||||
return
|
||||
end
|
||||
local registeredFireID = tonumber(args[1])
|
||||
if not registeredFireID then
|
||||
return
|
||||
end
|
||||
|
||||
local success = Fire:deleteRegistered(registeredFireID)
|
||||
|
||||
if not success then
|
||||
sendMessage(source, "No such scenario.")
|
||||
return
|
||||
end
|
||||
|
||||
sendMessage(source, "Removed scenario #" .. registeredFireID)
|
||||
end,
|
||||
false
|
||||
)
|
||||
|
||||
RegisterCommand(
|
||||
'startscenario',
|
||||
function(source, args, rawCommand)
|
||||
if not Whitelist:isWhitelisted(source, "firescript.start") then
|
||||
sendMessage(source, "Insufficient permissions.")
|
||||
return
|
||||
end
|
||||
local _source = source
|
||||
local registeredFireID = tonumber(args[1])
|
||||
local triggerDispatch = args[2] == "true"
|
||||
|
||||
if not registeredFireID then
|
||||
return
|
||||
end
|
||||
|
||||
local success = Fire:startRegistered(registeredFireID, triggerDispatch, source)
|
||||
|
||||
if not success then
|
||||
sendMessage(source, "No such scenario.")
|
||||
return
|
||||
end
|
||||
|
||||
sendMessage(source, "Started scenario #" .. registeredFireID)
|
||||
end,
|
||||
false
|
||||
)
|
||||
|
||||
RegisterCommand(
|
||||
'stopscenario',
|
||||
function(source, args, rawCommand)
|
||||
if not Whitelist:isWhitelisted(source, "firescript.stop") then
|
||||
sendMessage(source, "Insufficient permissions.")
|
||||
return
|
||||
end
|
||||
local _source = source
|
||||
local registeredFireID = tonumber(args[1])
|
||||
|
||||
if not registeredFireID then
|
||||
return
|
||||
end
|
||||
|
||||
local success = Fire:stopRegistered(registeredFireID)
|
||||
|
||||
if not success then
|
||||
sendMessage(source, "No such scenario active.")
|
||||
return
|
||||
end
|
||||
|
||||
sendMessage(source, "Stopping scenario #" .. registeredFireID)
|
||||
|
||||
TriggerClientEvent("pNotify:SendNotification", source, {
|
||||
text = "Fire going out...",
|
||||
type = "info",
|
||||
timeout = 5000,
|
||||
layout = "centerRight",
|
||||
queue = "fire"
|
||||
})
|
||||
end,
|
||||
false
|
||||
)
|
||||
|
||||
RegisterCommand(
|
||||
'firewl',
|
||||
function(source, args, rawCommand)
|
||||
local _source = source
|
||||
local action = args[1]
|
||||
local serverId = tonumber(args[2])
|
||||
|
||||
if not (action and serverId) or serverId < 1 then
|
||||
return
|
||||
end
|
||||
|
||||
local identifier = GetPlayerIdentifier(serverId, 0)
|
||||
|
||||
if not identifier then
|
||||
sendMessage(source, "Player not online.")
|
||||
return
|
||||
end
|
||||
|
||||
if action == "add" then
|
||||
Whitelist:addPlayer(serverId, identifier)
|
||||
sendMessage(source, ("Added %s to the whitelist."):format(GetPlayerName(serverId)))
|
||||
elseif action == "remove" then
|
||||
Whitelist:removePlayer(serverId, identifier)
|
||||
sendMessage(source, ("Removed %s from the whitelist."):format(GetPlayerName(serverId)))
|
||||
else
|
||||
sendMessage(source, "Invalid action.")
|
||||
end
|
||||
end,
|
||||
true
|
||||
)
|
||||
|
||||
RegisterCommand(
|
||||
'firewlreload',
|
||||
function(source, args, rawCommand)
|
||||
Whitelist:load()
|
||||
sendMessage(source, "Reloaded whitelist from config.")
|
||||
end,
|
||||
true
|
||||
)
|
||||
|
||||
RegisterCommand(
|
||||
'firewlsave',
|
||||
function(source, args, rawCommand)
|
||||
Whitelist:save()
|
||||
sendMessage(source, "Saved whitelist.")
|
||||
end,
|
||||
true
|
||||
)
|
||||
|
||||
RegisterCommand(
|
||||
'firedispatch',
|
||||
function(source, args, rawCommand)
|
||||
local _source = source
|
||||
local action = args[1]
|
||||
local serverId = tonumber(args[2])
|
||||
|
||||
if not (action and serverId) or serverId < 1 then
|
||||
return
|
||||
end
|
||||
|
||||
local identifier = GetPlayerIdentifier(serverId, 0)
|
||||
|
||||
if not identifier then
|
||||
sendMessage(source, "Player not online.")
|
||||
return
|
||||
end
|
||||
|
||||
if action == "add" then
|
||||
Dispatch:subscribe(serverId, (not args[3] or args[3] ~= "false"))
|
||||
sendMessage(source, ("Subscribed %s to dispatch."):format(GetPlayerName(serverId)))
|
||||
elseif action == "remove" then
|
||||
Dispatch:unsubscribe(serverId, identifier)
|
||||
sendMessage(source, ("Unsubscribed %s from the dispatch."):format(GetPlayerName(serverId)))
|
||||
else
|
||||
sendMessage(source, "Invalid action.")
|
||||
end
|
||||
end,
|
||||
true
|
||||
)
|
||||
|
||||
RegisterCommand(
|
||||
'randomfires',
|
||||
function(source, args, rawCommand)
|
||||
if not Whitelist:isWhitelisted(source, "firescript.manage") then
|
||||
sendMessage(source, "Insufficient permissions.")
|
||||
return
|
||||
end
|
||||
|
||||
local _source = source
|
||||
local action = args[1]
|
||||
local registeredFireID = tonumber(args[2])
|
||||
|
||||
if not action then
|
||||
return
|
||||
end
|
||||
|
||||
if action == "add" then
|
||||
if not registeredFireID then
|
||||
sendMessage(source, "Invalid argument (2).")
|
||||
return
|
||||
end
|
||||
Fire:setRandom(registeredFireID, true)
|
||||
sendMessage(source, ("Set scenario #%s to start randomly."):format(registeredFireID))
|
||||
elseif action == "remove" then
|
||||
if not registeredFireID then
|
||||
sendMessage(source, "Invalid argument (2).")
|
||||
return
|
||||
end
|
||||
Fire:setRandom(registeredFireID, false)
|
||||
sendMessage(source, ("Set scenario #%s not to start randomly."):format(registeredFireID))
|
||||
elseif action == "disable" then
|
||||
Fire:stopSpawner()
|
||||
sendMessage(source, "Disabled random fire spawn.")
|
||||
elseif action == "enable" then
|
||||
Fire:startSpawner()
|
||||
sendMessage(source, "Enabled random fire spawn.")
|
||||
else
|
||||
sendMessage(source, "Invalid action.")
|
||||
end
|
||||
end,
|
||||
false
|
||||
)
|
||||
|
||||
--================================--
|
||||
-- FIRE SYNC --
|
||||
--================================--
|
||||
|
||||
RegisterNetEvent('fireManager:requestSync')
|
||||
AddEventHandler(
|
||||
'fireManager:requestSync',
|
||||
function()
|
||||
if source > 0 then
|
||||
TriggerClientEvent('fireClient:synchronizeFlames', source, Fire.active)
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
RegisterNetEvent('fireManager:createFlame')
|
||||
AddEventHandler(
|
||||
'fireManager:createFlame',
|
||||
function(fireIndex, coords)
|
||||
Fire:createFlame(fireIndex, coords)
|
||||
end
|
||||
)
|
||||
|
||||
RegisterNetEvent('fireManager:createFire')
|
||||
AddEventHandler(
|
||||
'fireManager:createFire',
|
||||
function()
|
||||
Fire:create(coords, maximumSpread, spreadChance)
|
||||
end
|
||||
)
|
||||
|
||||
RegisterNetEvent('fireManager:removeFire')
|
||||
AddEventHandler(
|
||||
'fireManager:removeFire',
|
||||
function(fireIndex)
|
||||
Fire:remove(fireIndex)
|
||||
end
|
||||
)
|
||||
|
||||
RegisterNetEvent('fireManager:removeAllFires')
|
||||
AddEventHandler(
|
||||
'fireManager:removeAllFires',
|
||||
function()
|
||||
Fire:removeAll()
|
||||
end
|
||||
)
|
||||
|
||||
RegisterNetEvent('fireManager:removeFlame')
|
||||
AddEventHandler(
|
||||
'fireManager:removeFlame',
|
||||
function(fireIndex, flameIndex)
|
||||
Fire:removeFlame(fireIndex, flameIndex)
|
||||
end
|
||||
)
|
||||
|
||||
--================================--
|
||||
-- DISPATCH --
|
||||
--================================--
|
||||
|
||||
RegisterNetEvent('fireDispatch:registerPlayer')
|
||||
AddEventHandler(
|
||||
'fireDispatch:registerPlayer',
|
||||
function(playerSource, isFirefighter)
|
||||
source = tonumber(source)
|
||||
playerSource = tonumber(playerSource)
|
||||
if (source and source > 0) or not playerSource or playerSource < 0 then
|
||||
return
|
||||
end
|
||||
|
||||
Dispatch:subscribe(playerSource, not (isFirefighter))
|
||||
end
|
||||
)
|
||||
|
||||
RegisterNetEvent('fireDispatch:removePlayer')
|
||||
AddEventHandler(
|
||||
'fireDispatch:removePlayer',
|
||||
function(playerSource)
|
||||
source = tonumber(source)
|
||||
playerSource = tonumber(playerSource)
|
||||
if (source and source > 0) or not playerSource or playerSource < 0 then
|
||||
return
|
||||
end
|
||||
|
||||
Dispatch:subscribe(playerSource)
|
||||
end
|
||||
)
|
||||
|
||||
RegisterNetEvent('fireDispatch:create')
|
||||
AddEventHandler(
|
||||
'fireDispatch:create',
|
||||
function(text, coords)
|
||||
if not Config.Dispatch.disableCalls and (source < 1 or Dispatch.expectingInfo[source]) then
|
||||
Dispatch:create(text, coords)
|
||||
if source > 0 then
|
||||
Dispatch.expectingInfo[source] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
--================================--
|
||||
-- WHITELIST --
|
||||
--================================--
|
||||
|
||||
RegisterNetEvent('fireManager:checkWhitelist')
|
||||
AddEventHandler(
|
||||
'fireManager:checkWhitelist',
|
||||
function(serverId)
|
||||
if serverId then
|
||||
source = tonumber(serverId) or source
|
||||
end
|
||||
|
||||
Whitelist:check(source)
|
||||
end
|
||||
)
|
||||
|
||||
--================================--
|
||||
-- AUTO-SUBSCRIBE --
|
||||
--================================--
|
||||
|
||||
if Config.Dispatch.enabled and Config.Dispatch.enableESX then
|
||||
ESX = nil
|
||||
|
||||
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
|
||||
|
||||
local allowedJobs = {}
|
||||
local firefighterJobs = Config.Fire.spawner.firefighterJobs or {}
|
||||
|
||||
if type(Config.Dispatch.enableESX) == "table" then
|
||||
for k, v in pairs(Config.Dispatch.enableESX) do
|
||||
allowedJobs[v] = true
|
||||
end
|
||||
else
|
||||
allowedJobs[Config.Dispatch.enableESX] = true
|
||||
firefighterJobs[Config.Dispatch.enableESX] = true
|
||||
end
|
||||
|
||||
RegisterNetEvent("esx:setJob")
|
||||
AddEventHandler(
|
||||
"esx:setJob",
|
||||
function(source)
|
||||
local xPlayer = ESX.GetPlayerFromId(source)
|
||||
|
||||
if allowedJobs[xPlayer.job.name] then
|
||||
Dispatch:subscribe(source, firefighterJobs[xPlayer.job.name])
|
||||
else
|
||||
Dispatch:unsubscribe(source)
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
RegisterNetEvent("esx:playerLoaded")
|
||||
AddEventHandler(
|
||||
"esx:playerLoaded",
|
||||
function(source, xPlayer)
|
||||
if allowedJobs[xPlayer.job.name] then
|
||||
Dispatch:subscribe(source, firefighterJobs[xPlayer.job.name])
|
||||
else
|
||||
Dispatch:unsubscribe(source)
|
||||
end
|
||||
end
|
||||
)
|
||||
end
|
||||
@@ -0,0 +1,120 @@
|
||||
--================================--
|
||||
-- FIRE SCRIPT v1.6.3 --
|
||||
-- by GIMI (+ foregz, Albo1125) --
|
||||
-- License: GNU GPL 3.0 --
|
||||
--================================--
|
||||
|
||||
function checkVersion()
|
||||
PerformHttpRequest(
|
||||
LatestVersionFeed,
|
||||
function(errorCode, data, headers)
|
||||
if tonumber(errorCode) == 200 then
|
||||
data = json.decode(data)
|
||||
if not data then
|
||||
print("^3[FireScript]^7 Couldn't check version - no data returned!")
|
||||
return
|
||||
end
|
||||
if data.tag_name == "v" .. Version then
|
||||
print("^2[FireScript]^7 Up to date.")
|
||||
else
|
||||
print(("^3[FireScript]^7 The script isn't up to date! Please update to version %s."):format(data.tag_name))
|
||||
end
|
||||
else
|
||||
print(("^3[FireScript]^7 Couldn't check version! Error code %s."):format(errorCode))
|
||||
print(LatestVersionFeed)
|
||||
end
|
||||
end,
|
||||
'GET',
|
||||
'',
|
||||
{
|
||||
['User-Agent'] = ("FireScript v%s"):format(Version)
|
||||
}
|
||||
)
|
||||
end
|
||||
|
||||
-- Chat
|
||||
|
||||
function sendMessage(source, text, customName)
|
||||
if source > 0 then
|
||||
TriggerClientEvent(
|
||||
"chat:addMessage",
|
||||
source,
|
||||
{
|
||||
templateId = "firescript",
|
||||
args = {
|
||||
((customName ~= nil) and customName or ("FireScript v%s"):format(Version)),
|
||||
text
|
||||
}
|
||||
}
|
||||
)
|
||||
else
|
||||
print(("[FireScript v%s] %s"):format(Version, text))
|
||||
end
|
||||
end
|
||||
|
||||
-- Table functions
|
||||
|
||||
function highestIndex(table, fireIndex)
|
||||
if not table then
|
||||
return
|
||||
end
|
||||
local table = fireIndex ~= nil and table[fireIndex] or table
|
||||
local index = 0
|
||||
local count = 0
|
||||
|
||||
for k, v in ipairs(table) do
|
||||
count = count + 1
|
||||
if k >= index then
|
||||
index = k
|
||||
end
|
||||
end
|
||||
|
||||
return index, count
|
||||
end
|
||||
|
||||
function table.length(t)
|
||||
if not t or type(t) ~= "table" then
|
||||
return
|
||||
end
|
||||
|
||||
local count = 0
|
||||
|
||||
for k, v in pairs(t) do count = count + 1 end
|
||||
|
||||
return count
|
||||
end
|
||||
|
||||
function table.random(t)
|
||||
if not t or type(t) ~= "table" or next(t) == nil then
|
||||
return false
|
||||
end
|
||||
|
||||
local randomPosition = math.random(1, table.length(t))
|
||||
local currentPosition = 0
|
||||
local randomKey = nil
|
||||
|
||||
for k, v in pairs(t) do -- Select a random registered fire
|
||||
currentPosition = currentPosition + 1
|
||||
|
||||
if currentPosition == randomPosition then
|
||||
randomKey = k
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
return randomKey, t[randomKey]
|
||||
end
|
||||
|
||||
-- JSON config
|
||||
|
||||
function saveData(data, keyword)
|
||||
if type(keyword) ~= "string" then
|
||||
return
|
||||
end
|
||||
SaveResourceFile(GetCurrentResourceName(), keyword .. ".json", json.encode(data), -1)
|
||||
end
|
||||
|
||||
function loadData(keyword)
|
||||
local fileContents = LoadResourceFile(GetCurrentResourceName(), keyword .. ".json")
|
||||
return fileContents and json.decode(fileContents) or nil
|
||||
end
|
||||
@@ -0,0 +1,68 @@
|
||||
--================================--
|
||||
-- FIRE SCRIPT v1.6.10 --
|
||||
-- by GIMI (+ foregz, Albo1125) --
|
||||
-- License: GNU GPL 3.0 --
|
||||
--================================--
|
||||
|
||||
Whitelist = {
|
||||
players = {},
|
||||
config = {},
|
||||
__index = self,
|
||||
init = function(object)
|
||||
object = object or {players = {}, config = {}}
|
||||
setmetatable(object, self)
|
||||
return object
|
||||
end
|
||||
}
|
||||
|
||||
function Whitelist:check(serverId)
|
||||
if serverId > 0 then
|
||||
local steamID = GetPlayerIdentifier(serverId, 0)
|
||||
if self.config[steamID] == true or IsPlayerAceAllowed(serverId, "firescript.all") then
|
||||
self.players[serverId] = true
|
||||
elseif self.players[serverId] ~= nil then
|
||||
self.players[serverId] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function Whitelist:isWhitelisted(serverId, ace)
|
||||
ace = tostring(ace)
|
||||
return (serverId > 0 and (self.players[serverId] == true or (ace and IsPlayerAceAllowed(serverId, ace))))
|
||||
end
|
||||
|
||||
function Whitelist:addPlayer(serverId, steamId)
|
||||
if steamId then
|
||||
self.config[steamId] = true
|
||||
Whitelist:save()
|
||||
end
|
||||
if serverId then
|
||||
self.players[serverId] = true
|
||||
end
|
||||
end
|
||||
|
||||
function Whitelist:removePlayer(serverId, steamId)
|
||||
if steamId then
|
||||
self.config[steamId] = nil
|
||||
Whitelist:save()
|
||||
end
|
||||
if serverId then
|
||||
self.players[serverId] = nil
|
||||
end
|
||||
end
|
||||
|
||||
function Whitelist:load()
|
||||
local whitelistFile = loadData("whitelist")
|
||||
if whitelistFile ~= nil then
|
||||
self.config = whitelistFile
|
||||
for _, playerId in ipairs(GetPlayers()) do
|
||||
self:check(tonumber(playerId))
|
||||
end
|
||||
else
|
||||
saveData({}, "whitelist")
|
||||
end
|
||||
end
|
||||
|
||||
function Whitelist:save()
|
||||
saveData(self.config, "whitelist")
|
||||
end
|
||||
Reference in New Issue
Block a user