Nabla.LogLevel = Nabla.LogLevels.WARN -- Log levels are ALL, TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF (default is WARN) Config = { -- Please check our FAQ if you have any question : https://fivem.nabla.sh/faq -- List of players who have access to the actions, set WhiteListEnabled = true/false to enable/disable the whitelist WhiteListEnabled = true, WhiteList = { 'ip:192.168.168.35', 'steam:12345', 'mechanic', 'mechanic:5', 'nabla.evc', -- To use with ACE, add this to your server.cfg : add_ace identifier.YOURIDENTIFIER nabla.evc allow }, -- If true only whitelisted player can control the lights / sirens WhiteListedControl = false, -- Keybinds, you can choose from here : https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/ DefaultControls = function() RegisterKeyMapping('+evc_menu', 'EVC - Menu (Hold for trailer)', 'KEYBOARD', 'F6') -- Open placement menu RegisterKeyMapping('+evc_lights', 'EVC - Lights', 'KEYBOARD', 'LMENU') -- Enable lights RegisterKeyMapping('+evc_siren', 'EVC - Siren', 'KEYBOARD', 'E') -- Enable sirens (holding with sirens on will trigger alternative siren, holding with sirens off will trigger horn) RegisterKeyMapping('+evc_siren_tone', 'EVC - Siren Tone', 'KEYBOARD', 'G') -- Change the siren tone RegisterKeyMapping('+evc_spawn_toggle', 'EVC - Spawn Toggle', 'KEYBOARD', 'F7') -- Put / Remove lights, objects and sirens end, -- Handle entityCreated / entityRemoved automatically, if you set this to false make sure to add : -- TriggerServerEvent('EVC:entityCreated', NetworkGetNetworkIdFromEntity(veh)) -- When you create a vehicle and after you set it's plate -- TriggerServerEvent('EVC:entityRemoved', NetworkGetNetworkIdFromEntity(veh)) -- When you delete a vehicle -- Otherwise the script will not work HandleEntityCreatedRemoved = true, -- Allow the keybind and the menu option to toggle lights, objects and sirens from the vehicle AllowToggle = true, -- Should be loaded from a separate resource Models = { Lights = { ["FakeItemToShowOptions"] = { -- This is a fake item to show available options per light/object WhiteList = {"mechanic"}, -- You can also set the whitelist at the object level, if nothing is specified, the global whitelist will be used. Syntax is same as global Extras = true, -- Does this object has extras ? Default to false Doors = true, -- Does this object has doors ? Default to false Offset = vector3(-0.45, -0.1, 0.9), -- Offset between center of object and 3D object (for displaying 3D marker) Collision = false, -- You can also set the collision at the object level, if nothing is specified, the global collision setting will be used }, ["D3sAmberBeacon"] = {}, ["D3sAntennaAmberStr"] = {}, ["D3sAntennaBlueStr"] = {}, ["D3sAntennaGreenStr"] = {}, ["D3sAntennaPurpleStr"] = {}, ["D3sAntennaRedStr"] = {}, ["D3sAntennaWhiteStr"] = {}, ["D3sBBFedSigArjent"] = {}, ["D3sBlueBeacon"] = {}, ["D3sEdge9000A"] = {Extras = true}, ["D3sEdge9000A_L"] = {Extras = true}, ["D3sEdge9000B"] = {Extras = true}, ["D3sEdge9000B_L"] = {Extras = true}, ["D3sEdge9000G"] = {Extras = true}, ["D3sEdge9000G_L"] = {Extras = true}, ["D3sEdge9000P"] = {Extras = true}, ["D3sEdge9000P_L"] = {Extras = true}, ["D3sEdge9000R"] = {Extras = true}, ["D3sEdge9000RB"] = {Extras = true}, ["D3sEdge9000RB_L"] = {Extras = true}, ["D3sEdge9000R_L"] = {Extras = true}, ["D3sRBFedSigArjent"] = {}, ["D3sRRFedSigArjent"] = {}, ["D3sRedBeacon"] = {}, ["D3s_DotBoard"] = {Doors = true, Extras = true}, ["D3s_MiniP_A"] = {Extras = true}, ["D3s_MiniP_B"] = {Extras = true}, ["D3s_MiniP_G"] = {Extras = true}, ["D3s_MiniP_P"] = {Extras = true}, ["D3s_MiniP_R"] = {Extras = true}, ["D3s_OneGuard_A"] = {Extras = true}, ["D3s_OneGuard_AA"] = {Extras = true}, ["D3s_OneGuard_AW"] = {Extras = true}, ["D3s_OneGuard_B"] = {Extras = true}, ["D3s_OneGuard_BB"] = {Extras = true}, ["D3s_OneGuard_BW"] = {Extras = true}, ["D3s_OneGuard_G"] = {Extras = true}, ["D3s_OneGuard_GG"] = {Extras = true}, ["D3s_OneGuard_GW"] = {Extras = true}, ["D3s_OneGuard_P"] = {Extras = true}, ["D3s_OneGuard_PP"] = {Extras = true}, ["D3s_OneGuard_PW"] = {Extras = true}, ["D3s_OneGuard_R"] = {Extras = true}, ["D3s_OneGuard_RB"] = {Extras = true}, ["D3s_OneGuard_RW"] = {Extras = true}, ["D3s_OneGuard_W"] = {Extras = true}, ["D3s_RetroHighwayRiser"] = {Animation = true}, ["D3s_S_Series_BB"] = {Extras = true}, ["D3s_S_Series_RB"] = {Extras = true}, ["D3s_S_Series_RR"] = {Extras = true}, ["D3s_SideRunners_A"] = {Extras = true}, ["D3s_SideRunners_B"] = {Extras = true}, ["D3s_SideRunners_G"] = {Extras = true}, ["D3s_SideRunners_P"] = {Extras = true}, ["D3s_SideRunners_R"] = {Extras = true}, ["D3s_SideRunners_RB"] = {Extras = true}, ["D3s_XR2000_AA"] = {Extras = true}, ["D3s_XR2000_BB"] = {Extras = true}, ["D3s_XR2000_GG"] = {Extras = true}, ["D3s_XR2000_PP"] = {Extras = true}, ["D3s_XR2000_RB"] = {Extras = true}, ["D3s_XR2000_RR"] = {Extras = true}, ["WhelenAmberBeacon"] = {}, ["WhelenBlueBeacon"] = {}, ["WhelenGreenBeacon"] = {}, ["WhelenRedBeacon"] = {}, ["fbiold"] = {Offset = vector3(-0.45, -0.1, 0.9)}, ["lightbarTwoSticks"] = {Offset = vector3(0.0, 0.45, 0.65)}, ["longLightbar"] = {Offset = vector3(0.35, -1.15, 0.75)}, ["longLightbarRed"] = {Offset = vector3(0.35, -1.15, 0.75)}, }, Objects = { ["D3sConeStackV1"] = {}, ["D3sConeStackV2"] = {}, ["D3sLadderRack"] = {}, ["D3sToolboxV1"] = {}, ["D3sWinchV1"] = {}, ["D3s_AntennaBlack"] = {}, ["D3s_AntennaLowProfile"] = {}, ["D3s_AntennaSLVBLK"] = {}, ["D3s_BedRack"] = {Extras = true}, ["D3s_PartitionCage"] = {}, ["D3s_PlateReaderV1"] = {}, ["D3s_PushGuard_S"] = {}, ["D3s_Pushbar_L"] = {}, ["D3s_SirenV1"] = {}, ["D3s_TruckRack"] = {}, }, }, -- List of native vehicles on which lights are controled using EVC -- Has less priority than configs saved by model, plate ... -- Remove from list to disable control by EVC NativeVehiclesHash = { ["ambulance"] = {lights = {}, objects = {}, sirens = {AlternativeTones = {"VEHICLES_HORNS_AMBULANCE_WARNING"}, Tones = {"RESIDENT_VEHICLES_SIREN_WAIL_02"}}}, ["fbi"] = {lights = {}, objects = {}, sirens = {AlternativeTones = {"VEHICLES_HORNS_POLICE_WARNING"}, Tones = {"RESIDENT_VEHICLES_SIREN_WAIL_02"}}}, ["fbi2"] = {lights = {}, objects = {}, sirens = {AlternativeTones = {"VEHICLES_HORNS_POLICE_WARNING"}, Tones = {"RESIDENT_VEHICLES_SIREN_WAIL_02"}}}, ["firetruk"] = {lights = {}, objects = {}, sirens = {AlternativeTones = {"VEHICLES_HORNS_FIRETRUCK_WARNING"}, Tones = {"RESIDENT_VEHICLES_SIREN_FIRETRUCK_WAIL_01"}}}, ["lguard"] = {lights = {}, objects = {}, sirens = {AlternativeTones = {"VEHICLES_HORNS_POLICE_WARNING"}, Tones = {"VEHICLES_HORNS_SIREN_1"}}}, ["police"] = {lights = {}, objects = {}, sirens = {AlternativeTones = {"VEHICLES_HORNS_POLICE_WARNING"}, Tones = {"VEHICLES_HORNS_SIREN_1"}}}, ["police2"] = {lights = {}, objects = {}, sirens = {AlternativeTones = {"VEHICLES_HORNS_POLICE_WARNING"}, Tones = {"VEHICLES_HORNS_SIREN_1"}}}, ["police3"] = {lights = {}, objects = {}, sirens = {AlternativeTones = {"VEHICLES_HORNS_POLICE_WARNING"}, Tones = {"VEHICLES_HORNS_SIREN_1"}}}, ["police4"] = {lights = {}, objects = {}, sirens = {AlternativeTones = {"VEHICLES_HORNS_POLICE_WARNING"}, Tones = {"VEHICLES_HORNS_SIREN_1"}}}, ["policeb"] = {lights = {}, objects = {}, sirens = {AlternativeTones = {"VEHICLES_HORNS_POLICE_WARNING"}, Tones = {"RESIDENT_VEHICLES_SIREN_QUICK_03"}}}, ["policeold1"] = {lights = {}, objects = {}, sirens = {AlternativeTones = {"VEHICLES_HORNS_POLICE_WARNING"}, Tones = {"VEHICLES_HORNS_SIREN_1"}}}, ["policeold2"] = {lights = {}, objects = {}, sirens = {AlternativeTones = {"VEHICLES_HORNS_POLICE_WARNING"}, Tones = {"VEHICLES_HORNS_SIREN_1"}}}, ["policet"] = {lights = {}, objects = {}, sirens = {AlternativeTones = {"VEHICLES_HORNS_POLICE_WARNING"}, Tones = {"VEHICLES_HORNS_SIREN_1"}}}, ["pranger"] = {lights = {}, objects = {}, sirens = {AlternativeTones = {"VEHICLES_HORNS_POLICE_WARNING"}, Tones = {"VEHICLES_HORNS_SIREN_1"}}}, ["riot"] = {lights = {}, objects = {}, sirens = {AlternativeTones = {"VEHICLES_HORNS_POLICE_WARNING"}, Tones = {"VEHICLES_HORNS_SIREN_1"}}}, ["riot2"] = {lights = {}, objects = {}, sirens = {AlternativeTones = {"VEHICLES_HORNS_POLICE_WARNING"}, Tones = {"VEHICLES_HORNS_SIREN_1"}}}, ["sheriff"] = {lights = {}, objects = {}, sirens = {AlternativeTones = {"VEHICLES_HORNS_POLICE_WARNING"}, Tones = {"VEHICLES_HORNS_SIREN_1"}}}, ["sheriff2"] = {lights = {}, objects = {}, sirens = {AlternativeTones = {"VEHICLES_HORNS_POLICE_WARNING"}, Tones = {"RESIDENT_VEHICLES_SIREN_WAIL_03"}}}, }, -- Maximum number of lights / objects per vehicle Max = { Lights = 10, Objects = 10, }, -- Enable or disable collsions on spawned objects / lights (turning this on can lead to weird behavior) EnableCollision = false, -- Spawned object are invicible Invincible = false, -- If true lights must be on for sirens to work SirenNeedLights = false, -- Audio banks AudioBanks = { "DLC_WMSIRENS\\SIRENPACK_ONE", }, -- Range of the sirens SirenRange = 200.0, -- Anything can be added / removed to your likings SirenTones = { -- { -- This is a fake siren to show available options per siren -- label = "label", -- Label for checkbox item -- description = "description", -- Description for checkbox item -- hash = "FAKE_SIREN_TO_SHOW_OPTIONS", -- API Hash of siren for PlaySoundFromEntity -- ref = 0, -- API ref of siren for PlaySoundFromEntity -- WhiteList = {}, -- You can also set the whitelist at the object level, if nothing is specified, the global whitelist will be used. Syntax is same as global -- }, {hash = "SIRENS_AIRHORN", label = "AirHorn", description = "Add this siren", ref = 0}, {hash = "VEHICLES_HORNS_SIREN_1", label = "Horns 1", description = "Add this siren", ref = 0}, {hash = "VEHICLES_HORNS_SIREN_2", label = "Horns 2", description = "Add this siren", ref = 0}, {hash = "VEHICLES_HORNS_POLICE_WARNING", label = "Police Warning", description = "Add this siren", ref = 0}, {hash = "RESIDENT_VEHICLES_SIREN_WAIL_01", label = "Wail 1", description = "Add this siren", ref = 0}, {hash = "RESIDENT_VEHICLES_SIREN_WAIL_02", label = "Wail 2", description = "Add this siren", ref = 0}, {hash = "RESIDENT_VEHICLES_SIREN_WAIL_03", label = "Wail 3", description = "Add this siren", ref = 0}, {hash = "RESIDENT_VEHICLES_SIREN_QUICK_01", label = "Quick 1", description = "Add this siren", ref = 0}, {hash = "RESIDENT_VEHICLES_SIREN_QUICK_02", label = "Quick 2", description = "Add this siren", ref = 0}, {hash = "RESIDENT_VEHICLES_SIREN_QUICK_03", label = "Quick 3", description = "Add this siren", ref = 0}, {hash = "VEHICLES_HORNS_AMBULANCE_WARNING", label = "Ambulance", description = "Add this siren", ref = 0}, {hash = "VEHICLES_HORNS_FIRETRUCK_WARNING", label = "Firetruck", description = "Add this siren", ref = 0}, {hash = "RESIDENT_VEHICLES_SIREN_FIRETRUCK_WAIL_01", label = "Firetruck wail 1", description = "Add this siren", ref = 0}, {hash = "RESIDENT_VEHICLES_SIREN_FIRETRUCK_QUICK_01", label = "Firetruck wail 2", description = "Add this siren", ref = 0}, -- Custom sirens (from https://github.com/Walsheyy/WMServerSirens) {hash = "SIREN_ALPHA", label = "Custom Alpha", description = "Add this siren", ref = "DLC_WMSIRENS_SOUNDSET"}, {hash = "SIREN_BRAVO", label = "Custom Bravo", description = "Add this siren", ref = "DLC_WMSIRENS_SOUNDSET"}, {hash = "SIREN_CHARLIE", label = "Custom Charlie", description = "Add this siren", ref = "DLC_WMSIRENS_SOUNDSET"}, {hash = "SIREN_DELTA", label = "Custom Delta", description = "Add this siren", ref = "DLC_WMSIRENS_SOUNDSET"}, {hash = "SIREN_ECHO", label = "Custom Echo", description = "Add this siren", ref = "DLC_WMSIRENS_SOUNDSET"}, {hash = "SIREN_FOXTROT", label = "Custom Foxtrot", description = "Add this siren", ref = "DLC_WMSIRENS_SOUNDSET"}, {hash = "SIREN_GOLF", label = "Custom Golf", description = "Add this siren", ref = "DLC_WMSIRENS_SOUNDSET"}, {hash = "SIREN_HOTEL", label = "Custom Hotel", description = "Add this siren", ref = "DLC_WMSIRENS_SOUNDSET"}, }, -- Placement sensitivity (step) Sensitivity = { Tx = {0.01, 0.1, 1.0}, -- Translation Rx = {1.0, 10.0, 45.0}, -- Rotation }, -- Range during placement Range = { Tx = 10.0, -- Translation Rx = 180.0, -- Rotation }, -- Function to customize the menus Customize = function(menu) menu:SetBannerRectangle(NativeUI.CreateRectangle(0, 0, 0, 0, 122, 32, 20, 255.0)) end, -- Disable lights / siren when leaving the vehicle, will NOT turn back on when entering TurnOffOnExit = { Sirens = false, Lights = false, }, -- Should a notif be sent if a user press a keybind but no vehicle is in range ? NoVehNotif = false, -- Save per model, per plate, per user+plate or per name ? -- Per name is not loaded automatically, you have to go in the menu and enter the template name you want to load -- Tip 1 : To disable server save, set all to false -- Tip 2 : Priority is : UUID > Plate > Model, meaning you can override the model settings by saving per plate SavePerModel = true, SavePerPlate = true, SavePerUUID = true, GenerateUUID = function(identifier, vehicle) return identifier..":"..GetVehicleNumberPlateText(vehicle) end, SavePerName = true, -- Spawn objects / lights only if player is whitelisted SpawnOnlyIfWhiteListed = false, -- Translations Strings = { ['no_veh'] = 'No vehicle nearby', ['open_veh'] = 'Open menu for this vehicle', ['saved'] = '~g~Saved !~w~', ['clear'] = '~g~Config cleared !~w~', ['error'] = '~r~Error !~w~', -- Main menu ['open'] = {'Press your keybind to open the Nabla\'s Emergency Vehicle Creator'}, ['toggle'] = {'Toggle lights, objects and sirens', 'Toggle the spawn of entities and siren, can also be toggled with the "EVC - Spawn Toggle" button'}, ['passenger_control'] = {'Passenger control', 'Allow passengers to control the lights / sirens'}, ['save'] = {'Save config by', 'Choose how the config will be saved and loaded to the car'}, ['save_model'] = 'Model', ['save_plate'] = 'Plate', ['save_uuid'] = 'UUID', ['save_name'] = 'Name', ['load_name'] = {'Load by name', 'Load a config by using a custom name'}, -- Lights / Objects ['add_edit'] = { ["Objects"] = "Add, edit and remove equipements on this vehicle", ["Lights"] = "Add, edit and remove lights on this vehicle", }, ["Lights"] = "Lights", ["Objects"] = "Equipements", ["spawn"] = {"Spawn", "Select the model you wish to spawn"}, ["select"] = {"Selected", "Select the element you wish to move"}, ["mirror"] = {"Mirror from", "Will copy the position and orientation from this element onto the selected one"}, ["tspeed"] = {"Translation Speed", "Select translation speed"}, ["rspeed"] = {"Rotation Speed", "Select rotation speed"}, ["tx"] = {"X", "Move left / right"}, ["ty"] = {"Y", "Move front / rear"}, ["tz"] = {"Z", "Move up / down"}, ["rx"] = {"Pitch", "Rotate around X"}, ["ry"] = {"Roll", "Rotate around Y"}, ["rz"] = {"Yaw", "Rotate around Z"}, ["del"] = {"Delete", "Remove this element (remember to save)"}, ["ext"] = {"Extras", "Enable / disable extras"}, ["doors"] = {"Doors", "Open / close doors"}, ["livery"] = {"Livery", "Select the livery"}, -- Sirens ["sirens"] = {"Sirens", "Add and remove sirens on this vehicle"}, ["altsiren"] = {"Alternative Siren", "Choose the siren that will be played when holding the siren button"}, }, -- Can the menu be opened from anywhere ? If set to false, add markers below MenuOpenAnyWhere = true, Markers = { vector3(-2097.81, 2655.79, 2.44), }, -- Distance to show markers, help text... DrawMarkerDistance = 50.0, DrawTextDistance = 2.0, -- Function for drawing markers DrawMarker = function(pos) DrawMarker(2, pos.x, pos.y, pos.z, 0.0, 0.0, 0.0, 0, 0.0, 0.0, 1.5, 1.5, 1.5, 255, 176, 39, 100, false, true, 2, true, false, false, false) end, } table.sort(Config.SirenTones, function(a,b) return a.label < b.label end) local prev = nil function ShowNotification(message) if prev ~= nil then RemoveNotification(prev) end AddTextEntry(GetCurrentResourceName().."Notif", Config.Strings[message]) BeginTextCommandThefeedPost(GetCurrentResourceName().."Notif") prev = EndTextCommandThefeedPostTicker(false, false) end function DisplayHelpText(lineOne, lineTwo, lineThree) BeginTextCommandDisplayHelp("THREESTRINGS") AddTextComponentSubstringPlayerName(lineOne) AddTextComponentSubstringPlayerName(lineTwo or "") AddTextComponentSubstringPlayerName(lineThree or "") EndTextCommandDisplayHelp(0, 0, 0, -1) end Config.NativeVehicles = {} for k,v in pairs(Config.NativeVehiclesHash) do Config.NativeVehicles[tostring(GetHashKey(k))] = v end