Price
UnknownA script by ZaT
Price
UnknownTake your FiveM server to the next level with an immersive and action-packed heist!
With an intuitive UI and seamless gameplay, Roofrunning Heist offers players an adrenaline-fueled mission where they can team up, execute a daring rooftop robbery, and decide their fate—sell or recycle their loot.
Start missions with your group and coordinate the heist.
Engage in high-risk theft with interactive minigames.
Choose your payout – sell the stolen components for cash or recycle them for alternative rewards.
Beware of failure – too many mistakes trigger alarms and alert the police!
Fully configurable to fit any server setup. Easily adjust:
Framework Compatibility – supports multiple frameworks.
Target & Dialog Interactions – configure user interactions.
Police Requirements – set the minimum cops required for the heist.
Minigames – customize difficulty to fit your server.
Zone Radius – define the heist’s operational area.
Alarm & Dispatch Settings – configure fail limits, alarm sounds, and police alerts.
Rewards System – customize loot probabilities, rare rewards, and payouts.
Recycle & Sell Mechanics – adjust item values and economic balance.
Roofrunning Heist is a must-have for any serious roleplay server.
Create thrilling experiences, challenge your players, and add a dynamic new way to earn money in the city!
| Code is accessible | 80% |
| Subscription-based | No |
| Lines (approximately) | 5k + |
| Requirements | qb-core, es_extended |
| Support | Yes |
Config.lua :
Config = {}
Config.Framework = "qb" -- "qb"
Config.Inventory = "ox" -- "ps", "qb", "ox", "qs"
Config.Target = "qb" -- ox !!!!!!!!! IMPORTANT
Config.FrameworkPseudo = 'qb-core'
Config.phone = 'qb-phone'
Config.ServerName = 'Your Server Name'
Config.ZoneDebug = false
Config.UseNPCDialog = true
Config.UseInteract = true
Config.QBInventory = 'new' -- new
Config.UseGangApp = true
---------- Only if Config.UseNPCDialog is set to false ---------------
--
Config.NPC = { --
model = "a_m_m_hillbilly_02", --
anim = "CODE_HUMAN_MEDIC_TIME_OF_DEATH", --
coords = vector4(574.08, 133.01, 98.47, 249.26) --
} -- --
Config.ShopItems = { --
[1] = { --
name = "screwdriver", --
price = 1000, --
amount = 50, --
info = {}, --
type = "item", --
slot = 1, --
} --
} --
----------------------------------------------------------------------
Config.MiniumCops = 0
Config.zatui = 'zat-ui' -- set 'qb-menu', if you renamed the 'zat-ui' resource name to 'qb-menu'
Config.RequiredItem = 'screwdriver'
Config.GenerateTime = 1 -- time in minutes
Config.StealCount = math.random(3, 5)
Config.Radius = 150.0
Config.Alarm = 1 -- fail attempts to start the alarm + call police
Config.Fail = 100 -- number of fails to cancel the mission
Config.CompactUrl = 'https://www.youtube.com/watch?v=y6JaVVnRV1w' -- Trash Recycle Sound effect
Config.AlarmUrl = 'https://www.youtube.com/watch?v=EnRK43JkxJk' -- alarm URL
Config.Dispatch = 'qb-core' -- cd_dispatch, ps-dispatch
--new
Config.EndMission = 60 -- after 15 minutes the mission will end
----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------OPTIMISATION PART --------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------
-- Description : this part is responsable on deleting the not needed props when no players are nearby
-- refreshprops : is the time to check if there is someone near the props or not
-- radius : is to check how far is the player from the prop if it is < then the prop will be deleted until someone is nearby...
Config.RefreshProps = 10 -- 15 seconds
Config.Radius = 100.0 -- if the distance between the player and the prop is < 50 then the prop will be deleted.
----------------------------------------------------------------------------------------------------------------------------------------
Config.Minigame = {
time = 20,
columns = 11 ,
rows = 7,
}
Config.PoliceJobs = {
'police'
}
Config.Area = {
vector3(-1221.96, -1067.69, 14.35),
vector3(-575.50, -142.08, 51.99),
vector3(-1282.18, -765.94, 28.77),
vector3(-162.37, 315.10, 103.93),
vector3(-1283.42, -849.34, 23.48),
vector3(450.19, -1092.18, 43.06),
vector3(-687.94, -152.82, 53.62),
}
Config.Recycler = {
[1] = {model = 'prop_roofrunning_recyc', coords = vector4(-325.39, -1549.44, 26.71, 90.0), recycling = false},
}
Config.Slots = 10 -- recycler max slots
Config.UseEmote = true
Config.props = {
[`prop_aircon_m_06`] = {
'hvacblower',
'hvaccompressor',
},
[`sum_prop_ac_aircon_02a`]= {
'hvacblower',
'hvaccompressor',
},
[`prop_aircon_m_04`]= {
'hvacblower',
'hvaccompressor',
},
[`prop_roofvent_06a`]= {
'gturbinehead',
},
}
Config.RareRewardsLuck = 100 -- 5%
Config.RareRewards = {
[1] = { name = 'goldchain', amount = math.random(1,5), info = {}},
[2] = { name = 'goldbar', amount = math.random(1,5), info = {}},
}
---------- MUST BE <= length of config.Recycle[item] !! important ----------------
Config.RandomItems = math.random(1,3) -- amount of items to get from recyucling---
----------------------------------------------------------------------------------
Config.RecycleTime = 38 -- Recycle time in Seconds
Config.Recycle = { -- feel free to add more items from your server to recyle them as well
['hvacblower'] = {
['metalscrap'] = {
name = 'metalscrap',
amount = math.random(10,20),
info = {},
},
['plastic'] = {
name = 'plastic',
amount = math.random(10,20),
info = {},
} ,
['copper'] = {
name = 'copper',
amount = math.random(10,20),
info = {},
} ,
['aluminum'] = {
name = 'aluminum',
amount = math.random(10,20),
info = {},
} ,
['aluminumoxide'] = {
name = 'aluminumoxide',
amount = math.random(10,20),
info = {},
},
['iron'] = {
name = 'iron',
amount = math.random(10,20),
info = {},
},
['ironoxide'] = {
name = 'ironoxide',
amount = math.random(10,20),
info = {},
},
['steel'] = {
name = 'steel',
amount = math.random(10,20),
info = {},
},
['rubber'] = {
name = 'rubber',
amount = math.random(10,20),
info = {},
},
['glass'] = {
name = 'glass',
amount = math.random(10,20),
info = {},
},
},
['hvaccompressor'] = {
['metalscrap'] = {
name = 'metalscrap',
amount = math.random(10,20),
info = {},
},
['plastic'] = {
name = 'plastic',
amount = math.random(10,20),
info = {},
} ,
['copper'] = {
name = 'copper',
amount = math.random(10,20),
info = {},
} ,
['aluminum'] = {
name = 'aluminum',
amount = math.random(10,20),
info = {},
} ,
['aluminumoxide'] = {
name = 'aluminumoxide',
amount = math.random(10,20),
info = {},
},
['iron'] = {
name = 'iron',
amount = math.random(10,20),
info = {},
},
['ironoxide'] = {
name = 'ironoxide',
amount = math.random(10,20),
info = {},
},
['steel'] = {
name = 'steel',
amount = math.random(10,20),
info = {},
},
['rubber'] = {
name = 'rubber',
amount = math.random(10,20),
info = {},
},
['glass'] = {
name = 'glass',
amount = math.random(10,20),
info = {},
},
},
['gturbinehead'] = {
['metalscrap'] = {
name = 'metalscrap',
amount = math.random(10,20),
info = {},
},
['plastic'] = {
name = 'plastic',
amount = math.random(10,20),
info = {},
} ,
['copper'] = {
name = 'copper',
amount = math.random(10,20),
info = {},
} ,
['aluminum'] = {
name = 'aluminum',
amount = math.random(10,20),
info = {},
} ,
['aluminumoxide'] = {
name = 'aluminumoxide',
amount = math.random(10,20),
info = {},
},
['iron'] = {
name = 'iron',
amount = math.random(10,20),
info = {},
},
['ironoxide'] = {
name = 'ironoxide',
amount = math.random(10,20),
info = {},
},
['steel'] = {
name = 'steel',
amount = math.random(10,20),
info = {},
},
['rubber'] = {
name = 'rubber',
amount = math.random(10,20),
info = {},
},
['glass'] = {
name = 'glass',
amount = math.random(10,20),
info = {},
},
},
}
Config.Fence = {
[1] = {model = 's_m_m_migrant_01', anim = "CODE_HUMAN_MEDIC_TIME_OF_DEATH", coords = vector4(1366.76, 3616.00, 34.02, 292.86), selling = false},
[2] = {model = 's_m_m_migrant_01', anim = "CODE_HUMAN_MEDIC_TIME_OF_DEATH", coords = vector4(-338.91, -2444.76, 6.30, 49.30), selling = false},
}
---------- MUST BE <= length of config.Sell[item] !! important ----------------
Config.RandomSell = math.random(1,2) -- amount of items to get from selling-------
----------------------------------------------------------------------------------
Config.SellTime = 3 -- 3 seconds to make sure all items are sold (>3 is enough)
Config.Sell = { -- feel free to add more items from your server to recyle them as well
['hvacblower'] = {
['goldbar'] = {
name = 'goldbar',
amount = math.random(1,3),
info = {},
},
['goldchain'] = {
name = 'goldchain',
amount = math.random(1,3),
info = {},
},
},
['hvaccompressor'] = {
['goldbar'] = {
name = 'goldbar',
amount = math.random(1,3),
info = {},
},
['goldchain'] = {
name = 'goldchain',
amount = math.random(1,3),
info = {},
},
},
['gturbinehead'] = {
['goldbar'] = {
name = 'goldbar',
amount = math.random(1,3),
info = {},
},
['goldchain'] = {
name = 'goldchain',
amount = math.random(1,3),
info = {},
},
},
}
Showcase : https://youtu.be/ALqyrxHQKFk
QBcore :
Tebex : https://zatv.tebex.io/category/qbcore
Documentation : Roof Running | ZaT Scripts
ESX :
Tebex : https://zatv.tebex.io/category/esx
Documentation : Roof Running | ZaT Scripts
See what others are saying about this script.
Share your experience and help others.