Nebula Designs is comprised of a small group of talented individuals. With a wide range of skills under our belts, we wanted to get together to bring you quality and optimized scripts. We want our scripts to bring unique features to your server, and run well at the same time by not hogging resources.
Our developers are experienced in running their own FiveM communities and have run into countless scripts that did not meet their standards. We want to solve this rampant issue by working on releasing our own versions of these scripts that will provide a much better user experience for your players.
We hope that you find our work to be above standard and continue to support us in our endeavors!
Developer
Developer
Lead Support Analyst
Business Controller
Want to get to know the team more? Join our Discord server today and get to know us and our community!
Spawn and manage props on your server.
The ultimate system to spawn and manage props on your server. Can be used with Police, EMS, Mechanics or even just to spawn chairs to sit on. All props are networked so are able to be picked up via anyone you have set in the config.lua
Simply add the props you want to use to your server as items (database or in the items.lua
depending on your inventory system). Then setup the config to match your item name and insert the prop you would like to spawn (you also need to setup your bone and rotations for moving said prop as well as any job restrictions you might like). Then in game place the prop you would like to place down. Use the target eye to target the script and pick it up / move it.
config.lua
, and edit to your servers needs.server/framework.lua
with your framework triggers.server/framework.lua
NotifyClient
function for your notification script.config.lua
, add the items to your database or inventory config (depends on your inventory)TriggerClientEvent('nebula_propmanager:client:menuEvent', propname)
propname
must be a string with the name of the prop in the config (e.g. 'prop_roadcone02a'
). Please note: Due to too many variations we will not provide support on setting up your individual menus to work with our script.Config = {}
-- Menu trigger event: TriggerClientEvent('nebula_propmanager:client:menuEvent', propname) must be name of prop, not the item name. Use this event to bypass item requirements and spawn using menu.
Config.BTConfig = {
Export = exports['qtarget'], -- Set your export for the target script of your choosing. Must have "AddTargetModel" as an export option
PickupIcon = "fas fa-trash-restore", -- Icon used for target Pickup menu option
MoveIcon = "fas fa-expand-arrows-alt", -- Icon used for target Move menu option
TargetDist = 1.5, -- Distance you can be from target to see options
}
Config.SaveInterval = 5 -- Default: 5 - How frequently in minutes will the script save props to json file? Set to 0 if you want to disable saving.
Config.SpawnInterval = 2000 -- OneSync Infinity users ONLY. How many seconds between checks to spawn a prop as player gets near it. Lower number, lower perforamce, but fast spawns on other clients after placing prop.
Config.SpawnDistance = 100 -- How far away will objects start to spawn. After a certain distance, the entity won't spawn for infinity users, so make sure you test that this is still working if you increase this number.
Config.Framework = 'esx' -- Set the framework you are using 'esx' or 'qbcore'. Please go into server/framework.lua and set the notification export to what you need.
Config.CanCarryItemCheck = true --Valid only for ESX framework. QBCore does this by default.
Config.DropControl = 73 -- Default: X -- Used to drop a item after picked up.
Config.BackupZoneRemove = 'zoneremove' -- Command to remove zone should there be issues picking up prop.
Config.BackupRemove = 'propremove' -- Command to remove prop, and target isn't working. (Has to be a prop spawned by propmanager)
Lang = {
['noJob'] = "You are not authorized to use this item.",
['move'] = "Move",
['pickup'] = "Pickup",
['no_carry'] = "You can't carry this item.", --Only triggered for ESX servers.
--Discord Log
['discord_user'] = "Prop Manager Logs",
['discord_title_place'] = "Prop Placed",
['discord_title_pickup'] = "Prop Picked Up",
['discord_title_move'] = "Prop Moved",
['discord_message'] = "Player ID: %s\nPlayer Name: %s\nProp: %s\nCoords: %s",
}
--[[
Ace perms require you to know the identifier type your server uses for setting up command acces.
You will need to add_ace to your ace server.cfg file for it to check the right access.
Add aces to match your groups that you use in ace permissions. So if you have a group call "god", add "add_ace group.god god allow" to your server.cfg
Example:
add_ace group.superadmin superadmin allow
add_ace group.admin admin allow
add_ace group.mod mod allow
PLEASE NOTE: YOU DO NOT NEED TO USE THIS FEATURE FOR PROPS TO WORK. Only needed if you want to lock a prop to group perms.
]]
Config.Identifier = 'license' -- Ace group permission identifier for your server. Usually license or steam.
Config.Discord = {
Enable = false, -- Set true to enable webhooks to discord.
Webhooks = {
['place'] = '', -- Put webhook from discord in the ''. Leave '' if you don't want to log specific type.
['pickup'] = '',
['move'] = '',
},
Color = "7419530"
}
Config.Props = {
["prop_roadcone02a"] = { -- Propname
name = "roadcone", -- Item name
quickPlace = true, -- Skip placement controls and place prop infront of you.
moveAllowed = true, -- Can/Can't "move" a prop, can only pick it up if they have access.
bone = 28422, -- Bone to attach to
pos = {0.6,-0.15,-0.1}, -- Position on ped when attached
rot = {315.0,288.0,0.0}, -- Rotation on ped when attached
--zOffset = -0.5, -- Spawning offset to lower props that have odd hit boxes causing them to look like they are floating.
--groudPlace = true, -- Force object to be placed on ground. BEWARE - DO NOT use with zOffset, and only enable if the prop doesn't always place on the ground properly.
push = false, -- Pushing animation when moving
freeze = true, -- Freeze a prop in position or not (remove for not frozen)
jobs = {['police'] = 0,['ambulance'] = 0}, -- Jobs who have access to this prop and grade for that job
groups = false, -- Example: {'mod','admin','superadmin'} Role based access control based on admin groups. Set false to not check.
zone = {radius = 10.0, speed = 0}, -- Radius around the prop for AI cars to slow down speed of Ai cars around prop (remove if not needed )
--ignoreTarget = true, -- Don't setup target in prop_manager. Needed for triggering events on other scripts. To remove prop use the Config.BackupRemove command.
--[[progress = { -- If you want to add a progress and animation to props.
label = '',
duration = 1000,
canCancel = true,
controlDisables = {
disableMovement = true,
disableCarMovement = false,
disableMouse = false,
disableCombat = false
},
animation = {
animDict = nil,
anim = nil,
flags = 0,
task = nil
}
},
options = { -- Add additional options per prop to trigger other events. You can align these with what your target script allows you to use.
{
type = "client",
event = "qb-policejob:ToggleDuty",
icon = "fas fa-sign-in-alt",
label = "Sign In",
job = "police",
},
},]]
filesave = false, -- Does this prop save to json file?
},
["prop_gas_pump_old2"] = {
name = "gaspump",
bone = 28422,
pos = {0.0,-0.5,-1.3},
rot = {-195.0,-180.0,180.0},
freeze = true,
jobs = false,
groups = {'mod','admin','superadmin'},
filesave = false,
},
["prop_barrier_work06a"] = {
name = "barrier",
quickPlace = true,
bone = 28422,
pos = {0.6,-0.15,-0.1},
rot = {315.0,288.0,0.0},
push = false,
freeze = true,
jobs = false,
groups = false,
zone = {radius = 10.0, speed = 0},
filesave = false,
},
["prop_cs_trolley_01"] = {
name = "ttrolly",
quickPlace = true,
bone = 28422,
pos = {-0.1,-0.6,-0.85},
rot = {-180.0,-165.0,90.0},
push = true,
freeze = false,
jobs = {['mechanic'] = 0,},
groups = false,
filesave = false,
},
["prop_tool_box_04"] = {
name = "toolboxp",
bone = 28422,
pos = {0.4,-0.1,-0.1},
rot = {315.0,288.0,0.0},
push = true,
freeze = false,
jobs = {['mechanic'] = 0,},
groups = false,
filesave = false,
},
["prop_engine_hoist"] = {
name = "hoist",
bone = 28422,
pos = {0.0,-0.5,-1.3},
rot = {-195.0,-180.0,180.0},
push = true,
freeze = false,
jobs = {['mechanic'] = 0,},
groups = false,
filesave = false,
},
}
Manage jobs and job certifications via Discord roles on your server.
The ultimate system to manage jobs on your server. Can be used with any job configured in the config. All jobs have several options to set up: Map blips, armory/job store locations, time-clock locations, roles, and others!
Simply add the jobs you want to use to your config, and set up the roles you want to tie those jobs to in your discord. Please read over the config carefully, as there are a lot of options and controls provided by Job Manager.
config.lua
.config.lua
, and edit to your servers needs.client/framework.lua
> Notify
function for your notification script.exports.nebula_jobmanager:CertCheck("CertName")
exports.nebula_jobmanager:GetCerts()
exports.nebula_jobmanager:GetJobTotal('job')
exports.nebula_jobmanager:GetJobTotalsTable()
local jobTotals = exports.nebula_jobmanager:GetJobTotalsTable()
-- jobTotals would look like this:
jobTotals = {
['police'] = 2,
['ambulance'] = 3,
['gang'] = 4,
}
exports.nebula_jobmanager:CertCheck(source, "CertName")
exports.nebula_jobmanager:GetCerts(source)
exports.nebula_jobmanager:GetJobTotal('job')
exports.nebula_jobmanager:GetJobTotalsTable()
local jobTotals = exports.nebula_jobmanager:GetJobTotalsTable()
-- jobTotals would look like this:
jobTotals = {
['police'] = 2,
['ambulance'] = 3,
['gang'] = 4,
}
Config = {}
Config.Debug = false -- Enables restarting script while running a test server. DO NOT USE THIS ON LIVE SERVER.
Config.Framework = 'esx' -- Set the framework you are using 'esx' or 'qbcore'. Please go into client/framework.lua and set the notification export to what you need.
Config.Inventory = 'esx' -- Set to 'ox' if using ox_inventory or 'qb-nomenu' for using qb-inventory directly and no ox_lib menu or 'qbcore' for Qb-inventory
Config.WeaponsItem = true -- Only for ESX users. Set to false if not using weapons as items. If using weapons as items your items must support Metadata for components, otherwise do not set weapon commponents.
Config.TargetConfig = {
Export = exports['qtarget'], -- Set your export for the target script of your choosing. Must have "AddTargetModel" as an export option
Debug = false, -- Enable debug of target locations
Icons = { -- Target icons
ClockIn = "fas fa-sign-in-alt",
ClockOut = "fas fa-sign-out-alt",
ToggleDuty = "fal fa-sliders-h-square",
Armory = "fas fa-sign-in-alt",
TimeMenu = "fas fa-clipboard-list",
},
}
Config.Discord = { -- Refer to documentation in README.md if you do not know how to setup discord token and ids
Token = "",
GuildIds = {""}, -- Enter multiple discord IDs that you want to grab roles from. This will require the same bot to be in each discord.
Roles = { --['RoleName'] = "DiscordRoleID". Can be a role from any of the above guild IDs.
['LEO'] = "roleID",
['Chief'] = "roleID",
['Sergeant'] = "roleID",
['Trooper'] = "roleID",
['K9'] = "roleID",
['Evidence'] = "roleID",
['Money_Wash'] = "roleID",
},
AdminRoles = {
['god'] = {'972886752429740032', '836127288869126195', '1020354600076857425'},
['admin'] = {'768363741468295197', '768363741477077003'},
['mod'] = {'768363741468295196'},
},
}
--[[
Certification system to lock items, cars, guns, any script really.
Got a discord role that you want to lock a gun to? How about a speed intercepter for PD instead of using job grade?
You can check using client-side or server-side checks for these certifactions, or even within this script.
Refer to documentation in README.md for export list.
]]--
Config.Certs = { --Format: ['CertName/DiscordRole'] = false - MUST ALWAYS BE FALSE OR IT WILL ALWAYS GIVE A PLAYER THE CERT, MUST MATCH THE NAME OF THE ROLE FROM ABOVE.
["K9"] = false,
["Evidence"] = false,
["Money_Wash"] = false,
}
Config.RolesRefresh = 'certrefresh' -- Command to refresh player discord roles and certs without having to relog. Clocking into a job, or loading into a new character will also do the samething.
Config.SetCallsign = 'setcallsign' -- Command to change your callsign after being clocked in.
Config.BlipRefresh = 5 -- Time in seconds job blips will update for OneSync Infinity only. Lower the number, the lower the performance of the script.
Config.TimeSave = {
Enable = true, -- Enable / disable timekeeping as a whole. Can set per job.
DaysKeep = 30, -- How many days after first entry does the time keeping reset for that player. Can be done manually in menu.
}
Config.Armor = { -- Format: ['itemName'] = totalArmor -- Adds armors as useable items. Add item to armory or your shop to get access to the item.
Save = {
Enable = false, -- ESX ONLY: Save armor amount to the database... For BEST client performance disable this feature.
Interval = 180, -- Time in seconds to check how much armor a player has remaining. Lower the number, lower the performance. This is only used if save is enabled. Database saves will depend on Config.TimeSaveInterval
},
Items = { -- Set to {} to disable. Make sure to add these items to your items database or in the items list of ox_inventory.
['coparmor'] = 100,
['armor'] = 25,
},
ProgressBar = {
Duration = 5000,
Label = "Putting Armor On",
}
}
Config.Jobs = {
['police'] = {
IsJobGang = false, -- QBCore only. Allows to clock in as "gang" instead of "job"
ClockLocations = { -- Locations to clock in and out of job
{Name = "Mission Row Clipboard", Coords = vector3(441.8,-981.83,30.69), Heading = 11.0, Length = 0.6, Width = 0.6, MinZ = 29.6, MaxZ = 33.0, Blip = {Enabled = true, Color = 38, Icon = 60, Scale = 0.5 }},
},
RequiredRole = "LEO", -- Discord role from list above required to clock into job.
Success = "Clock'd into Police Job successful.", -- Message after they successfully clock into job.
Grades = { -- Job grades above grade 0 based on discord roles from above.
{role = "Chief", grade = 3},
{role = "Sergeant", grade = 2},
{role = "Trooper", grade = 1},
},
Callsign = { -- If job requires callsign to show up in blip name. Set false or {} to disable or remove option.
Length = 3,
AddToItem = true, -- Adds callsigns to items that have "serial" metadata. Requires metadata support for items.
},
TimeKeeping = { -- Do you want to track time a player is on-duty? Auto resets Config.TimeSaveInterval.DaysKeep or via /opentime command
Enabled = true,
JobGrade = 1, -- Grade that has access to see the list of total time on-duty of players for the job.
DiscordWebhook = "Webhook" -- Optionally log total time to discord when players go off duty or disconnect
},
UnemployedJob = {Job = "unemployed", DutyStatus = true}, -- If someone clocks out and you want to put them on an alternative job like 'offdutypolice'. "DutyStatus" is for QB-core only, ESX does nothing.
PlayerBlips = {Allowed = {'ambulance','sheriff'}, Color = 38, Icon = 57, Scale = 0.5}, -- Blip to show on map of player's location, and what other jobs can see those blips. "Allowed" list does not need to be a job managed by JobManager
OpenArmory = "Open Armory", --Armory open text for the specific job. If one is not set, it will use the "open_armory" langauge option.
ArmoryHeader = "Armory", -- Header of the armory for the specific job. If one is not set, it will use the "armory_header" langauge option.
ArmoryLocations = { -- Location to get items and weapons for a specific job. Set false or {} to disable or remove option
{Name = "Mission Row Armory", Coords = vector3(483.94, -995.38, 30.69), Heading = 11.0, Length = 1.45, Width = 7.45, MinZ = 29.5, MaxZ = 32.0, Blip = {Enabled = true, Color = 38, Icon = 150, Scale = 0.3 }},
},
Money = 'money', -- 'money', 'black_money', 'bank' --Type of money you want to take from player for the armory.
Items = { -- Items to get at armory, requires "ArmoryLocations" to be set. Make sure to adjust "Config.WeaponsItem" and "Config.Inventory" as needed.
['Equipment'] = { -- Menu title option name when not using "qb-nomenu".
{Name = 'coparmor', Label = "Cop Armor", Limit = 2, Price = 0},
{Name = 'radio', Label = "Radio", Limit = 1, Price = 0},
},
},
--[[ QB Core version of Components
components = {{'COMPONENT_CARBINERIFLE_MK2_CLIP_02', 'Extended Clip'}, {'COMPONENT_AT_AR_FLSH', 'Flashlight'}, {'COMPONENT_AT_MUZZLE_04', 'Muzzle'}, {'COMPONENT_AT_SIGHTS', 'Holo Scope'}, {'COMPONENT_AT_AR_AFGRIP_02', 'Grip'}},
components = {{'COMPONENT_AT_AR_FLSH', 'Flashlight'}, {'COMPONENT_AT_SIGHTS', 'Holo Scope'}},
components = {{'COMPONENT_SMG_MK2_CLIP_01', 'Clip'}, {'COMPONENT_AT_AR_FLSH','Flashlight'}, {'COMPONENT_AT_SCOPE_SMALL_SMG_MK2','Scope'}, {'COMPONENT_AT_SB_BARREL_02','Heavy Barrel'}, {'COMPONENT_AT_MUZZLE_04', 'Muzzle'}},
components = {{'COMPONENT_PISTOL_MK2_CLIP_01', 'Clip'}, {'COMPONENT_AT_PI_FLSH_02', 'Flashlight'}, {'COMPONENT_AT_PI_COMP','compensator'}},
]]
Weapons = { -- Weapons to get at armory, requires "ArmoryLocations" to be set. Make sure to adjust "Config.WeaponsItem" and "Config.Inventory" as needed.
{Name = 'WEAPON_CARBINERIFLE_MK2', Label = 'MK2 Carbine', Ammo = 100, Price = 0, Grade = "AR", Metadata = {registered = true, serial = 'POLICE', components = {'clip_default', 'flashlight', 'muzzle_precision', 'scope_holo', 'grip'}}},
{Name = 'WEAPON_PUMPSHOTGUN_MK2', Label = 'MK2 Shotgun', Ammo = 100, Price = 0, Grade = 1, Metadata = {registered = true, serial = 'POLICE', components = {'flashlight', 'scope_holo'}}},
{Name = 'WEAPON_SMG_MK2', Label = 'MK2 SMG', Ammo = 100, Price = 0, Grade = "SWAT", Metadata = {registered = true, serial = 'POLICE', components = {'clip_default', 'flashlight', 'scope_medium', 'barrel_default', 'muzzle_precision'}}},
{Name = 'WEAPON_PISTOL_MK2', Label = 'MK2 Pistol', Ammo = 100, Price = 0, Metadata = {registered = true, serial = 'POLICE', components = {'clip_default', 'flashlight', 'compensator'}}},
{Name = 'WEAPON_KNIFE', Label = 'Knife', Ammo = 1, Price = 0},
{Name = 'WEAPON_STUNGUN', Label = 'Stungun', Ammo = 100, Price = 0},
{Name = 'WEAPON_SMOKEGRENADE', Label = 'Smoke Grenade', Ammo = 4, Price = 0, Grade = "SWAT"},
{Name = 'WEAPON_FLASHLIGHT',Label = 'Flashlight', Ammo = 1, Price = 0},
{Name = 'WEAPON_NIGHTSTICK', Label = 'Nightstick', Ammo = 1, Price = 0},
{Name = 'WEAPON_FIREEXTINGUISHER', Label = 'Fire Extinguisher', Ammo = 5000, Price = 0},
{Name = 'WEAPON_PETROLCAN', Label = 'Gas Can', Ammo = 5000, Price = 0}
},
InteractDist = 1.5,
}
}
Unauthorized use or distribution ("leaking") of Nebula Designs scripts, whether they are free of charge or paid scripts, is strictly prohibited. Whoever owns the script is responsible for the use of the script and the token(s) associated with it.
If you or your server are found actively engaging in unauthorized use or distribution of our products, the following things will happen:
In the end, leaking is stealing. Don't make us use precious development time keeping leaked scripts off the grid.
-Nebula Designs