fixing k9script

This commit is contained in:
KingMcDonalds
2026-03-15 14:32:40 -07:00
parent 2dd8655931
commit b283de77ee
63 changed files with 4858 additions and 3027 deletions
@@ -0,0 +1,167 @@
local colorNames = {
[0] = "Metallic Black",
[1] = "Metallic Graphite",
[2] = "Metallic Black Steel",
[3] = "Metallic Dark Silver",
[4] = "Metallic Silver",
[5] = "Metallic Blue Silver",
[6] = "Metallic Steel Gray",
[7] = "Metallic Shadow Silver",
[8] = "Metallic Stone Silver",
[9] = "Metallic Midnight Silver",
[10] = "Metallic Gun Metal",
[11] = "Matte Black",
[12] = "Matte Gray",
[13] = "Matte Light Grey",
[14] = "Util Black",
[15] = "Util Black Poly",
[16] = "Util Dark Silver",
[17] = "Util Silver",
[18] = "Util Gun Metal",
[19] = "Util Shadow Silver",
[20] = "Metallic Red",
[21] = "Metallic Torino Red",
[22] = "Metallic Formula Red",
[23] = "Metallic Blaze Red",
[24] = "Metallic Graceful Red",
[25] = "Metallic Garnet Red",
[26] = "Metallic Desert Red",
[27] = "Metallic Cabernet Red",
[28] = "Metallic Candy Red",
[29] = "Metallic Sunrise Orange",
[30] = "Metallic Classic Gold",
[31] = "Metallic Orange",
[32] = "Matte Red",
[33] = "Matte Dark Red",
[34] = "Matte Orange",
[35] = "Metallic Dark Green",
[36] = "Metallic Racing Green",
[37] = "Metallic Sea Green",
[38] = "Metallic Olive Green",
[39] = "Metallic Green",
[40] = "Metallic Gasoline Blue Green",
[41] = "Matte Lime Green",
[42] = "Dark Green",
[43] = "Matte Green",
[44] = "Worn Green",
[45] = "Metallic Electric Blue",
[46] = "Metallic Dark Blue",
[47] = "Metallic Midnight Blue",
[48] = "Metallic Saxon Blue",
[49] = "Metallic Blue",
[50] = "Metallic Mariner Blue",
[51] = "Metallic Harbor Blue",
[52] = "Metallic Diamond Blue",
[53] = "Bright Green",
[54] = "Metallic Nautical Blue",
[55] = "Metallic Bright Blue",
[56] = "Metallic Purple Blue",
[57] = "Metallic Spinnaker Blue",
[58] = "Metallic Ultra Blue",
[59] = "Metallic Bright Purple",
[60] = "Metallic Cream",
[61] = "Metallic Ice White",
[62] = "Metallic Frost White",
[63] = "Metallic Saxon Blue",
[64] = "Blue",
[65] = "Mariner Blue",
[66] = "Harbor Blue",
[67] = "Diamond Blue",
[68] = "Surf Blue",
[69] = "Nautical Blue",
[70] = "Ultra Blue",
[71] = "Schafter Purple",
[72] = "Spinnaker Purple",
[73] = "Racing Blue",
[74] = "Light Blue",
[75] = "Util Dark Blue",
[76] = "Util Midnight Blue",
[77] = "Util Blue",
[78] = "Util Sea Foam Blue",
[79] = "Util Lightning blue",
[80] = "Util Maui Blue Poly",
[81] = "Util Bright Blue",
[82] = "Matte Dark Blue",
[83] = "Matte Blue",
[84] = "Matte Midnight Blue",
[85] = "Worn Dark blue",
[86] = "Worn Blue",
[87] = "Worn Light blue",
[88] = "Metallic Taxi Yellow",
[89] = "Metallic Race Yellow",
[90] = "Metallic Bronze",
[91] = "Metallic Yellow Bird",
[92] = "Metallic Lime",
[93] = "Metallic Champagne",
[94] = "Metallic Pueblo Beige",
[95] = "Metallic Dark Ivory",
[96] = "Metallic Choco Brown",
[97] = "Metallic Golden Brown",
[98] = "Metallic Light Brown",
[99] = "Metallic Straw Beige",
[100] = "Metallic Moss Brown",
[101] = "Metallic Biston Brown",
[102] = "Metallic Beechwood",
[103] = "Metallic Dark Beechwood",
[104] = "Metallic Choco Orange",
[105] = "Metallic Beach Sand",
[106] = "Metallic Sun Bleeched Sand",
[107] = "Metallic Cream",
[108] = "Util Brown",
[109] = "Util Medium Brown",
[110] = "Util Light Brown",
[111] = "Metallic White",
[112] = "Metallic Frost White",
[113] = "Worn Honey Beige",
[114] = "Worn Brown",
[115] = "Worn Dark Brown",
[116] = "Worn straw beige",
[117] = "Brushed Steel",
[118] = "Brushed Black steel",
[119] = "Brushed Aluminium",
[120] = "Chrome",
[121] = "Worn Off White",
[122] = "Util Off White",
[123] = "Worn Orange",
[124] = "Worn Light Orange",
[125] = "Metallic Securicor Green",
[126] = "Worn Taxi Yellow",
[127] = "police car blue",
[128] = "Matte Green",
[129] = "Matte Brown",
[130] = "Worn Orange",
[131] = "Matte White",
[132] = "Worn White",
[133] = "Worn Olive Army Green",
[134] = "Pure White",
[135] = "Hot Pink",
[136] = "Salmon Pink",
[137] = "Pfister Pink",
[138] = "Bright Orange",
[139] = "Red",
[140] = "Dark Red",
[141] = "Midnight Blue",
[142] = "Midnight Purple",
[143] = "Wine Red",
[144] = "Matte Black",
[145] = "Matte Gray",
[146] = "Light Gray",
[147] = "Util Black",
[148] = "Util Silver",
[149] = "Util Gun Metal",
[150] = "Util Shadow Silver",
[151] = "Worn Black",
[152] = "Worn Graphite",
[153] = "Worn Silver Grey",
[154] = "Worn Silver",
[155] = "Worn Blue Silver",
[156] = "Worn Shadow Silver",
[157] = "Metallic Red"
-- Add more colors as needed
}
function GetVehicleColorName(vehicle)
local primaryColor, _ = GetVehicleColours(vehicle)
return colorNames[primaryColor] or "Unknown"
end
@@ -0,0 +1,152 @@
local vehicleMakes = {
["ADDER"] = "Truffade",
["AIRBUS"] = "Jobuilt",
["AIRTUG"] = "Stanley",
["AKUMA"] = "Dinka",
["ALPHA"] = "Albany",
["AMBULANCE"] = "Brute",
["ANNIHILATOR"] = "Nagasaki",
["ARMYTANKER"] = "HVY",
["ASEA"] = "Declasse",
["ASTEROPE"] = "Karin",
["BAGGER"] = "Western",
["BALLER"] = "Gallivanter",
["BANSHEE"] = "Bravado",
["BARRACKS"] = "HVY",
["BATI"] = "Pegassi",
["BENSON"] = "Vapid",
["BESRA"] = "Western",
["BESTIAGTS"] = "Grotti",
["BF400"] = "Nagasaki",
["BFINJECTION"] = "BF",
["BIFTA"] = "BF",
["BISON"] = "Bravado",
["BLAZER"] = "Nagasaki",
["BLAZER3"] = "Nagasaki",
["BLAZER4"] = "Nagasaki",
["BLAZER5"] = "Nagasaki",
["BLIMP"] = "Atomic",
["BOBCATXL"] = "Vapid",
["BODHI2"] = "Canis",
["BOXVILLE"] = "Brute",
["BRIOSO"] = "Grotti",
["BTYPE"] = "Albany",
["BUCCANEER"] = "Albany",
["BUFFALO"] = "Bravado",
["BULLET"] = "Vapid",
["BURRITO"] = "Declasse",
["BUS"] = "Brute",
["CADDY"] = "Nagasaki",
["CAMPER"] = "Brute",
["CARBONIZZARE"] = "Grotti",
["CARBONRS"] = "Nagasaki",
["CAVALCADE"] = "Albany",
["CHEETAH"] = "Grotti",
["CHINO"] = "Vapid",
["COGNOSCENTI"] = "Enus",
["COMET"] = "Pfister",
["COQUETTE"] = "Invetero",
["CRUISER"] = "Bike",
["CRUSADER"] = "Canis",
["CUBAN800"] = "Western Company",
["DILETTANTE"] = "Karin",
["DOMINATOR"] = "Vapid",
["DUKES"] = "Imponte",
["DUMP"] = "HVY",
["DUNE"] = "Nagasaki",
["DUSTER"] = "Western Company",
["ELEGY"] = "Annis",
["EMPEROR"] = "Albany",
["ENTITYXF"] = "Overflod",
["EXEMPLAR"] = "Dewbauchee",
["F620"] = "Ocelot",
["FAGGIO"] = "Pegassi",
["FELON"] = "Lampadati",
["FELTZER"] = "Benefactor",
["FIRETRUK"] = "MTL",
["FORKLIFT"] = "HVY",
["FQ2"] = "Fathom",
["FUROREGT"] = "Lampadati",
["FUGITIVE"] = "Cheval",
["GAUNTLET"] = "Bravado",
["HEXER"] = "LCC",
["HOTKNIFE"] = "Vapid",
["HUNTLEY"] = "Enus",
["INFERNUS"] = "Pegassi",
["INTRUDER"] = "Karin",
["ISSI2"] = "Weeny",
["JACKAL"] = "Ocelot",
["JB700"] = "Dewbauchee",
["JESTER"] = "Dinka",
["KHAMELION"] = "Hijak",
["KURUMA"] = "Karin",
["LANDSTALKER"] = "Dundreary",
["LURCHER"] = "Albany",
["LUXOR"] = "Buckingham",
["MAMBA"] = "Declasse",
["MANANA"] = "Albany",
["MASSACRO"] = "Dewbauchee",
["MESA"] = "Canis",
["MINIVAN"] = "Vapid",
["MONROE"] = "Pegassi",
["NEMESIS"] = "Principe",
["NINEF"] = "Obey",
["OMNIS"] = "Obey",
["ORACLE"] = "Ubermacht",
["OSIRIS"] = "Pegassi",
["PATRIOT"] = "Mammoth",
["PENUMBRA"] = "Maibatsu",
["PEYOTE"] = "Vapid",
["PHANTOM"] = "Jobuilt",
["PHOENIX"] = "Imponte",
["PICADOR"] = "Cheval",
["PIGALLE"] = "Lampadati",
["PRAIRIE"] = "Bollokan",
["PRIMO"] = "Albany",
["RADI"] = "Vapid",
["RAPIDGT"] = "Dewbauchee",
["REBEL"] = "Annis",
["REGINA"] = "Dundreary",
["RENTALBUS"] = "Dashound",
["RUFFIAN"] = "Pegassi",
["RUMPO"] = "Bravado",
["SABREGT"] = "Declasse",
["SADLER"] = "Vapid",
["SANCHEZ"] = "Maibatsu",
["SCHAFTER"] = "Benefactor",
["SEASHARK"] = "Speedophile",
["SENTINEL"] = "Ubermacht",
["SERRANO"] = "Benefactor",
["SLAMVAN"] = "Vapid",
["SOVEREIGN"] = "Western",
["SQUALO"] = "Shitzu",
["STANIER"] = "Vapid",
["STINGER"] = "Grotti",
["STRATUM"] = "Zirconium",
["STRETCH"] = "Dundreary",
["SULTAN"] = "Karin",
["SUPERD"] = "Enus",
["SURANO"] = "Benefactor",
["SURFER"] = "BF",
["T20"] = "Progen",
["TAMPA"] = "Declasse",
["THRUST"] = "Dinka",
["TORNADO"] = "Declasse",
["TROPHYTRUCK"] = "Vapid",
["TURISMOR"] = "Grotti",
["VACCA"] = "Pegassi",
["VIGERO"] = "Declasse",
["VIRGO"] = "Albany",
["VOODOO"] = "Declasse",
["WASHINGTON"] = "Albany",
["WINDSOR"] = "Enus",
["ZENTORNO"] = "Pegassi",
["ZION"] = "Ubermacht",
["ZTYPE"] = "Truffade",
-- Add more as needed
}
function GetVehicleMakeName(vehicleModelName)
return vehicleMakes[vehicleModelName] or nil
end
+1
View File
@@ -0,0 +1 @@
https://docs.imperialcad.app/api-and-integrations/fivem-installation
+77
View File
@@ -0,0 +1,77 @@
Config = {}
--This literally will just flood anything helpful for debugging, If your not debugging dont use it.
Config.debug = false
Config.DisableVersionCheck = false -- Why would you even do this? It disbales the version check on resource start
--Make it so the tablet only can be accessed inside of a emergency vehicle?
Config.tabletCarRestriction = false
----QB Core Frame work, and its configuration - This is meant for base QBCore events, and functions.
Config.isQB = false -- Vehicles, Characters
Config.QBRegCurrent = false -- Literally will register a character when a previous is loaded (not created/deleted), as long as that unique citizen ID isnt already in the CAD.
--Nat2K15 Frame work, and its configuration
Config.isNAT2K15 = false
Config.resourceName = "framework"
----QBX Core Frame work, and its configuration - This is meant for base QBCore events, and functions.
Config.isQBX = false
--ERS Integration / Support - Simply tells our ImperialCAD resource to listen for the ERS events and integrations. (This required the Advanced plan or higher)
Config.ERSsupport = true
Config.UseERSPulloverEnded = true -- This often results in premature call closes and isnt recommended, but if set to true we will close your current call if ERS says your pullover is ended.
Config.UseERSCalloutEnded = true -- This may results in premature call closes, but if set to true we will close your current call if ERS says your callout has ended.
Config.UseERSCalloutCompletedSuccesfully = true -- This may results in premature call closes, but if set to true we will close your current call if ERS says your callout was completed.
Config.ImperialDutySync = true -- ImperialDuty will sync with the event ERS transmit based on shift toggles.
--Enable livemap support? (This requires a Premium plan)
Config.livemap = true
--This will mark them off duty once they leave the game. (Requires a verfified discord ID, and they must be active within your community on the CAD)
Config.cadkickonleave = true
--simply requires them to do /verify to ensure there discord ID matches a verified account within ImperialCAD
Config.requireVerify = false -- NOT FINISHED
-- This will determine how often ImperialLocation will update each users current postal, city, and county for ImperialCAD API calls. (Only change this if you are experincing performance issues.)
Config.locationFrequency = 2000
Config.DisableDutyCommand = false -- Enabling this basically just listens for its events to mark users duty for in-game notis and prevents our command from registering
Config.GiveLEOWeapons = true -- If you want to give weapons to the players who go on duty as LEO
Config.LEOWeapons = {
"WEAPON_COMBATPISTOL",
"WEAPON_STUNGUN",
"WEAPON_NIGHTSTICK",
"WEAPON_FLASHLIGHT",
"WEAPON_CARBINERIFLE",
"WEAPON_FIREEXTINGUISHER",
"WEAPON_PUMPSHOTGUN"
}
Config.GiveFIREWeapons = true -- If you want to give weapons to the players who go on duty as FIRE
Config.FIREWeapons = {
"WEAPON_FIREEXTINGUISHER",
}
Config.SendWebhook = false -- If you want to send a webhook when someone goes on/off duty
Config.WebhookURL = "https://elite-gaming.gg" -- Webhook URL
--Should these chat commands exist:
Config.TsThroughChat = true
Config.PlateThroughChat = true -- Allows users to run a plate using the /rplate command
Config.AttachThroughChat = true
Config.Allow911Command = true -- This will allow /a911 for Anonymous calls and /911 for normal calls that trys to send a caller based on active civ or username, if you dont need it, disable it.
--Should a radius style blip appear on the map for new 911 calls? (This works with ImperialDuty)
Config.callBlip = true
Config.callBlipDuration = 5 --In minutes
--Traffic Stop command Related config (This is useless if your "Config.TsThroughChat" is false)
Config.trafficsnature = "Traffic Stop"
Config.trafficspriority = "3"
Config.trafficsstatus = "ACTIVE"
@@ -0,0 +1,87 @@
[
{
"city": "Vinewood",
"x": 254.06,
"y": 338.64
},
{
"city": "Mirror Park",
"x": 1174.81,
"y": -532.5
},
{
"city": "La Mesa",
"x": 1063.63,
"y": -1828.26
},
{
"city": "La Puerta",
"x": -642.25,
"y": -2028.5
},
{
"city": "Little Seoul",
"x": -681.31,
"y": -838.61
},
{
"city": "Del Perro",
"x": -1438.16,
"y": -754.28
},
{
"city": "Rockford",
"x": -894.57,
"y": -319.58
},
{
"city": "Mount Chiliad",
"x": 496.2,
"y": 5585.61
},
{
"city": "Mount Chiliad Wilderness",
"x": -934.75,
"y": 4841.97
},
{
"city": "Mount Josiah",
"x": -1207.62,
"y": 3850.77
},
{
"city": "Stab City",
"x": 62.29,
"y": 3684.16
},
{
"city": "Harmony",
"x": 285.86,
"y": 2642.28
},
{
"city": "San Chianski",
"x": 3433.83,
"y": 4167.18
},
{
"city": "Grapeseed",
"x": 2031.42,
"y": 4917.24
},
{
"city": "Sandy Shores",
"x": 1829.39,
"y": 3689.42
},
{
"city": "Paleto Bay",
"x": -177.71,
"y": 6363
},
{
"city": "Fort Zancudo",
"x": -2188.65,
"y": 3148.58
}
]
@@ -0,0 +1,17 @@
[
{
"county": "Los Angeles County",
"x": 147.96,
"y": 2589.43
},
{
"county": "Los Angeles County",
"x": -404.79,
"y": 1186.31
},
{
"county": "Los Angeles County",
"x": -317.87,
"y": 8035.01
}
]
File diff suppressed because one or more lines are too long
+47
View File
@@ -0,0 +1,47 @@
--[[
Imperial Export for FiveM
DO NOT EDIT THIS FILE UNLESS YOU KNOW WHAT YOUR DOING! Ripping or repurposing this script is not allowed.
]]--
fx_version 'cerulean'
game 'gta5'
author 'Zippy OFC'
description 'Imperial CAD FiveM integration'
version '1.2.4'
ui_page 'plugins/ImperialTablet/html/index.html'
server_script {
'utils/imperialEmergency.lua',
'utils/imperialCharacter.lua',
'main/sv.lua',
'utils/framework.lua',
'utils/misc.lua',
'plugins/**/sv_*.lua',
'main/sv_calls.lua',
--'plugins/**/sv_*.js',
}
client_script {
'main/cl.lua',
--'plugins/**/cl_*.js',
'plugins/**/cl_*.lua',
'utils/cl_fw.lua'
}
shared_script {
'config.lua',
'Library/colors.lua', -- Colors library (This list may require more colors!)
'Library/vehicles.lua', -- vehicles library (Update addon vehicles as needed)
'@ox_lib/init.lua',
}
dependencies {
'ox_lib'
}
files {
'plugins/ImperialTablet/html/index.html',
'plugins/ImperialTablet/html/script.js',
}
+262
View File
@@ -0,0 +1,262 @@
--[[
Imperial Export for FiveM
DO NOT EDIT THIS FILE UNLESS YOU KNOW WHAT YOUR DOING!
]]--
local callTimer = 0
local blips = {}
local isPanic = false
Citizen.CreateThread(function()
while true do
Citizen.Wait(1000)
if callTimer > 0 then
callTimer = callTimer - 1
end
end
end)
if Config.Allow911Command then
TriggerEvent('chat:addSuggestion', '/911', 'Call Emergency Services', {
{ name = "Information", help = "Description of your call." }
})
RegisterCommand('911', function(source, args)
local message = table.concat(args, " ")
local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed)
local streetHash, crossStreetHash = GetStreetNameAtCoord(coords.x, coords.y, coords.z)
local name = exports["ImperialCAD"]:GetStoredName()
if name == nil or name == "" then
name = GetPlayerName(PlayerId())
end
if message == nil or message == "" then
Notify("You need to include the ~o~call information ~w~first before calling ~r~Emergency Services.")
return
end
if callTimer > 0 then
Notify("You must wait ~o~" .. callTimer .. " seconds ~w~before calling ~r~emergency services ~w~again.")
return
end
local callData = {
name = name,
street = GetStreetNameFromHashKey(streetHash),
crossStreet = GetStreetNameFromHashKey(crossStreetHash) or "N/A",
postal = GetImperialPostal(),
city = GetImperialCity(),
county = GetImperialCounty(),
info = message,
coords = coords
}
TriggerServerEvent('ImperialCAD:New911', callData)
end, false)
TriggerEvent('chat:addSuggestion', '/a911', 'Call Emergency Services but Anonymously', {
{ name = "Information", help = "Description of your call." }
})
RegisterCommand('a911', function(source, args)
local message = table.concat(args, " ")
local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed)
local streetHash, crossStreetHash = GetStreetNameAtCoord(coords.x, coords.y, coords.z)
if message == nil or message == "" then
Notify("You need to include the ~o~call information ~w~first before calling ~r~Emergency Services.")
return
end
if callTimer > 0 then
Notify("You must wait ~o~" .. callTimer .. " seconds ~w~before calling ~r~emergency services ~w~again.")
return
end
local callData = {
name = "Anonymous Caller",
street = GetStreetNameFromHashKey(streetHash),
crossStreet = GetStreetNameFromHashKey(crossStreetHash) or "N/A",
postal = GetImperialPostal(),
city = GetImperialCity(),
county = GetImperialCounty(),
info = message,
coords = coords
}
TriggerServerEvent('ImperialCAD:New911', callData)
end, false)
end
if Config.PlateThroughChat then
TriggerEvent('chat:addSuggestion', '/rplate', 'Run vehicle plate', {
{ name = "plate", help = "the plate to search" }
})
RegisterCommand('rplate', function(source, args, rawCommand)
local plate = table.concat(args, " ")
if plate == nil or plate == "" then
print('plate not in command')
TriggerEvent('ox_lib:alertDialog', {
header = "No Last Idea",
content = "There is no last idea stored.",
centered = true,
cancel = false,
size = 'md'
})
return
end
local callData = {
plate = plate
}
if Config.debug then
print("[Rplate] Sending a plate check to the server side.")
end
TriggerServerEvent('ImperialCAD:CheckPlate', callData)
print("[Rplate] Sent a plate check to the server side.")
end, false)
end
RegisterCommand('panic', function()
local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed)
local streetHash, crossStreetHash = GetStreetNameAtCoord(coords.x, coords.y, coords.z)
local callData = {
postal = GetImperialPostal(),
street = GetStreetNameFromHashKey(streetHash)
}
if isPanic then
isPanic = false
print("[Imperial-Panic] Clearing panic, Panic was true")
TriggerServerEvent('ImperialCAD:ClearPanic', callData)
else
isPanic = true
print("[Imperial-Panic] Triggering panic, Panic was false")
TriggerServerEvent('ImperialCAD:Panic', callData)
end
end, false)
if Config.TsThroughChat then
TriggerEvent('chat:addSuggestion', '/ts', 'Create a traffic stop in ImperialCAD', {
{ name = "Information", help = "Description of your traffic stop." }
})
RegisterCommand('ts', function(source, args, rawCommand)
local message = table.concat(args, " ")
local playerPed = PlayerPedId()
local coords = GetEntityCoords(playerPed)
local streetHash, crossStreetHash = GetStreetNameAtCoord(coords.x, coords.y, coords.z)
if message == "" then
message = "Traffic Stop Initiated"
end
local callData = {
street = GetStreetNameFromHashKey(streetHash),
cross_street = GetStreetNameFromHashKey(crossStreetHash),
postal = GetImperialPostal(),
city = GetImperialCity(),
county = GetImperialCounty(),
info = message
}
TriggerServerEvent('ImperialCAD:TrafficStop', callData)
end, false)
end
if Config.AttachThroughChat then
TriggerEvent('chat:addSuggestion', '/attach', 'Attach to a ImperialCAD call', {
{ name = "callnum", help = "Call number to attach" }
})
RegisterCommand('attach', function(source, args, rawCommand)
local message = args[1]
local callData = {
callnum = message
}
TriggerServerEvent('ImperialCAD:AttachCall', callData)
end, false)
end
RegisterNetEvent("ImperialCAD:Client:Notify")
AddEventHandler("ImperialCAD:Client:Notify", function(messages)
Notify(messages)
end)
function Notify(message)
local fullMessage = "[IMPERIAL] " .. message
BeginTextCommandThefeedPost("STRING");
AddTextComponentSubstringPlayerName(fullMessage);
EndTextCommandThefeedPostMessagetext("CHAR_CALL911", "CHAR_CALL911", true, 1, "Imperial911", "Emergency Services");
end
RegisterNetEvent("Imperial:911BlipForOnduty")
AddEventHandler("Imperial:911BlipForOnduty", function(coords)
local name = GetPlayerName(PlayerId())
local blipId = math.random(100000, 999999)
local offsetX = math.random(-50, 50)
local offsetY = math.random(-50, 50)
local newX = coords.x + offsetX
local newY = coords.y + offsetY
local radiusBlip = AddBlipForRadius(newX, newY, coords.z, 500.0)
SetBlipHighDetail(radiusBlip, true)
SetBlipColour(radiusBlip, 1)
SetBlipAlpha(radiusBlip, 128)
SetBlipSprite(radiusBlip, 3)
local coordBlip = AddBlipForCoord(newX, newY, coords.z)
SetBlipSprite(coordBlip, 2)
SetBlipDisplay(coordBlip, 2)
SetBlipScale(coordBlip, 0.8)
SetBlipColour(coordBlip, 1)
SetBlipAsShortRange(coordBlip, true)
BeginTextCommandSetBlipName("STRING")
AddTextComponentString("911 - " .. name )
EndTextCommandSetBlipName(coordBlip)
blips[blipId] = {radiusBlip = radiusBlip, coordBlip = coordBlip, x = newX, y = newY, z = coords.z}
Citizen.CreateThread(function()
Citizen.Wait(Config.callBlipDuration * 60000)
if blips[blipId] then
if blips[blipId].radiusBlip then RemoveBlip(blips[blipId].radiusBlip) end
if blips[blipId].coordBlip then RemoveBlip(blips[blipId].coordBlip) end
blips[blipId] = nil
if Config.debug then print("Blip ID " .. blipId .. " has been automatically removed after 5 minutes.") end
end
end)
end)
lib.callback.register('ImperialCAD:getNearestStreets', function(coords)
local streetHash, crossStreetHash = GetStreetNameAtCoord(coords.x, coords.y, coords.z)
local street = GetStreetNameFromHashKey(streetHash)
local crossStreet = GetStreetNameFromHashKey(crossStreetHash)
local response = {street = street, crossStreet = crossStreet}
return response
end)
+509
View File
@@ -0,0 +1,509 @@
--[[
Imperial Export for FiveM
DO NOT EDIT THIS FILE UNLESS YOU KNOW WHAT YOUR DOING!
]]--
local function getVersionFromManifest()
local path = GetResourcePath(GetCurrentResourceName()) .. '/fxmanifest.lua'
local file = io.open(path, "r")
if file then
local content = file:read("*a")
file:close()
for line in string.gmatch(content, "[^\r\n]+") do
local value = string.match(line, "^version%s+'(.+)'$")
if value then
return value
end
end
end
return 'unknown'
end
local versionUrl = 'https://raw.githubusercontent.com/Zippy01/ImperialCAD/main/version.json'
local latestVersion = "0.0.0.0"
local function checkForUpdates()
local currentVersion = getVersionFromManifest()
local debugMode = Config.debug and "^2Enabled^7" or "^1Disabled^7"
local function checkConvarStatus(name)
local value = GetConvar(name, "")
if not value or value == "" then
return "^1Missing^7"
elseif #value < 15 then
return "^3Present (Possibly Invalid)^7"
else
return "^2Present (Appears Valid)^7"
end
end
local commIdStatus = checkConvarStatus("imperial_community_id")
local apiKeyStatus = checkConvarStatus("imperialAPI")
PerformHttpRequest(versionUrl, function(err, responseText, headers)
local status = "Unknown"
local updateAvailable = false
local latest = "Unknown"
if err == 200 and responseText and responseText:match("{") then
local success, data = pcall(json.decode, responseText)
if success and data and data.latestVersion then
latestVersion = data.latestVersion
latest = latestVersion
if latestVersion ~= currentVersion then
status = "^1Update Available^7"
updateAvailable = true
else
status = "^2Up to Date^7"
end
else
status = "^3Version Check Failed^7"
end
else
status = "^1Failed to Reach Update Server^7"
end
print("\n^4=======================[ ImperialCAD ]=======================^7")
print(" ^5Current Version:^7 " .. currentVersion)
print(" ^5Latest Version:^7 " .. latest)
print(" ^5Update Status:^7 " .. status)
print(" ^5Debug Mode:^7 " .. debugMode)
print(" ^5Community ID:^7 " .. commIdStatus)
print(" ^5API Key:^7 " .. apiKeyStatus)
print("^4============================================================\n^7")
if updateAvailable then
print("^3[ImperialCAD]^7 Visit ^4https://github.com/Zippy01/ImperialCAD^7 to download the latest version.")
end
end, 'GET', '')
end
AddEventHandler('onResourceStart', function(resourceName)
if resourceName ~= GetCurrentResourceName() then return end
if GetCurrentResourceName() ~= "ImperialCAD" then
print("[^1ImperialCAD^7] Invalid script name. This script MUST be named ^3'ImperialCAD'^7 to work properly!")
return
end
print('[ImperialCAD] Hello World!')
if Config.DisableVersionCheck then return end
Wait(5000)
checkForUpdates()
end)
if Config.cadkickonleave then
AddEventHandler('playerDropped', function(reason, resourceName, clientDropReason)
local playerName = GetPlayerName(source)
print('Player' .. playerName .. ' dropped, telling ImperialCAD to cleanup')
local discordId = getDiscordId(source)
if not discordId then
print("^3[WARN]^7 Discord ID not found for " .. playerName .. "Cannot attempt cleanup")
else
if Config.debug then
print("Attempting to mark "..playerName.." off duty in cad, using the discord id "..discordId)
end
exports["ImperialCAD"]:Booter({
users_discordID = discordId
}, function(success, resultData)
if success then
local apires = json.decode(resultData)
if Config.debug then
print("[ImperialCleanup] Player was successfully marked off duty, and cleaned up in the CAD")
end
else
if Config.debug then
print("[ImperialCleanup] Unable to mark user off duty, This player might not be logged in")
end
end
end)
end end)
end
RegisterNetEvent('ImperialCAD:New911')
AddEventHandler('ImperialCAD:New911', function(callData)
if not callData.name or not callData.street or not callData.crossStreet or not callData.postal or not callData.info then
print("[Imperial911] Missing required call data to create a new 911 call, Will not create.")
return
end
local player = source
local coords = callData.coords
exports["ImperialCAD"]:Create911Call({
name = callData.name,
street = callData.street,
crossStreet = callData.crossStreet,
info = callData.info,
postal = callData.postal,
city = callData.city,
county = callData.county
}, function(success, resultData)
if success then
local apires = json.decode(resultData)
if not apires or not apires.response or not apires.response.callId then
print("^1[API_ERROR]^7 Invalid response or call ID not found")
return false
end
local callNum = apires.response.callnum
print("[Imperial911] 911 Call was successfully created")
TriggerEvent('Imperial:911ChatMessage', callData.name, callData.street, callData.info, callData.crossStreet, callData.postal, callNum)
if Config.callBlip then
TriggerEvent("ImperialCAD:911Blip", coords)
end
TriggerClientEvent('ImperialCAD:Client:Notify', player, "Your call was successfully sent to emergency services.")
else
TriggerClientEvent('ImperialCAD:Client:Notify', player, "Looks like dispatch is having trouble, We let officers know tho.")
TriggerEvent('Imperial:911ChatMessage', callData.name, callData.street, callData.info, callData.crossStreet, callData.postal)
if Config.callBlip then
TriggerEvent("ImperialCAD:911Blip", coords)
end
end
end)
end)
function Notify(message, playerId)
if playerId and message then
if Config.debug then print("[ImperialCAD] Trying to notify player: "..playerId) end
TriggerClientEvent('chat:addMessage', playerId, {
color = {255, 0, 0},
multiline = true,
args = {"ImperialCAD", message}
})
elseif not message then
print("[IMPERIAL_SV_NOTIFY] No message provided")
elseif not playerId then
print("[IMPERIAL_SV_NOTIFY] No playerId provided")
else
print("[IMPERIAL_SV_NOTIFY] Couldnt send message")
end
end
if Config.PlateThroughChat then
RegisterNetEvent('ImperialCAD:CheckPlate')
AddEventHandler('ImperialCAD:CheckPlate', function(callData)
local src = source
if Config.debug then
print("[ImperialRplate] Checking plate: " .. callData.plate.." on the server side")
end
if not callData.plate then
print("[ImperialRplate] Request made without plate, killing early")
return
end
exports["ImperialCAD"]:CheckPlate({
plate = callData.plate
}, function(success, resultData)
if not success or not resultData then
Notify(""..callData.plate.." Was ran without a successful result, is it registered?", src)
end
local data = json.decode(resultData)
if not data then
print("[ImperialRplate] Invalid API response, Killing early")
return
end
local response = data.response
local messages = {}
if success and resultData then
Notify("The following flags/alerts where found for plate: " .. response.plate, src) -- @TODO
end
if not success or not resultData then
table.insert(messages, "Could not find vehicle with the plate: "..callData.plate)
end
if success then -- If api returns success then check the actual return
if response.stolen then
table.insert(messages, "Stolen Vehicle")
end
if not response.insurance then
table.insert(messages, "No Insurance")
end
if response.insurance and response.insurance_status ~= "ACTIVE" then
table.insert(messages, "Invalid Insurance")
end
if response.business then
table.insert(messages, "Commercial Vehicle")
end
if response.reg_status ~= "ACTIVE" then
table.insert(messages, "Invalid Vehicle registration")
end
if response.owner_wanted then
table.insert(messages, "Owner Wanted")
end
if response.owner_dl_status ~= "ACTIVE" then
table.insert(messages, "Invalid license")
end
end -- end of the addtional checks
if #messages > 0 then
print("It should work btw "..src)
TriggerClientEvent('ImperialCAD:Client:Notify', src, json.encode(messages))
end
end)
end)
end
RegisterNetEvent('ImperialCAD:TrafficStop')
AddEventHandler('ImperialCAD:TrafficStop', function(callData)
local player = source
exports["ImperialCAD"]:CreateCall({
users_discordID = getDiscordId(source),
street = callData.street,
cross_street = callData.crossStreet,
postal = callData.postal,
city = callData.city,
county = callData.county,
info = callData.info,
nature = Config.trafficsnature,
status = Config.trafficsstatus,
priority = Config.trafficspriority
}, function(success, resultData)
if success then
local apires = json.decode(resultData)
if not apires or not apires.response or not apires.response.callId then
if Config.debug then print("^1[ERROR]^7 Invalid response or call ID not found") end
Notify("[TS] Unable to create traffic stop", player)
return
end
local callnum = apires.response.callnum
if Config.debug then print("Traffic Stop created successfully: Call ID -", callnum) end
Notify("[TS] Traffic stop created succesfully, Call Number: "..callnum, player)
else
Notify("[TS] Unable to create traffic stop", player)
print(resultData)
end
end)
end)
RegisterNetEvent('ImperialCAD:AttachCall')
AddEventHandler('ImperialCAD:AttachCall', function(callData)
local player = source
exports["ImperialCAD"]:AttachCall({
users_discordID = getDiscordId(source),
callnum = callData.callnum
}, function(success, resultData)
local result = json.decode(resultData)
local status = result.status
local message = result.message
local response = result.response
if success and status ~= "success" then success = false end
if status == "NOT_RUN" then
status = "Unkown error and status"
elseif status == "BUSY" then
status = "You must be on duty and available to accept new calls"
elseif status == "NoSelfDisp" then
status = "Disptach has marked emergency calls as dispatch only, Please check your cad or reference dispatch"
end
if not success then
Notify(string.format("[Attach] Unable to attach you, reason: %s", status), player)
elseif success then
Notify("[Attach] Attached to call number "..response.callnum, player)
elseif not success and Config.debug then
Notify(string.format("[Attach - Debug] Unable to attach you, Status: %s | Reason: %", status, message), player)
end
end)
end)
RegisterNetEvent('ImperialCAD:CloseCall')
AddEventHandler('ImperialCAD:CloseCall', function(callData)
exports["ImperialCAD"]:DeleteCall({
discordid = getDiscordId(source),
callId = callData.callId,
}, function(success, resultData)
end)
end)
RegisterNetEvent('ImperialCAD:Panic')
AddEventHandler('ImperialCAD:Panic', function(callData)
exports["ImperialCAD"]:Panic({
users_discordID = getDiscordId(source),
postal = callData.postal,
street = callData.street
}, function(success, resultData)
if success then
print("Panic was triggered")
else
print("Unable to trigger panic")
end
end)
end)
RegisterNetEvent('ImperialCAD:ClearPanic')
AddEventHandler('ImperialCAD:ClearPanic', function()
exports["ImperialCAD"]:ClearPanic(function(success, resultData)
if success then
print("Panic was cleared")
else
print("Unable to clear community panic")
end
end)
end)
RegisterNetEvent("ImperialCAD:Server:NewNotify")
AddEventHandler("ImperialCAD:Server:NewNotify", function(callData)
local d = callData or {}
if not d then print("ImperialCAD Could not create a new dispatch, No callData was found. Returning early") return false end
local street = d.street or "Unknown"
local crossStreet = d.crossStreet or "N/A"
local postal = d.postal or "00000"
local city = d.city or "N/A"
local county = d.county or "N/A"
local nature = d.nature or "No Nature Provided"
local status = d.status or "ACTIVE"
local priority = d.priority or 2
if not d.cords or d.cords == "" then
print("ImperialCAD Could not create a new dispatch, No cords were found. Returning early")
return false
end
local cords = d.cords
local message = d.message or "No information provided"
local cmessage = d.cmessage or "No Information provided"
local job = d.job or "Unknown"
exports["ImperialCAD"]:CreateCall({
users_discordID = "",
street = street,
crossStreet = crossStreet,
postal = postal,
city = city,
county = county,
info = message,
nature = nature,
status = status,
priority = priority
}, function(success, resultData)
if success then
local apires = json.decode(resultData)
if not apires or not apires.response or not apires.response.callId then
print("^1[API_ERROR]^7 Invalid response or call ID not found")
return false
end
local callNum = apires.response.callnum
print("New Dispatch CAD Call created successfully: Call ID -", callNum)
local chatMessage = {
multiline = true,
args = {
"^8(ImperialCAD - New Call For Service)",
"^7\nPostal: ^3" .. postal ..
"^7\nStreet: ^3" .. street ..
"^7\nCross Street: ^3" .. crossStreet ..
"^7\nInformation: ^3" .. cmessage ..
"^7\nCall Number: ^3" .. callNum
}
}
local successDuty, onDutyUnits = pcall(function()
if job == "LEO" then
return exports["ImperialCAD"]:GetOnDutyLEOUnits()
elseif job == "FIRE" then
return exports["ImperialCAD"]:GetOnDutyFireUnits()
else
return exports["ImperialCAD"]:GetOnDutyUnits()
end
end)
if successDuty and onDutyUnits then
for _, playerId in ipairs(onDutyUnits) do
TriggerClientEvent("chat:addMessage", playerId, chatMessage)
TriggerClientEvent("Imperial:911BlipForOnduty", playerId, cords)
end
if Config.debug then print("Blips and messages sent to on-duty units.") end
else
TriggerClientEvent("chat:addMessage", -1, chatMessage)
if Config.debug then print("Duty unit fetch failed. Message sent to all.") end
end
else
print("New Imperial Dispatch call failed: "..resultData)
end
end)
end)
RegisterNetEvent("Imperial:911ChatMessage")
AddEventHandler("Imperial:911ChatMessage", function(name, street, message, crossStreet, postal, callNum)
if not callNum then callNum = "ERROR" end
local chatMessage = {
multiline = true,
args = {"^8(ImperialCAD - New Call For Service)",
"\nName: ^3" .. name .. "^7\nPostal: ^3" .. postal .. "^7\nStreet: ^3" .. street ..
"^7\nCross Street: ^3" .. crossStreet .. "^7\nInformation: ^3" .. message .. "^7\nCall Number: ^3" .. callNum
}
}
local success, onDutyUnits = pcall(function()
return exports["ImperialCAD"]:GetOnDutyUnits()
end)
if success and onDutyUnits then
for _, playerId in ipairs(onDutyUnits) do
TriggerClientEvent("chat:addMessage", playerId, chatMessage)
end
else
TriggerClientEvent("chat:addMessage", -1, chatMessage)
end
end)
RegisterNetEvent("ImperialCAD:911Blip")
AddEventHandler("ImperialCAD:911Blip", function(coords)
local success, OnDutyUnitsFound = pcall(function()
return exports["ImperialCAD"]:GetOnDutyUnits()
end)
if success then
for _, playerId in ipairs(OnDutyUnitsFound) do
if Config.debug then
print("We found ImperialDuty, Proceeding with blips")
end
TriggerClientEvent("Imperial:911BlipForOnduty", playerId, coords)
end
else
if Config.debug then
print("Couldnt find ImperialDuty, proceeding without blip.")
end
end
end)
@@ -0,0 +1,34 @@
callsBySrc = {} -- { [src] = callNo }
local function _asNumberOrString(v)
return tonumber(v) or v
end
function addCall(src, callNo)
if Config.debug then print('Adding call num: '..callNo..' to player: '..src) end
callNo = _asNumberOrString(callNo)
if not callNo then return false end
callsBySrc[src] = callNo
return true
end
function getCall(src)
return callsBySrc[src] or nil
end
function removeCall(src)
if Config.deubg then print('[ImperialCAD_calls] Removing call '..callsBySrc[src]..' from player '..src) end
callsBySrc[src] = nil
end
AddEventHandler('playerDropped', function()
if Config.deubg then print('[ImperialCAD_calls] Player dropped, clearing last stored call') end
callsBySrc[source] = nil
end)
--[[ I may make this a thing later on..
exports('AddCallForSource', addCall)
exports('GetCallForSource', getCall)
exports('GetLastCallForSource', getLastCall)
exports('RemoveCallForSource', removeCall)
]]
@@ -0,0 +1,122 @@
local communityid = GetConvar("imperial_community_id", "")
local function Notify(message)
local fullMessage = "[IMPERIAL] " .. message
SetNotificationTextEntry("STRING")
AddTextComponentString(fullMessage)
DrawNotification(false, true)
end
AddEventHandler('playerSpawned', function()
local ssn = GetResourceKvpString("civ_ssn")
local name = GetResourceKvpString("civ_name")
local age = GetResourceKvpString("civ_age")
local address = GetResourceKvpString("civ_address")
local commId = GetResourceKvpString("commId")
if (ssn and #ssn > 8) and name and age and address and (commId == communityid) then
Notify("Your active civilian profile: " .. name)
else
Notify("You do not have an active civilian profile. Use /setciv to set one.")
end
end)
RegisterNetEvent("ImperialCAD:setActiveCiv")
AddEventHandler("ImperialCAD:setActiveCiv", function(data)
if data.ssn then
SetResourceKvp("civ_ssn", data.ssn)
SetResourceKvp("civ_name", data.name)
SetResourceKvp("civ_age", data.age)
SetResourceKvp("civ_address", data.address)
SetResourceKvp("commId", communityid)
Notify("Civilian profile activated: " .. data.name)
else
Notify("Data reception error. Please check server logs.")
DeleteResourceKvp("civ_ssn")
DeleteResourceKvp("civ_name")
DeleteResourceKvp("civ_age")
DeleteResourceKvp("civ_address")
DeleteResourceKvp("commId")
end
end)
RegisterCommand("setciv", function(source, args, rawCommand)
local ssn = args[1]
if ssn and #ssn > 8 then
TriggerServerEvent("ImperialCAD:getCivData", ssn)
else
Notify("Invalid SSN provided, Please check and try again.")
end
end, false)
RegisterCommand("getciv", function(source, args, rawCommand)
local name = GetResourceKvpString("civ_name")
local age = GetResourceKvpString("civ_age")
local commId = GetResourceKvpString("commId")
if name and age then
Notify("Current Civilian: Name - " .. name .. ", Age - " .. age .. ", Community ID - " .. commId)
else
Notify("No active civilian profile.")
end
end, false)
RegisterCommand("clearciv", function(source, args, rawCommand)
DeleteResourceKvp("civ_ssn")
DeleteResourceKvp("civ_name")
DeleteResourceKvp("civ_age")
DeleteResourceKvp("civ_address")
DeleteResourceKvp("commId")
Notify("Active civilian profile has been cleared.")
end, false)
RegisterCommand("regveh", function(source, args, rawCommand)
local ped = PlayerPedId()
if IsPedSittingInAnyVehicle(ped) then
local ssn = GetResourceKvpString("civ_ssn")
if ssn then
local vehicle = GetVehiclePedIsIn(ped, false)
local vehicleHash = GetEntityModel(vehicle)
local vehicleModelName = GetDisplayNameFromVehicleModel(vehicleHash)
local plate = GetVehicleNumberPlateText(vehicle)
local colorName = GetVehicleColorName(vehicle)
local makeName = GetVehicleMakeName(string.upper(vehicleModelName))
if vehicleModelName == "CARNOTFOUND" or vehicleModelName == nil then
vehicleModelName = "UNKNOWN"
Notify("Model Unknown, Proceeding anyways...")
end
local primaryColor, _ = GetVehicleColours(vehicle)
if Config.debug then
print("Color ID for this request is " .. primaryColor)
end
TriggerServerEvent("ImperialCAD:registerVehicleToCAD", ssn, vehicleModelName, plate, colorName, makeName)
Notify("Registration has been sent to the DMV.")
else
Notify("You must set an active civilian before registering a vehicle.")
end
else
Notify("You must be in a vehicle to register it.")
end
end, false)
function GetStoredSSN()
return GetResourceKvpString("civ_ssn")
end
exports('GetStoredSSN', GetStoredSSN)
print ()
function GetStoredName()
return GetResourceKvpString("civ_name")
end
exports('GetStoredName', GetStoredName)
print ()
@@ -0,0 +1,91 @@
RegisterNetEvent("ImperialCAD:getCivData")
AddEventHandler("ImperialCAD:getCivData", function(ssn)
local src = source
local headers = {
["Content-Type"] = "application/json",
["APIKEY"] = GetConvar("imperialAPI", ""),
}
local url = "https://imperialcad.app/api/1.1/wf/getcivdata"
local data = {
ssn = ssn,
commId = GetConvar("imperial_community_id", "")
}
local jsonData = json.encode(data)
PerformHttpRequest(url, function(statusCode, response, headers)
if statusCode == 200 then
local responseData = json.decode(response)
if responseData and responseData.ssn then
TriggerClientEvent("ImperialCAD:setActiveCiv", src, responseData)
SetActiveCiv({users_discordID = getDiscordId(src), ssn = ssn}, false)
else
print("No SSN found in the data. Response: " .. response)
TriggerClientEvent("notify", src, "No civilian found with this SSN.")
end
else
print("Failed to retrieve data with status code: " .. statusCode)
TriggerClientEvent("notify", src, "Failed to retrieve data. Check logs.")
end
end, "POST", jsonData, headers)
end)
RegisterNetEvent("ImperialCAD:updateCivilianStatus")
AddEventHandler("ImperialCAD:updateCivilianStatus", function(data)
if data.status == "deleted" and data.ssn == GetResourceKvpString("civ_ssn") then
DeleteResourceKvp("civ_ssn")
DeleteResourceKvp("civ_name")
DeleteResourceKvp("civ_age")
DeleteResourceKvp("civ_address")
TriggerEvent("notify", "Your active civilian profile has been deleted externally.")
end
end)
RegisterNetEvent("ImperialCAD:registerVehicleToCAD")
AddEventHandler("ImperialCAD:registerVehicleToCAD", function(ssn, vehicleModelName, plate, colorName, makeName, year)
local src = source
local commId = GetConvar("imperial_community_id", "")
local apiKey = GetConvar("imperialAPI", "")
if not commId or commId == "" then
TriggerClientEvent("notify", src, "Community ID is not set. Cannot proceed with registration.")
return
end
if not apiKey or apiKey == "" then
TriggerClientEvent("notify", src, "API Key is not set. Cannot proceed with registration.")
return
end
local data = {
ssn = ssn,
vehicleModel = vehicleModelName or "UNKNOWN",
plate = plate or "UNKNOWN",
commId = commId,
year = year or "UNKNOWN",
make = makeName or "UNKNOWN",
color = colorName or "UNKNOWN"
}
local jsonData = json.encode(data)
local headers = {
["Content-Type"] = "application/json",
["APIKEY"] = apiKey
}
PerformHttpRequest("https://imperialcad.app/api/1.1/wf/registerVehicle",
function(statusCode, response, headers)
if statusCode == 200 then
local responseData = json.decode(response)
if responseData and responseData.success then
TriggerClientEvent("notify", src, "Vehicle registered successfully to CAD.")
end
else
TriggerClientEvent("notify", src, "Failed to register vehicle. Status Code: " .. statusCode)
end
end,
"POST", jsonData, headers)
end)
@@ -0,0 +1,72 @@
local onduty = false
local leoweapons = Config.LEOWeapons
local fireweapons = Config.FIREWeapons
local weapons = {}
local disabled = Config.DisableDutyCommand
if disabled then return end
TriggerEvent('chat:addSuggestion', '/duty', 'Toggle your duty status for better ImperialCAD notifications', {
{ name="JOB", help="Specify the job you want to go on-duty as or blank for off duty" },
})
RegisterCommand("duty", function(source, args)
local received = args[1] or nil
local job = received and string.upper(received) or nil
if onduty then
onduty = false
TriggerServerEvent("Imperial:RemoveUnitOnDuty", job)
ShowNotification("You are now ~r~off-duty~w~.", job)
TriggerEvent("Imperial:Client:UnSuitUnit")
else
print(received, job)
if received == nil or (job ~= "LEO" and job ~= "FIRE") then
ShowNotification("You need to specify a valid job. (LEO or FIRE)", "Imperial Duty")
return
end
onduty = true
TriggerServerEvent("Imperial:AddUnitOnDuty", job)
TriggerEvent('Imperial:Client:SuitNewUnit', job)
ShowNotification("You are now ~g~on-duty~w~.", job)
end
end, false)
RegisterNetEvent("Imperial:Client:SuitNewUnit")
AddEventHandler("Imperial:Client:SuitNewUnit", function(job)
SetPedArmour(PlayerPedId(), 100)
TriggerEvent('ImperialCAD:livemap:client:ToggleTracking', true)
if job == "LEO" and Config.GiveLEOWeapons then
weapons = leoweapons
elseif job == "FIRE" and Config.GiveFIREWeapons then
weapons = fireweapons
else
weapons = {}
end
for _, weapon in ipairs(weapons) do
GiveWeaponToPed(PlayerPedId(), GetHashKey(weapon), 250, false, true)
SetPedAmmo(PlayerPedId(), GetHashKey(weapon), 250)
end
end)
RegisterNetEvent("Imperial:Client:UnSuitUnit")
AddEventHandler("Imperial:Client:UnSuitUnit", function()
for _, weapon in ipairs(weapons) do
RemoveWeaponFromPed(PlayerPedId(), GetHashKey(weapon))
end
weapons = {} or nil
TriggerEvent('ImperialCAD:livemap:client:ToggleTracking', false)
end)
function ShowNotification(message, job)
BeginTextCommandThefeedPost("STRING")
AddTextComponentSubstringPlayerName(message)
EndTextCommandThefeedPostMessagetext("CHAR_CHAT_CALL", "CHAR_CHAT_CALL", true, 1, "ImperialCAD", job)
end
@@ -0,0 +1,256 @@
local OnDutyUnits = {}
local OnDutyLEOUnits = {}
local OnDutyFireUnits = {}
local sendWebhook = Config.SendWebhook
local webhookURL = Config.WebhookURL
local disabled = Config.DisableDutyCommand
RegisterNetEvent("Imperial:AddUnitOnDuty")
AddEventHandler("Imperial:AddUnitOnDuty", function(job, target)
local serverId = target or source
table.insert(OnDutyUnits, serverId)
local jobName = "Unkown"
if job == "LEO" then
table.insert(OnDutyLEOUnits, serverId)
jobName = "Law Enforcement Officer"
elseif job == "FIRE" then
table.insert(OnDutyFireUnits, serverId)
jobName = "Fire/Medical"
end
if sendWebhook then
local playerName = GetPlayerName(serverId)
local webhookData = {
["embeds"] = {
{
["color"] = 16711680,
["title"] = "Player went On-Duty",
["description"] = "Player: "..playerName.."\nJob: "..jobName,
["footer"] = {
["text"] = "ImperialCAD - ImperialDuty | In-game"
}
}
}
}
PerformHttpRequest(webhookURL, function(err, text, headers)
if err ~= 204 then
print("^1[ImperialDuty] Error sending webhook: HTTP "..tostring(err).."^0")
if text then print("^1[ImperialDuty] Response: "..text.."^0") end
else
print("^2[ImperialDuty] Webhook sent successfully.^0")
end
end, 'POST', json.encode(webhookData), { ['Content-Type'] = 'application/json' })
end
print("Added to OnDuty Units: "..GetPlayerName(serverId).." Job: "..job)
end)
RegisterNetEvent("Imperial:RemoveUnitOnDuty")
AddEventHandler("Imperial:RemoveUnitOnDuty", function(job, target)
local serverId = target or source
local jobName = "Unkown"
for i, unitId in ipairs(OnDutyUnits) do
if unitId == serverId then
table.remove(OnDutyUnits, i)
break
end
end
if job == "LEO" then
jobName = "Law Enforcement Officer"
for i, unitId in ipairs(OnDutyLEOUnits) do
if unitId == serverId then
table.remove(OnDutyLEOUnits, i)
break
end
end
elseif job == "FIRE" then
jobName = "Fire/Medical"
for i, unitId in ipairs(OnDutyFireUnits) do
if unitId == serverId then
table.remove(OnDutyFireUnits, i)
break
end
end
end
if sendWebhook then
local playerName = GetPlayerName(serverId)
local webhookData = {
["embeds"] = {
{
["color"] = 16711680,
["title"] = "Player Went Off-Duty",
["description"] = "Player: "..playerName.."\nJob: "..jobName,
["footer"] = {
["text"] = "ImperialCAD - ImperialDuty | In-game"
}
}
}
}
PerformHttpRequest(webhookURL, function(err, text, headers)
if err ~= 204 then
print("^1[ImperialDuty] Error sending webhook: HTTP "..tostring(err).."^0")
if text then print("^1[ImperialDuty] Response: "..text.."^0") end
else
print("^2[ImperialDuty] Webhook sent successfully.^0")
end
end, 'POST', json.encode(webhookData), { ['Content-Type'] = 'application/json' })
end
print("Removed from OnDuty Units: " .. GetPlayerName(serverId))
end)
RegisterNetEvent("playerDropped")
AddEventHandler("playerDropped", function(reason)
local serverId = source
local playerName = GetPlayerName(serverId)
for i, unitId in ipairs(OnDutyUnits) do
if unitId == serverId then
table.remove(OnDutyUnits, i)
break
end
end
local jobName = "Unknown"
local jobType = nil
for i, unitId in ipairs(OnDutyLEOUnits) do
if unitId == serverId then
table.remove(OnDutyLEOUnits, i)
jobName = "Law Enforcement Officer"
jobType = "LEO"
break
end
end
for i, unitId in ipairs(OnDutyFireUnits) do
if unitId == serverId then
table.remove(OnDutyFireUnits, i)
jobName = "Fire/Medical"
jobType = "FIRE"
break
end
end
print("[ImperialDuty] Player " .. serverId .. " disconnected. Removed from duty: " .. jobName)
if sendWebhook and jobType then
local webhookData = {
["embeds"] = {
{
["color"] = 16711680,
["title"] = "Player Disconnected While On-Duty",
["description"] = "**Player:** " .. playerName .. "\n**Job:** " .. jobName .. "\n**Reason:** " ..(reason),
["footer"] = { ["text"] = "ImperialCAD - ImperialDuty | In-game" }
}
}
}
PerformHttpRequest(webhookURL, function(err, text, headers)
if err ~= 204 then
print("^1[ImperialDuty] Error sending webhook: HTTP " .. tostring(err) .. "^0")
if text then print("^1[ImperialDuty] Response: " .. text .. "^0") end
else
print("^2[ImperialDuty] Disconnection webhook sent successfully.^0")
end
end, 'POST', json.encode(webhookData), { ['Content-Type'] = 'application/json' })
end
end)
function IsUnitOnDuty(serverId)
for _, unitId in ipairs(OnDutyUnits) do
if unitId == serverId then
return true
end
end
return false
end
function GetOnDutyUnits()
return OnDutyUnits
end
function GetOnDutyLEOUnits()
return OnDutyLEOUnits
end
function GetOnDutyFireUnits()
return OnDutyFireUnits
end
function PrintTable(tbl)
for k, v in pairs(tbl) do
print(k, v)
end
end
if disabled then
RegisterNetEvent("Imperial:AddUnitOnDutydisabled")
AddEventHandler("Imperial:AddUnitOnDutydisabled", function(serverId, job)
local job = job or "Unkown"
table.insert(OnDutyUnits, serverId)
if job == "LEO" then
table.insert(OnDutyLEOUnits, serverId)
elseif job == "FIRE" then
table.insert(OnDutyFireUnits, serverId)
end
print("Added to OnDuty Units: "..GetPlayerName(serverId).." Job: "..job)
end)
RegisterNetEvent("Imperial:RemoveUnitOnDutydisabled")
AddEventHandler("Imperial:RemoveUnitOnDutydisabled", function(serverId, job)
local job = job or "Unkown"
for i, unitId in ipairs(OnDutyUnits) do
if unitId == serverId then
table.remove(OnDutyUnits, i)
break
end
end
if job == "LEO" then
for i, unitId in ipairs(OnDutyLEOUnits) do
if unitId == serverId then
table.remove(OnDutyLEOUnits, i)
break
end
end
elseif job == "FIRE" then
for i, unitId in ipairs(OnDutyFireUnits) do
if unitId == serverId then
table.remove(OnDutyFireUnits, i)
break
end
end
end
print("Removed from OnDuty Units: " .. GetPlayerName(serverId))
end)
end
exports('GetOnDutyUnits', GetOnDutyUnits)
exports('GetOnDutyLEOUnits', GetOnDutyLEOUnits)
exports('GetOnDutyFireUnits', GetOnDutyFireUnits)
@@ -0,0 +1,4 @@
if not Config.ERSsupport then return end
exports['night_ers']:SetERSVehicleInfoDisplay(false) -- Sets the display for vehicle information on traffic stops to true or false.
exports['night_ers']:SetERSIDCardInfoDisplay(false) -- Sets the display for ID cards to true or false.
@@ -0,0 +1,407 @@
if not Config.ERSsupport then return end
print("Loading ImperialCAD ERS Integration..")
local function GetCivilianData(firstname, lastname, cb)
GetCharacterAdvanced({
firstname = firstname,
lastname = lastname
}, function(success, resultData)
if success then
local rData = resultData
local status = rData.status
if Config.debug then print("GetCharacter ERS DEBUG LINE:", status or rData) end
if status == "success" then
if Config.debug then print("[Imperial ERS] Received civilian data from CAD, Not registering the same civilian for ped") end
cb(true)
elseif status == "error" then
if Config.debug then print("[Imperial ERS] Could not find civilian data in CAD, Registering a new civilian for ped") end
cb(false)
end
else
if Config.debug then print("[Imperial ERS] Could not preform CAD request, Will not not proceed with civilian ped") end
cb(true)
end
end)
end
local function GetVehicleData(plate, cb)
CheckPlate({
plate = plate
}, function(success, resultData)
if success then
local rData = resultData
local status = rData.status
if Config.debug then print("CheckPlate ERS DEBUG LINE:", status or rData) end
if Config.debug then print("[Imperial ERS] Vehicle already in cad, not registering again") end
cb(true)
else
if Config.debug then print("[Imperial ERS] Vehicle not found in cad, attempting to register") end
cb(false)
end
end)
end
if Config.ImperialDutySync then
RegisterNetEvent('ErsIntegration::OnToggleShift')
AddEventHandler('ErsIntegration::OnToggleShift', function(source, isOnShift, serviceType)
local job = nil
if serviceType == "police" then job = "LEO" elseif serviceType == "fire" then job = "FIRE" end
if job ~= nil and isOnShift then TriggerEvent("Imperial:AddUnitOnDuty", job, source) TriggerClientEvent('Imperial:Client:SuitNewUnit', source, job) end
if job ~= nil and not isOnShift then TriggerEvent("Imperial:RemoveUnitOnDuty", job, source) TriggerClientEvent('Imperial:Client:UnSuitNewUnit', source) end
end)
end
RegisterNetEvent('ErsIntegration::OnFirstNPCInteraction')
AddEventHandler('ErsIntegration::OnFirstNPCInteraction', function(source, data, context)
if not IsUnitOnDuty(source) then if Config.debug then print(source, "unit is not on duty with imperial ignoring ers") end return end
if Config.debug then print("Received ERS ped info", json.encode(data)) end
local name = data.FirstName .. " " .. data.LastName
GetCivilianData(data.FirstName, data.LastName, function(pedRegistered)
if not pedRegistered then
local pdata = data
local DLStatus = string.upper(pdata.License_Car)
local CDLStatus = string.upper(pdata.License_Truck)
local licenseMap = {
["VALID"] = "ACTIVE",
["INTERNATIONAL LICENSE (VALID)"] = "ACTIVE",
["REPORTED STOLEN (VALID)"] = "REVOKED",
["EXPIRED"] = "EXPIRED",
["SUSPENDED"] = "SUSPENDED",
["REVOKED"] = "REVOKED",
["NONE"] = "NONE",
["N/A"] = "NONE",
[""] = "NONE",
}
local licenseStatus = licenseMap[DLStatus] or "NONE"
local CLicenseStatus = licenseMap[CDLStatus] or "NONE"
NewCharacterAdvanced({
commId = GetConvar("imperial_community_id", ""),
Fname = pdata.FirstName,
Mname = "", -- ERS doesn't provide middle name
Lname = pdata.LastName,
Birthdate = pdata.DOB,
gender = pdata.Gender,
race = string.upper(pdata.Nationality) or "nil",
hairC = "nil", -- not provided
eyeC = "nil", -- not provided
height = "nil", -- not provided
weight = "nil", -- not provided
postal = pdata.PostalCode,
address = pdata.Address,
city = pdata.City,
county = "nil",
state = pdata.State,
phonenum = pdata.PhoneNumber,
licensedetails = {
hasBoatLic = pdata.License_Boat_Is_Valid,
hasCDL = pdata.License_Truck_Is_Valid,
CDLNumber = GenerateRandomString(9), -- ERS doesn't provide, but we made a function
CDLStatus = CLicenseStatus,
hasDL = pdata.License_Car_Is_Valid,
DLNumber = GenerateRandomString(9),
DLStatus = licenseStatus,
hasFirearmsCertification = false, -- not in ERS
hasFishLic = false,
hasHuntLic = false
},
misc = {
missing = false
}
}
, function(success, resultData)
if success then
if Config.debug then
print("[IMPERIAL_ERS] Ped created in cad:", json.encode(resultData))
end
else
if Config.debug then
print("[IMPERIAL_ERS] Ped couldnt be created in cad:", json.encode(resultData))
end
end
end)
else
if Config.debug then print("[IMPERIAL_ERS] Here is the else statement meaning that this character should not be reg") end
end
end) -- checking/handling trying to create saved char in cad
end) -- Checking ped registry
RegisterNetEvent('ErsIntegration::OnFirstVehicleInteraction')
AddEventHandler('ErsIntegration::OnFirstVehicleInteraction', function(source, data, context)
if Config.debug then print("[IMPERIAL_ERS] Received ERS vehicle info", json.encode(data)) end
if not IsUnitOnDuty(source) then if Config.debug then print(source, "unit is not on duty with imperial ignoring ers") end return end
local fullName = data.owner_name
-- Use pattern matching to split into first and last?? idk trying it tho
local firstName, lastName = fullName:match("^(%S+)%s+(.*)$")
if Config.debug then
print("[IMPERIAL_ERS] First name:", firstName)
print("[IMPERIAL_ERS] Last name:", lastName)
end
local vehicle = data
local insuranceStatus = vehicle.insurance and "ACTIVE" or "EXPIRED"
local regStatus = vehicle.tax and "ACTIVE" or "EXPIRED"
GetVehicleData(vehicle.license_plate, function(isReg)
if not isReg then
CreateVehicleAdvanced({
vehicleData = {
plate = vehicle.license_plate,
model = vehicle.model,
Make = vehicle.make,
color = vehicle.color,
year = tostring(vehicle.build_year),
regStatus = regStatus,
regExpDate = vehicle.registration_date,
vin = GenerateRandomString(17),
stolen = vehicle.stolen
},
vehicleInsurance = {
hasInsurance = vehicle.insurance,
insuranceStatus = insuranceStatus,
insurancePolicyNum = GenerateRandomString(12)
},
vehicleOwner = {
ownerSSN = "nil",
ownerFirstName = firstName,
ownerLastName = lastName,
ownerGender = "nil",
ownerAddress = "nil",
ownerCity = "nil"
}
}, function(success, resultData)
if success then
if Config.debug then print("[IMPERIAL_ERS] Registered advanced vehicle") end
else
if Config.debug and resultData then print("[IMPERIAL_ERS] Could not register advanced vehicle:", json.encode(resultData)) end
if Config.debug and not resultData then print("[IMPERIAL_ERS] Could not register advanced vehicle: NO RESULT DATA AVAIL") end
end
end) -- end function of creating advanced vehicle in cad
else
if Config.debug then print("[IMPERIAL_ERS] Cannot and will not register this ped vehicle") end
end
end)
end)
RegisterNetEvent('ErsIntegration::OnAcceptedCalloutOffer')
AddEventHandler('ErsIntegration::OnAcceptedCalloutOffer', function(callData)
if Config.debug then print("Received accepeted calloutoffer from ERS") end
if not IsUnitOnDuty(source) then if Config.debug then print(source, "unit is not on duty with imperial ignoring ers") end return end
local ers = callData
local src = source
local streetData = lib.callback.await('ImperialCAD:getNearestStreets', source, ers.Coordinates)
local street = streetData.street
local crossStreet = streetData.crossStreet or nil
exports["ImperialCAD"]:CreateCall({
users_discordID = getDiscordId(source),
street = street,
cross_street = crossStreet,
postal = exports["ImperialCAD"]:getNearestPostalFromCoords(ers.Coordinates),
city = exports["ImperialCAD"]:getNearestCityFromCoords(ers.Coordinates),
county = exports["ImperialCAD"]:getNearestCountyFromCoords(ers.Coordinates),
info = ers.Description,
nature = ers.CalloutName,
status = "ACTIVE",
priority = "2"
}, function(success, resultData)
if success then
local apires = json.decode(resultData)
if not apires or not apires.response or not apires.response.callId then
if Config.debug then print("^1[IMPERIAL_ERS_ERROR]^7 Invalid response or call ID not found") end
return
end
local callnum = apires.response.callnum
local callId = apires.response.callId
if Config.debug then print("[IMPERIAL_ERS] Cad Call Created: Call num -", callnum) end
addCall(src, callId)
else
if Config.debug then print(resultData) end
end
end)
end)
RegisterNetEvent('ErsIntegration::OnArrivedAtCallout')
AddEventHandler('ErsIntegration::OnArrivedAtCallout', function(callData)
if Config.debug then print("Received arrived at callout from ERS") end
if not IsUnitOnDuty(source) then if Config.debug then print(source, "unit is not on duty with imperial ignoring ers") end return end
end)
if Config.UseERSCalloutEnded then
RegisterNetEvent('ErsIntegration::OnEndedACallout')
AddEventHandler('ErsIntegration::OnEndedACallout', function()
local src = source
if Config.debug then print("Received ended a callout from ERS") end
if not IsUnitOnDuty(src) then if Config.debug then print(src, "unit is not on duty with imperial ignoring ers") end return end
local call = getCall(src)
if call then
if Config.debug then print('There is a ers call number saved, trying to delete it') end
exports["ImperialCAD"]:DeleteCall({
callId = call,
discordId = getDiscordId(src),
}, function(success, resultData)
if success then
if Config.debug then print("^1[IMPERIAL_ERS]^7 Call deleted, call ended by ERS") end
else
if Config.debug then print("^1[IMPERIAL_ERS_error]^7 Unable to delete, call ended by ERS") end
end
end)
removeCall(src)
else
if Config.debug then print('There is not a ers call number locally saved, not trying to delete it') end
end
end)
end
if Config.UseERSCalloutCompletedSuccesfully then
RegisterServerEvent("ErsIntegration::OnCalloutCompletedSuccesfully")
AddEventHandler("ErsIntegration::OnCalloutCompletedSuccesfully", function(calloutData)
local src = source
if Config.debug then print("Received ended a callout from ERS") end
if not IsUnitOnDuty(src) then if Config.debug then print(src, "unit is not on duty with imperial ignoring ers") end return end
local call = getCall(src)
if call then
if Config.debug then print('There is a ers call number saved, trying to delete it then') end
exports["ImperialCAD"]:DeleteCall({
callId = call,
discordId = getDiscordId(src),
}, function(success, resultData)
if success then
if Config.debug then print("^1[IMPERIAL_ERS]^7 Call deleted, call ended by ERS") end
else
if Config.debug then print("^1[IMPERIAL_ERS_error]^7 Unable to delete, call ended by ERS") end
end
end)
removeCall(src)
else
if Config.debug then print('There is not a ers call number locally saved, not trying to delete it') end
end
end)
end
RegisterServerEvent("ErsIntegration::OnPullover")
AddEventHandler("ErsIntegration::OnPullover", function(pedData, vehicleData)
local src = source
if Config.debug then print("Received started a pullover from ERS") end
if not IsUnitOnDuty(src) then if Config.debug then print(src, "unit is not on duty with imperial ignoring ers") end return end
local ped = GetPlayerPed(src)
local Coords
local vehicle = vehicleData
if ped and ped ~= 0 then
Coords = GetEntityCoords(ped)
if Config.debug then print(("Player %s coords: x=%.2f, y=%.2f, z=%.2f"):format(src, Coords.x, Coords.y, Coords.z)) end
else
if Config.debug then print("No ped found for player " .. src) end
end
local streetData = lib.callback.await('ImperialCAD:getNearestStreets', src, Coords)
local street = streetData.street
local crossStreet = streetData.crossStreet or nil
exports["ImperialCAD"]:CreateCall({
users_discordID = getDiscordId(src),
street = street,
cross_street = crossStreet,
postal = exports["ImperialCAD"]:getNearestPostalFromCoords(Coords),
city = exports["ImperialCAD"]:getNearestCityFromCoords(Coords),
county = exports["ImperialCAD"]:getNearestCountyFromCoords(Coords),
info = ("Traffic stop on a %s %s %s (%s) with the license plate %s. (Bolo Desc: %s)"):format(vehicle.build_year, vehicle.color, vehicle.make, vehicle.model, vehicle.license_plate, vehicle.bolo_description),
nature = Config.trafficsnature,
status = "ACTIVE",
priority = Config.trafficspriority
}, function(success, resultData)
if success then
local apires = json.decode(resultData)
if not apires or not apires.response or not apires.response.callId then
if Config.debug then print("^1[IMPERIAL_ERS_ERROR]^7 Invalid response or call ID not found") end
return
end
local callnum = apires.response.callnum
local callId = apires.response.callId
if Config.debug then print("[IMPERIAL_ERS] Cad Call Created: Call num -", callnum) end
addCall(src, callId)
else
if Config.debug then print(resultData) end
end
end)
end)
if Config.UseERSPulloverEnded then
RegisterServerEvent("ErsIntegration::OnPulloverEnded")
AddEventHandler("ErsIntegration::OnPulloverEnded", function(pedData, vehicleData)
local src = source
if Config.debug then print("Received ended a pullover from ERS") end
if not IsUnitOnDuty(src) then if Config.debug then print(src, "unit is not on duty with imperial ignoring ers") end return end
local call = getCall(src)
if call then
if Config.debug then print('There is a ers call number saved, trying to delete it then') end
exports["ImperialCAD"]:DeleteCall({
callId = call,
discordId = getDiscordId(src),
}, function(success, resultData)
if success then
if Config.debug then print("^1[IMPERIAL_ERS]^7 Call deleted, call ended by ERS") end
else
if Config.debug then print("^1[IMPERIAL_ERS_error]^7 Unable to delete, call ended by ERS") end
end
end)
removeCall(src)
else
if Config.debug then print('There is not a ers call number locally saved, not trying to delete it') end
end
end)
end
@@ -0,0 +1,62 @@
if not Config.livemap then return end
local x, y
local lastSend = 0
local SEND_INTERVAL = 10000
local tracking = false
RegisterNetEvent('ImperialCAD:livemap:client:ToggleTracking', function(Atracking)
tracking = Atracking
end)
TriggerEvent('chat:addSuggestion', '/ToggleTracking', 'Toggle ImperialCAD live tracking')
RegisterCommand("ToggleTracking", function()
if tracking then
tracking = false
if Config.debug then print("Tracking disabled") end
else
tracking = true
if Config.debug then print("Tracking enabled") end
end
end, false)
CreateThread(function()
while true do
Wait(3500)
local ped = PlayerPedId()
local coords = GetEntityCoords(ped)
local veh = GetVehiclePedIsIn(ped, false)
local speed = math.floor(GetEntitySpeed(ped) * 2.23694)
local status = "on_foot"
if veh ~= 0 then
local model = GetEntityModel(veh)
if IsThisModelAHeli(model) or IsThisModelAPlane(model) then
status = "aircraft"
elseif IsThisModelABoat(model) then
status = "boat"
else
status = "car"
end
end
local now = GetGameTimer()
local moved = (x ~= coords.x) or (y ~= coords.y)
local timeout = (now - lastSend) >= SEND_INTERVAL
if (moved or timeout) and tracking then
TriggerServerEvent("ImperialCAD:livemap:send", {
x = coords.x,
y = coords.y,
speed = speed,
icon = status
})
x = coords.x
y = coords.y
lastSend = now
end
end
end)
@@ -0,0 +1,27 @@
TriggerEvent('chat:addSuggestion', '/ToggleTracking', 'Toggle ImperialCAD live tracking')
RegisterCommand("ToggleUsersTracking", function(args)
end, false)
RegisterServerEvent("ImperialCAD:livemap:send")
AddEventHandler("ImperialCAD:livemap:send", function(data)
local src = source
local discord = getDiscordId(src)
local communityId = GetConvar("imperial_community_id", "")
if not discord then return end
--if not IsUnitOnDuty(src) then print("[Imperial LiveMap] Not Sending data, unit is off duty") TriggerClientEvent('ImperialCAD:livemap:client:ToggleTracking', src, false) return end
if Config.debug then print("[Imperial LiveMap] Sending livemap data") end
PerformHttpRequest('https://map.imperial-solutions.net/livemap', function(err, text, headers) end, "POST", json.encode({
version = 2,
cid = communityId,
discord = discord,
x = data.x,
y = data.y,
speed = data.speed,
icon = data.icon
}), { ["Content-Type"] = "application/json" })
end)
@@ -0,0 +1,57 @@
local currentPostal, currentCity, currentCounty
local function updateLocationData()
local playerPed = PlayerPedId()
local playerCoords = GetEntityCoords(playerPed)
TriggerServerEvent('ImperialLocation:updateNearest', {x = playerCoords.x, y = playerCoords.y})
end
Citizen.CreateThread(function()
while true do
updateLocationData()
Citizen.Wait(Config.locationFrequency)
end
end)
RegisterCommand("getlocation", function()
local playerPed = PlayerPedId()
local playerCoords = GetEntityCoords(playerPed)
TriggerServerEvent('ImperialLocation:updateNearest', {x = playerCoords.x, y = playerCoords.y}, true)
end, false)
RegisterNetEvent('ImperialLocation:PrintNearest')
AddEventHandler('ImperialLocation:PrintNearest', function(nearestPostal, nearestCity, nearestCounty)
local postalText = nearestPostal and nearestPostal.code or "None"
local cityText = nearestCity and nearestCity.city or "None"
local countyText = nearestCounty and nearestCounty.county or "None"
TriggerEvent('chat:addMessage', {
color = {255, 0, 0},
multiline = true,
args = {"Me", "Nearest Postal: " .. postalText .. ", City: " .. cityText .. ", County: " .. countyText}
})
end)
RegisterNetEvent('ImperialLocation:receiveNearest')
AddEventHandler('ImperialLocation:receiveNearest', function(nearestPostal, nearestCity, nearestCounty)
currentPostal = nearestPostal and nearestPostal.code or "None"
currentCity = nearestCity and nearestCity.city or "None"
currentCounty = nearestCounty and nearestCounty.county or "None"
end)
function GetImperialPostal()
return currentPostal or "None"
end
exports('getPostal', GetImperialPostal)
function GetImperialCity()
return currentCity or "None"
end
exports('getCity', GetImperialCity)
function GetImperialCounty()
return currentCounty or "None"
end
exports('getCounty', GetImperialCounty)
@@ -0,0 +1,117 @@
local DATA_FOLDER = 'data'
local POSTAL_FILE = DATA_FOLDER .. '/postals.json'
local CITY_FILE = DATA_FOLDER .. '/cities.json'
local COUNTY_FILE = DATA_FOLDER .. '/counties.json'
local playerLocationData = {}
local function loadData(fileName)
local file = LoadResourceFile(GetCurrentResourceName(), fileName)
if file then
local data = json.decode(file)
if data then
print("Loaded " .. fileName .. " successfully with " .. #data .. " entries.")
return data
else
print("[Error] JSON decoding failed for " .. fileName)
return {}
end
else
print("[Error] Failed to load " .. fileName)
return {}
end
end
local postals, cities, counties = loadData(POSTAL_FILE), loadData(CITY_FILE), loadData(COUNTY_FILE)
local function calculateDistance(x1, y1, x2, y2)
return math.sqrt((x2 - x1) ^ 2 + (y2 - y1) ^ 2)
end
local function getNearestLocation(coords, locations)
local nearest = nil
local shortestDistance = math.huge
for _, location in ipairs(locations) do
local distance = calculateDistance(coords.x, coords.y, location.x, location.y)
if distance < shortestDistance then
nearest = location
shortestDistance = distance
end
end
return nearest
end
RegisterNetEvent('ImperialLocation:updateNearest')
AddEventHandler('ImperialLocation:updateNearest', function(playerCoords, shouldDisplay)
local src = source
local nearestPostal = getNearestLocation(playerCoords, postals)
local nearestCity = getNearestLocation(playerCoords, cities)
local nearestCounty = getNearestLocation(playerCoords, counties)
playerLocationData[src] = {
postal = nearestPostal,
city = nearestCity,
county = nearestCounty
}
TriggerClientEvent('ImperialLocation:receiveNearest', src, nearestPostal, nearestCity, nearestCounty)
if shouldDisplay then
TriggerClientEvent('ImperialLocation:PrintNearest', src, nearestPostal, nearestCity, nearestCounty)
end
end)
RegisterCommand("debugLocationData", function(src)
print("^3[IMPERIAL DEBUG]^7 Dumping all player location data:")
for playerId, data in pairs(playerLocationData) do
print(("Player %s:"):format(playerId))
print(" Postal:", data.postal and data.postal.code or "None")
print(" City: ", data.city and data.city.city or "None")
print(" County:", data.county and data.county.county or "None")
end
end, true)
RegisterCommand("debugCoordsLocation", function(src)
local coords = { x = 1909.0826, y = 3654.7751 }
local postal = exports["ImperialCAD"]:getNearestPostalFromCoords(coords)
local city = exports["ImperialCAD"]:getNearestCityFromCoords(coords)
local county = exports["ImperialCAD"]:getNearestCountyFromCoords(coords)
print("^3[IMPERIAL DEBUG]^7 Nearest location info for coords: x=" .. coords.x .. ", y=" .. coords.y)
print(" Postal:", postal)
print(" City: ", city)
print(" County:", county)
end, true)
exports('getPostal', function(playerId)
return playerLocationData[playerId] and playerLocationData[playerId].postal.code or "Unkown"
end)
exports('getCity', function(playerId)
return playerLocationData[playerId] and playerLocationData[playerId].city.city or "Unkown"
end)
exports('getCounty', function(playerId)
return playerLocationData[playerId] and playerLocationData[playerId].county.county or "Unkown"
end)
AddEventHandler('playerDropped', function()
playerLocationData[source] = nil
end)
exports('getNearestPostalFromCoords', function(coords)
local location = getNearestLocation(coords, postals)
return location and location.code or "Unknown"
end)
exports('getNearestCityFromCoords', function(coords)
local location = getNearestLocation(coords, cities)
return location and location.city or "Unknown"
end)
exports('getNearestCountyFromCoords', function(coords)
local location = getNearestLocation(coords, counties)
return location and location.county or "Unknown"
end)
@@ -0,0 +1,99 @@
local tabletVisible = false
local tabletProp = nil
local function Notify(message)
local fullMessage = "[IMPERIAL] " .. message
SetNotificationTextEntry("STRING")
AddTextComponentString(fullMessage)
DrawNotification(false, true)
end
local function closeTablet()
local ped = GetPlayerPed(-1)
ClearPedTasks(ped)
if tabletProp and DoesEntityExist(tabletProp) then
DeleteEntity(tabletProp)
tabletProp = nil
end
Citizen.Wait(100)
SetNuiFocus(false, false)
SendNUIMessage({
type = "HIDE_TABLET"
})
tabletVisible = false
return { success = true, message = "Closed successfully" }
end
AddEventHandler('onResourceStop', function(resourceName)
if (GetCurrentResourceName() ~= resourceName) then
return
end
closeTablet()
Citizen.Wait(100)
print("Tablet resource stopped, closing and deleting tablet props")
if tabletProp and DoesEntityExist(tabletProp) then
DeleteEntity(tabletProp)
tabletProp = nil
end
end)
RegisterNUICallback('closeTablet', function(data, cb)
closeTablet()
cb({success = true, message = "Tablet closed via JavaScript"})
end)
RegisterCommand("tablet", function(source, args, rawCommand)
local ped = GetPlayerPed(-1)
local currentVehicle = GetVehiclePedIsIn(ped, false)
if Config.tabletCarRestriction and GetVehicleClass(currentVehicle) ~= 18 then Notify("You must be in a Emergency Vehicle to use your Imperial Tablet.") return end
if IsEntityPlayingAnim(ped, "amb@code_human_in_bus_passenger_idles@female@tablet@base", "base", 3) then
closeTablet()
else
RequestAnimDict("amb@code_human_in_bus_passenger_idles@female@tablet@base")
while not HasAnimDictLoaded("amb@code_human_in_bus_passenger_idles@female@tablet@base") do
Citizen.Wait(100)
end
tabletProp = CreateObject(GetHashKey("prop_cs_tablet"), 0, 0, 0, true, true, true)
AttachEntityToEntity(
tabletProp, ped, GetPedBoneIndex(ped, 60309),
0.03, 0.002, -0.02,
0.0, 0.0, 0.0,
true, true, false, true, 1, true
)
TaskPlayAnim(ped, "amb@code_human_in_bus_passenger_idles@female@tablet@base", "base", 8.0, -8.0, -1, 50, 0, false, false, false)
Citizen.Wait(200)
SetNuiFocus(true, true)
SendNUIMessage({
type = "DISPLAY_TABLET"
})
tabletVisible = true
end
end, false)
RegisterKeyMapping('Tablet', 'Open / close your tablet.', 'keyboard', 'PERIOD')
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
if IsControlJustReleased(0, 200) then
if tabletVisible then
closeTablet()
end
end
end
end)
@@ -0,0 +1,57 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Imperial CAD | Tablet</title>
<style>
body {
margin: 0;
padding: 0;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
overflow: hidden;
}
.monitor {
display: none;
width: 1600px;
height: 800px;
background-color: #000;
border: 15px solid #444;
border-radius: 5px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.8);
overflow: hidden;
position: relative;
}
.background-text {
position: absolute;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
z-index: 1;
font-size: 50px;
font-family: 'Arial', sans-serif;
color: rgba(255, 255, 255, 0.2);
pointer-events: none;
}
.screen {
width: 100%;
height: 100%;
border: none;
position: absolute;
z-index: 2;
}
</style>
</head>
<body>
<div class="monitor">
<div class="background-text">ImperialCAD</div>
<iframe class="screen" src="https://imperialcad.app/auth?type=tablet" sandbox="allow-popups allow-scripts allow-same-origin allow-forms allow-modals allow-presentation"></iframe>
</div>
<script src="script.js" type="text/javascript"></script>
</body>
</html>
@@ -0,0 +1,35 @@
let tabletVisible = false;
function toggleTablet(show) {
const monitor = document.querySelector('.monitor');
monitor.style.display = show ? 'block' : 'none';
tabletVisible = show;
fetch(`https://${GetParentResourceName()}/setNuiFocus`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
focus: show,
cursor: show
})
});
}
window.addEventListener('message', function(event) {
if (event.data.type === "DISPLAY_TABLET") {
toggleTablet(true);
} else if (event.data.type === "HIDE_TABLET") {
toggleTablet(false);
}
});
document.addEventListener('keydown', function(e) {
if (e.key === "Escape" && tabletVisible) {
toggleTablet(false);
fetch(`https://${GetParentResourceName()}/closeTablet`, {
method: 'POST'
});
}
});
+118
View File
@@ -0,0 +1,118 @@
--[[
DONT TOUCH THIS FILE UNLESS YOU KNOW WHAT YOUR DOING!
--]]
if Config.isQB then
local QBCore = exports['qb-core']:GetCoreObject()
RegisterNetEvent('qb-vehicleshop:client:buyShowroomVehicle')
AddEventHandler('qb-vehicleshop:client:buyShowroomVehicle', function(vehicleModel, plate, source)
Citizen.Wait(2000)
local src = source
local ped = PlayerPedId()
if IsPedSittingInAnyVehicle(ped) then
local vehicle = GetVehiclePedIsIn(ped, false)
local vehicleHash = GetEntityModel(vehicle)
local vehicleModelName = GetDisplayNameFromVehicleModel(vehicleHash) -- Ensure this matches showroom model if needed
local colorName = GetVehicleColorName(vehicle)
local makeName = GetVehicleMakeName(vehicleModelName)
if vehicleModelName == "CARNOTFOUND" or vehicleModelName == nil then
vehicleModelName = "UNKNOWN"
TriggerEvent("notify", "Model Unknown, Proceeding anyways...")
end
local data = {
ssn = GetResourceKvpString("civ_ssn"),
make = makeName or "UNKNOWN",
color = colorName or "UNKNOWN",
vehicle = vehicleModelName,
plate = plate
}
if Config.debug then
print("Vehicle purchase detected: " .. vehicleModelName .. " | Plate: " .. plate .. " | Sending to the best cad in the world...")
print(plate .. " " .. data.ssn)
end
if data.ssn then
TriggerServerEvent('ImperialCAD:CreateVehicle', data, src)
TriggerEvent("notify", "Vehicle has been sent to the DMV.")
if Config.debug then
TriggerEvent("notify", vehicleModelName .. " has been sent to the DMV, " .. (colorName or "UNKNOWN") .. " is color and " .. (makeName or "UNKNOWN") .. " is make.")
end
else
TriggerEvent("notify", "Couldn't register in DMV, No active civilian profile.")
end
else
TriggerEvent("notify", "Unable to register this vehicle, Try '/regveh' instead")
end
end)
end --end of qb
if Config.isQBX then
if Config.debug then print("Client FW script for qbx loaded") end
-- Very hacky lazy workaround - I need to improve this
RegisterNetEvent('qbx_vehicleshop:imperial:client:boughtshowroomvehicle')
AddEventHandler('qbx_vehicleshop:imperial:client:boughtshowroomvehicle', function()
if Config.debug then print("Client received showroom vehicle purchase event!") end
Citizen.Wait(3000)
TriggerEvent("notify", "Please do not leave your vehicle, Registering to ImperialCAD")
local src = source
local ped = PlayerPedId()
if IsPedSittingInAnyVehicle(ped) then
local vehicle = GetVehiclePedIsIn(ped, false)
local vehicleHash = GetEntityModel(vehicle)
local vehicleModelName = GetDisplayNameFromVehicleModel(vehicleHash) -- Ensure this matches showroom model if needed
local colorName = GetVehicleColorName(vehicle) -- This global in in ImperialCAD, this could conflict with another resources global if misused
local makeName = GetVehicleMakeName(vehicleModelName) -- This global in in ImperialCAD, this could conflict with another resources global if misused
local plate = GetVehicleNumberPlateText(vehicle)
if vehicleModelName == "CARNOTFOUND" or vehicleModelName == nil then
vehicleModelName = "UNKNOWN"
TriggerEvent("notify", "Model Unknown, Proceeding anyways...")
end
local data = {
ssn = GetResourceKvpString("civ_ssn"),
make = makeName or "UNKNOWN",
color = colorName or "UNKNOWN",
vehicle = vehicleModelName,
plate = plate
}
if Config.debug then
print("? Vehicle purchase detected: " .. vehicleModelName .. " | Plate: " .. plate .. " | Sending to the best cad in the world...")
print(plate .. " " .. data.ssn)
end
if data.ssn then
TriggerServerEvent('ImperialCAD:QBXFramework:CreateVehicle', data, src)
TriggerEvent("notify", "Vehicle has been sent to the DMV.")
if Config.debug then
TriggerEvent("notify", vehicleModelName .. " has been sent to the DMV, " .. (colorName or "UNKNOWN") .. " is color and " .. (makeName or "UNKNOWN") .. " is make.")
end
else
TriggerEvent("notify", "Couldn't register in DMV, No active civilian profile.")
end
else
TriggerEvent("notify", "Unable to register this vehicle, Try '/regveh' instead")
end
end)
end --end of qbx
@@ -0,0 +1,613 @@
--[[
Imperial Export for FiveM
DO NOT EDIT THIS FILE UNLESS YOU KNOW WHAT YOUR DOING!
]]--
local function getDiscordId(src)
if src == nil then return false end
local identifiers = GetPlayerIdentifiers(src)
for _, v in pairs(identifiers) do
if string.sub(v, 1, 8) == "discord:" then
return string.gsub(v, "discord:", "")
end
end
return false
end
if Config.isQB then
local QBCore = exports['qb-core']:GetCoreObject({'Functions'})
-- Hook into the player character load event
RegisterNetEvent('qb-multicharacter:server:loadUserData')
AddEventHandler('qb-multicharacter:server:loadUserData', function(cData)
local src = source
local discordId = getDiscordId(src)
if Config.debug then
print("✅ QBCore Load User Detected, Loading Character Data: " .. json.encode(cData) .. " | Source: " .. src)
end
local charinfo = cData.charinfo
local fname = charinfo.firstname or "N?A"
local lname = charinfo.lastname or "N?A"
local gender = charinfo.gender or "N?A"
local dob = charinfo.birthdate or "N?A"
local phone = charinfo.phone or "N?A"
-- Extract required values
local citizenid = cData.citizenid
local commId = GetConvar("imperial_community_id", "")
if not citizenid or citizenid == "" then
print("❌ ERROR: Citizen ID is missing!")
return
end
if not commId or commId == "" then
print("❌ ERROR: Community ID is missing! Check your server config.")
return
end
-- Check if character exists in CAD
exports["ImperialCAD"]:GetCharacter(citizenid, commId, function(success, resultData)
if success then
print("✅ Character Data Found in CAD for CitizenID: " .. citizenid)
if Config.debug then
print("Result Data: " .. json.encode(resultData))
end
local data = {
ssn = resultData.ssn,
name = resultData.Name,
address = resultData.address,
age = resultData.age
}
TriggerClientEvent('ImperialCAD:setActiveCiv', src, data)
else
if Config.QBRegCurrent then -- If QBRegCurrent is true then
if Config.debug then
print("⚠️ Character NOT found in CAD. Creating new entry...")
end
else -- If QBRegCurrent is not true then (false)
if Config.debug then
print("⚠️ Character NOT found in CAD. Will not Create new entry config is set to false")
end
return end
if gender == 0 then
gender = "MALE"
elseif gender == 1 then
gender = "FEMALE"
end
-- If character isnt found, create a new one
exports["ImperialCAD"]:NewCharacter({
users_discordID = discordId,
Fname = fname,
Mname = "",
Lname = lname,
Birthdate = dob,
race = "nil",
hairC = "nil",
eyeC = "nil",
height = "6'",
weight = "150",
postal = nil,
address = "nil",
gender = gender,
city = "nil",
county = "nil",
phonenum = phone,
dlstatus = "VALID",
citizenid = citizenid
}, function(createSuccess, createResult)
if createSuccess then
print("✅ New Character Created in CAD for CitizenID: " .. citizenid)
if Config.debug then
print("Result Data: " .. json.encode(createResult))
end
local eventdata = json.decode(createResult)
local data = {
ssn = eventdata.response.ssn,
name = eventdata.response.name,
address = "Unkown Address",
age = eventdata.response.age
}
TriggerClientEvent('ImperialCAD:setActiveCiv', src, data)
else
print("⚠️ ERROR: Failed to create character in CAD for CitizenID: " .. citizenid)
end
end)
end
end)
end)
-- Hook into the character creation event
RegisterNetEvent('qb-multicharacter:server:createCharacter')
AddEventHandler('qb-multicharacter:server:createCharacter', function(cData)
local src = source
local discordId = getDiscordId(src)
if Config.debug then
print("Received Character Data (Pre-Delay): " .. json.encode(cData))
end
-- Wait a few seconds for the data to be properly created
Wait(3000) -- 3 seconds
-- Fetch the updated player data from QBCore
local Player = QBCore.Functions.GetPlayer(src)
if Player then
local citizenid = Player.PlayerData.citizenid
local charinfo = Player.PlayerData.charinfo
local firstname = cData.firstname
local lastname = cData.lastname
local birthdate = cData.birthdate
local gender = cData.gender
local nationality = cData.nationality
local phone = cData.phone
local account = cData.account
if gender == 0 then
gender = "MALE"
elseif gender == 1 then
gender = "FEMALE"
end
if Config.debug then
print("✅ Character Created After Delay:")
print("Citizen ID: " .. citizenid)
print("Discord ID: " .. discordId)
print("First Name: " .. firstname)
print("Last Name: " .. lastname)
print("Birthdate: " .. birthdate)
print("Gender: " .. gender)
end
-- Call the NewCharacter function to send data to the API
exports["ImperialCAD"]:NewCharacter({
users_discordID = discordId,
Fname = firstname,
Mname = "",
Lname = lastname,
Birthdate = birthdate,
race = "nil",
hairC = "nil",
eyeC = "nil",
height = "6'",
weight = "150",
postal = nil,
address = "nil",
gender = gender,
city = "nil",
county = "nil",
phonenum = phone,
dlstatus = "VALID",
citizenid = citizenid
}, function(success, resultData)
if success then
print("✅ Character Created in CAD")
if Config.debug then
print("Result Data: " .. json.encode(resultData))
end
local eventdate = json.decode(resultData)
local data = {
ssn = eventdate.response.ssn,
name = eventdate.response.name,
address = "Unkown Address",
age = eventdate.response.age
}
TriggerClientEvent('ImperialCAD:setActiveCiv', src, data)
else
print("⚠️ ERROR: Could not create character in CAD.")
end
end)
else
print("⚠️ ERROR: Could not retrieve player data after delay!")
end
end)
-- Hook into the character deletion event
RegisterNetEvent('qb-multicharacter:server:deleteCharacter')
AddEventHandler('qb-multicharacter:server:deleteCharacter', function(citizenid)
local src = source
local discordId = getDiscordId(src)
if Config.debug then
print("Received Character Deletion Request: " .. citizenid)
end
exports["ImperialCAD"]:DeleteCharacter({
users_discordID = discordId,
citizenid = citizenid
}, function(success, resultData)
if success then
print("✅ Character was deleted in CAD")
else
print("⚠️ ERROR: Could not delete character in CAD.")
end
end)
end)
RegisterNetEvent('ImperialCAD:QBFramework:CreateVehicle')
AddEventHandler('ImperialCAD:QBFramework:CreateVehicle', function(data, source)
local src = source
local discordId = getDiscordId(src)
local vehicle = data.vehicle
local plate = data.plate
local color = data.color
local make = data.make
if Config.debug then
print("✅ Vehicle purchase recevied: " .. vehicle .. " Purchased by " .. data.ssn .. " | Plate: " .. plate .. " Color is " .. color .. " | make is " .. make)
end
exports["ImperialCAD"]:CreateVehicle({
ssn = data.ssn,
model = data.vehicle,
plate = data.plate,
year = "2015",
make = make,
color = color
}, function(success, resultData)
if success then
print("✅ Vehicle registered successfully to CAD.")
end
end)
end)
end
-- NAT2K15 Integration
if Config.isNAT2K15 then
FWN = Config.resourceName
NAT = exports[FWN]:getServerFunctions()
-- Hook into the player character load event
RegisterNetEvent("NAT2K15:CHECKSQL")
AddEventHandler("NAT2K15:CHECKSQL", function(steam, discord, first_name, last_name, twt, dept, dob, gender, data, clientFramework)
local src = source
local discordId = getDiscordId(src)
if Config.debug then
print("✅ NatFW Load User Detected, Loading Character Data: " .. json.encode(data) .. " | Source: " .. src)
end
local charinfo = data
local fname = first_name
local lname = last_name
local gender = gender
local dob = dob
local phone = ""
-- Extract required values
local citizenid = data.char_id
local commId = GetConvar("imperial_community_id", "")
if not citizenid or citizenid == "" then
print("❌ ERROR: Citizen ID is missing!")
return
end
if not commId or commId == "" then
print("❌ ERROR: Community ID is missing! Check your server config.")
return
end
-- Check if character exists in CAD
if Config.debug then
print("Checking for character in CAD with CitizenID: " .. citizenid)
end
exports["ImperialCAD"]:GetCharacter(citizenid, commId, function(success, resultData)
if success then
print("✅ Character Data Found in CAD for CitizenID: " .. citizenid)
if Config.debug then
print("Result Data: " .. json.encode(resultData))
end
else
print("⚠️ Character NOT found in CAD. Creating new entry...")
if gender == "Male" then
gender = "MALE"
elseif gender == "Female" then
gender = "FEMALE"
end
-- If character isnt found, create a new one
exports["ImperialCAD"]:NewCharacter({
users_discordID = discordId,
Fname = fname,
Mname = "",
Lname = lname,
Birthdate = dob,
race = "nil",
hairC = "nil",
eyeC = "nil",
height = "6'",
weight = "150",
postal = nil,
address = "nil",
gender = gender,
city = "nil",
county = "nil",
phonenum = phone,
dlstatus = "VALID",
citizenid = citizenid
}, function(createSuccess, createResult)
if createSuccess then
print("✅ New Character Created in CAD for CitizenID: " .. citizenid)
if Config.debug then
print("Result Data: " .. json.encode(createResult))
end
else
print("⚠️ ERROR: Failed to create character in CAD for CitizenID: " .. citizenid)
end
end)
end
end)
end)
-- Hook into the character deletion event
RegisterNetEvent("NAT2K15:DELETEUSER")
AddEventHandler("NAT2K15:DELETEUSER", function(data)
local src = source
local discordId = getDiscordId(src)
local citizenid = data.char_id
if Config.debug then
print("Received Character Deletion Request: " .. citizenid)
end
exports["ImperialCAD"]:DeleteCharacter({
users_discordID = discordId,
citizenid = citizenid
}, function(success, resultData)
if success then
print("✅ Character was deleted in CAD")
else
print("⚠️ ERROR: Could not delete character in CAD.")
end
end)
end)
end -- end of nat
if Config.isQBX then -- Start of QBX, nothing in this works if not QBX
-- Hook into the player character load event
RegisterNetEvent('QBCore:Server:OnPlayerLoaded')
AddEventHandler('QBCore:Server:OnPlayerLoaded', function()
local src = source
local discordId = getDiscordId(src)
if Config.debug then
print("✅ QBXCore Load User Detected, Requesting Character Data for Source: "..src)
end
local data = exports.qbx_core:GetPlayer(source)
local cData = data.PlayerData
if Config.debug then
print('Recieved character data for '..src.." character data is: "..json.encode(cData))
end
if not cData or cData == nil then
print("Uhmmm, no information was found or the script failed. Returning instead")
return end
local charinfo = cData.charinfo
local fname = charinfo.firstname or "N?A"
local lname = charinfo.lastname or "N?A"
local gender = charinfo.gender or "N?A"
local dob = charinfo.birthdate or "N?A"
local phone = charinfo.phone or "N?A"
-- Extract required values
local citizenid = cData.citizenid
local commId = GetConvar("imperial_community_id", "")
if not citizenid or citizenid == "" then
print("❌ ERROR: Citizen ID is missing!")
return
end
if not commId or commId == "" then
print("❌ ERROR: Community ID is missing! Check your server config.")
return
end
-- Check if character exists in CAD
exports["ImperialCAD"]:GetCharacter(citizenid, commId, function(success, resultData)
if success then
print("✅ Character Data Found in CAD for CitizenID: " .. citizenid)
if Config.debug then
print("Result Data: " .. json.encode(resultData))
end
local res = resultData.response
local data = {
ssn = res.ssn,
name = res.Name,
address = res.address,
age = res.age
}
TriggerClientEvent('ImperialCAD:setActiveCiv', src, data)
else
if Config.debug then
print("⚠️ Character NOT found in CAD. Creating new entry...")
end
if gender == 0 then
gender = "MALE"
elseif gender == 1 then
gender = "FEMALE"
end
-- If character isnt found, create a new one
exports["ImperialCAD"]:NewCharacter({
users_discordID = discordId,
Fname = fname,
Mname = "",
Lname = lname,
Birthdate = dob,
race = "nil",
hairC = "nil",
eyeC = "nil",
height = "6'",
weight = "150",
postal = nil,
address = "nil",
gender = gender,
city = "nil",
county = "nil",
phonenum = phone,
dlstatus = "VALID",
citizenid = citizenid
}, function(createSuccess, createResult)
if createSuccess then
print("New Character Created in CAD for CitizenID: " .. citizenid)
if Config.debug then
print("Result Data: " .. json.encode(createResult))
end
local eventdata = json.decode(createResult)
local data = {
ssn = eventdata.response.ssn,
name = eventdata.response.name,
address = "Unknown Address",
age = eventdata.response.age
}
TriggerClientEvent('ImperialCAD:setActiveCiv', src, data)
else
print("⚠️ ERROR: Failed to create character in CAD for CitizenID: " .. citizenid)
end
end)
end
end)
end)
-- Hook into the character deletion event
RegisterNetEvent('qbx_core:server:deleteCharacter')
AddEventHandler('qbx_core:server:deleteCharacter', function(citizenid)
local src = source
local discordId = getDiscordId(src)
if Config.debug then
print("Received Character Deletion Request: " .. citizenid)
end
exports["ImperialCAD"]:DeleteCharacter({
users_discordID = discordId,
citizenid = citizenid
}, function(success, resultData)
if success then
print("✅ Character was deleted in CAD")
else
print("⚠️ ERROR: Could not delete character in CAD.")
end
end)
end)
-- Very hacky lazy workaround - I need to improve this | Purchasing
RegisterNetEvent('qbx_vehicleshop:server:buyShowroomVehicle')
AddEventHandler('qbx_vehicleshop:server:buyShowroomVehicle', function()
if Config.debug then print("Received QBX create new vehicle, registering for "..source) end
TriggerClientEvent('qbx_vehicleshop:imperial:client:boughtshowroomvehicle', source)
end)
-- Very hacky lazy workaround - I need to improve this | Financing
RegisterNetEvent('qbx_vehicleshop:server:financeVehicle')
AddEventHandler('qbx_vehicleshop:server:financeVehicle', function(downPayment, paymentAmount, buyVehicle)
if Config.debug then print("Received QBX create new vehicle, finance") end
TriggerClientEvent('qbx_vehicleshop:imperial:client:boughtshowroomvehicle', source)
end)
--Another lazy hacky method, but vehicle financed by sales guy?
RegisterNetEvent('qbx_vehicleshop:server:sellfinanceVehicle')
AddEventHandler('qbx_vehicleshop:server:sellfinanceVehicle', function(downPayment, paymentAmount, vehicle, playerId)
if Config.debug then print("Received QBX create new vehicle, finance sell by player") end
TriggerClientEvent('qbx_vehicleshop:imperial:client:boughtshowroomvehicle', playerId)
end)
--Another lazy hacky method, but vehicle purchase by sales guy?
RegisterNetEvent('qbx_vehicleshop:server:sellShowroomVehicle')
AddEventHandler('qbx_vehicleshop:server:sellShowroomVehicle', function(vehicle, playerId)
if Config.debug then print("Received QBX create new vehicle, purchase sell by player") end
TriggerClientEvent('qbx_vehicleshop:imperial:client:boughtshowroomvehicle', playerId)
end)
RegisterNetEvent('ImperialCAD:QBXFramework:CreateVehicle')
AddEventHandler('ImperialCAD:QBXFramework:CreateVehicle', function(data, source)
local src = source
local discordId = getDiscordId(src)
local vehicle = data.vehicle
local plate = data.plate
local color = data.color
local make = data.make
if Config.debug then
print("✅ Vehicle purchase recevied: " .. vehicle .. " Purchased by " .. data.ssn .. " | Plate: " .. plate .. " Color is " .. color .. " | make is " .. make)
end
exports["ImperialCAD"]:CreateVehicle({
ssn = data.ssn,
model = data.vehicle,
plate = data.plate,
year = "2015",
make = make,
color = color
}, function(success, resultData)
if success then
print("✅ Vehicle registered successfully to CAD.")
else
print("Unable to register vehicle to cad for: "..source)
end
end)
end)
end -- end QBX
@@ -0,0 +1,355 @@
--[[
Imperial Export for FiveM
DO NOT EDIT THIS FILE UNLESS YOU KNOW WHAT YOUR DOING!
]]--
local function checkConvar(name, description)
local value = GetConvar(name, "")
if not value or value == "" then
error(string.format("Could not find required Convar '%s' for %s.", name, description))
end
end
checkConvar("imperial_community_id", "ImperialCAD Community ID")
checkConvar("imperialAPI", "Imperial API key")
local function performAPIRequest(url, method, data, headers, callback)
method = method:upper()
if method == "GET" then
data = ""
else
data = json.encode(data)
end
PerformHttpRequest(url, function(errorCode, resultData, resultHeaders, errorData)
if errorCode ~= 200 then
if errorCode == 500 then
callback(false, "^1[IMPERIAL_API_CALLBACK]^7 request failed: Temporary Internal Error, Unable to retreive CAD data.")
return
end
if Config.debug then
print("^1[IMPERIAL_API_ERROR]^7 HTTP Error Code:", errorCode)
if errorData and errorData ~= "" then
print("^1[IMPERIAL_API_ERROR]^7 Response: " .. errorData)
elseif resultData and resultData ~= "" then
print("^1[IMPERIAL_API_ERROR]^7 Result Data (fallback): " .. resultData)
end
end
if callback then
if errorData and errorData ~= "" then
local jsonPart = errorData:match("{.*}")
if jsonPart then
callback(false, jsonPart)
else
callback(false, errorData)
end
else
callback(false, "^1[IMPERIAL_API_CALLBACK]^7 request failed: No response data")
end
end
return
end
local status
if resultData and resultData ~= "" then
local ok, body = pcall(json.decode, resultData)
if ok and type(body) == "table" then
status = body.status -- "error", "RATE_LIMIT", "success", "BUSY", "LIMIT_REACHED", "USER_LIMIT", "RESERVED"
end
end
if status and status ~= "success" then
if Config.debug then
print("^1[IMPERIAL_API_STATUS]^7 Non-success status in 200 response:", status)
print("^1[IMPERIAL_API_STATUS]^7 Raw Result Data:", resultData)
end
if callback then
callback(false, resultData or ("Status: " .. tostring(status)))
end
return
end
if callback then
if resultData and resultData ~= "" then
callback(true, resultData)
else
callback(true, "^1[IMPERIAL_API_CALLBACK]^7 request succeeded, But No response data was returned")
end
end
if Config.debug then
print("^1[IMPERIAL_API_DEBUG]^7 Result Data: " .. tostring(resultData))
end
end, method, data, headers)
end
function NewCharacter(data, callback)
local requestData = {
commId = GetConvar("imperial_community_id", ""),
users_discordID = data.users_discordID,
Fname = data.Fname,
Mname = data.Mname,
Lname = data.Lname,
Birthdate = data.Birthdate,
gender = data.gender,
race = data.race,
hairC = data.hairC,
eyeC = data.eyeC,
height = data.height,
weight = data.weight,
postal = data.postal,
address = data.address,
city = data.city,
county = data.county,
phonenum = data.phonenum,
dlstatus = data.dlstatus,
citizenid = data.citizenid
}
local headers = {
["Content-Type"] = "application/json",
["APIKEY"] = GetConvar("imperialAPI", "")
}
performAPIRequest("https://imperialcad.app/api/1.1/wf/NewCharacter", "POST", requestData, headers, callback)
if Config.debug then
print("[ImperialExport] Attemping to create a new civilian CAD character!")
end
end
function NewCharacterAdvanced(data, callback)
local requestData = {
commId = GetConvar("imperial_community_id", ""),
Fname = data.Fname,
Mname = data.Mname,
Lname = data.Lname,
Birthdate = data.Birthdate,
gender = data.gender,
race = data.race,
hairC = data.hairC,
eyeC = data.eyeC,
height = data.height,
weight = data.weight,
postal = data.postal,
address = data.address,
city = data.city,
county = data.county,
state = data.state,
phonenum = data.phonenum,
licensedetails = {
hasBoatLic = data.licensedetails.hasBoatLic,
hasCDL = data.licensedetails.hasCDL,
CDLNumber = data.licensedetails.CDLNumber,
CDLStatus = data.licensedetails.CDLStatus,
hasDL = data.licensedetails.hasDL,
DLNumber = data.licensedetails.DLNumber,
DLStatus = data.licensedetails.DLStatus,
hasFirearmsCertification = data.licensedetails.hasFirearmsCertification,
hasFishLic = data.licensedetails.hasFishLic,
hasHuntLic = data.licensedetails.hasHuntLic
},
misc = {
missing = data.misc.missing
}
}
local headers = {
["Content-Type"] = "application/json",
["APIKEY"] = GetConvar("imperialAPI", "")
}
performAPIRequest("https://imperialcad.app/api/1.1/wf/NewAdvancedCharacter", "POST", requestData, headers, callback)
if Config.debug then
print("[ImperialExport] Attemping to create a new civilian CAD character!")
end
end
function DeleteCharacter(data, callback)
local requestData = {
commId = GetConvar("imperial_community_id", ""),
users_discordID = data.users_discordID,
citizenid = data.citizenid
}
local headers = {
["Content-Type"] = "application/json",
["APIKEY"] = GetConvar("imperialAPI", "")
}
performAPIRequest("https://imperialcad.app/api/1.1/wf/DeleteCharacter", "POST", requestData, headers, callback)
if Config.debug then
print("[ImperialExport] Attemping to delete civilian CAD character!")
end
end
function GetCharacter(charid, commId, callback)
if not charid or charid == "" then
print("Invalid Character ID. It must not be empty.")
if callback then callback(false, "Invalid Character ID") end
return
end
if not commId or commId == "" then
print("Invalid Community ID. It must not be empty.")
if callback then callback(false, "Invalid Community ID") end
return
end
local url = string.format(
"http://imperialcad.app/api/1.1/wf/GetCharacter?charid=%s&commId=%s",
charid,
commId
)
performAPIRequest(url, "GET", nil, nil, function(success, response)
if response then
local data = json.decode(response)
if data.status == "success" then
print("Character retrieved: " .. json.encode(data))
if callback then callback(true, data) end
else
print("Character not found.")
if callback then callback(false, "Character not found.") end
end
else
print("API Request Failed: " .. response)
if callback then callback(false, response) end
end
end)
end
function GetCharacterAdvanced(Character, callback)
local firstname = Character.firstname
local lastname = Character.lastname
local commId = GetConvar("imperial_community_id", "")
if not firstname or not lastname then
print("Invalid Character table. It must not be empty and must contain a firstname and lastname.")
if callback then callback(false, "Invalid table") end
return
end
if not commId or commId == "" then
print("Invalid Community ID. It must not be empty.")
if callback then callback(false, "Invalid Community ID") end
return
end
local url = string.format(
"http://imperialcad.app/api/1.1/wf/GetCharacterAdvanced?firstname=%s&lastname=%s&commId=%s",
firstname,
lastname,
commId
)
performAPIRequest(url, "GET", nil, nil, function(success, response)
if response then
local data = json.decode(response)
if data.status == "success" then
print("[ADVANCED] Character retrieved: " .. json.encode(data.response))
if callback then callback(true, data) end
elseif data.status == "error" then
print("[ADVANCED] Character not found.")
if callback then callback(true, data) end
else
print("[ADVANCED] Character not found, Not an expected result")
if callback then callback(false, "Character not found.") end
end
else
print("API Request Failed: " .. response)
if callback then callback(false, response) end
end
end)
end
function CreateVehicle(data, callback)
local requestData = {
commId = GetConvar("imperial_community_id", ""),
ssn = data.ssn,
vehicleModel = data.model,
plate = data.plate,
year = data.year or "2015",
make = data.make or "UNKNOWN",
color = data.color
}
local headers = {
["Content-Type"] = "application/json",
["APIKEY"] = GetConvar("imperialAPI", "")
}
performAPIRequest("https://imperialcad.app/api/1.1/wf/registerVehicle", "POST", requestData, headers, callback)
if Config.debug then
print("[ImperialExport] Attemping to reigster " .. data.plate .. " to CAD!")
end
end
function SetActiveCiv(data, callback)
local requestData = {
commId = GetConvar("imperial_community_id", ""),
users_discordID = data.users_discordID,
ssn = data.ssn
}
local headers = {
["Content-Type"] = "application/json",
["APIKEY"] = GetConvar("imperialAPI", "")
}
performAPIRequest("https://imperialcad.app/api/1.1/wf/setActiveCivilian", "POST", requestData, headers, callback)
if Config.debug then
print(string.format("[ImperialExport] Attemping to set ssn %s as active civ for %s in CAD!", data.ssn, data.users_discordID))
end
end
function CreateVehicleAdvanced(data, callback)
local requestData = {
commId = GetConvar("imperial_community_id", ""),
vehicleData = {
plate = data.vehicleData.plate,
model = data.vehicleData.model,
Make = data.vehicleData.Make,
color = data.vehicleData.color,
year = data.vehicleData.year,
regState = data.vehicleData.regState,
regStatus = data.vehicleData.regStatus,
regExpDate = data.vehicleData.regExpDate,
vin = data.vehicleData.vin,
stolen = data.vehicleData.stolen
},
vehicleInsurance = {
hasInsurance = data.vehicleInsurance.hasInsurance,
insuranceStatus = data.vehicleInsurance.insuranceStatus,
insurancePolicyNum = data.vehicleInsurance.insurancePolicyNum
},
vehicleOwner = {
ownerSSN = data.vehicleOwner.ownerSSN,
ownerFirstName = data.vehicleOwner.ownerFirstName,
ownerLastName = data.vehicleOwner.ownerLastName,
ownerGender = data.vehicleOwner.ownerGender,
ownerAddress = data.vehicleOwner.ownerAddress,
ownerCity = data.vehicleOwner.ownerCity
}
}
local headers = {
["Content-Type"] = "application/json",
["APIKEY"] = GetConvar("imperialAPI", "")
}
performAPIRequest("https://imperialcad.app/api/1.1/wf/registeradvancedvehicle", "POST", requestData, headers, callback)
if Config.debug then
print("[ImperialExport_AdvancedVehReg] Attemping to register " .. requestData.vehicleData.plate .. " to CAD!")
end
end
exports('GetCharacter', GetCharacter)
exports('NewCharacter', NewCharacter)
exports('DeleteCharacter', DeleteCharacter)
exports('CreateVehicle', CreateVehicle)
exports('CreateVehicleAdvanced', CreateVehicleAdvanced)
exports('SetActiveCiv', SetActiveCiv)
@@ -0,0 +1,286 @@
--[[
Imperial Export for FiveM
DO NOT EDIT THIS FILE UNLESS YOU KNOW WHAT YOUR DOING!
]]--
local function checkConvar(name, description)
local value = GetConvar(name, "")
if not value or value == "" then
error(string.format("Could not find required Convar '%s' for %s.", name, description))
end
print(string.format("%s '%s' found.", description, name))
end
checkConvar("imperial_community_id", "ImperialCAD Community ID")
checkConvar("imperialAPI", "Imperial API key")
local function performAPIRequest(url, data, headers, callback)
PerformHttpRequest(url, function(errorCode, resultData, resultHeaders, errorData)
if errorCode ~= 200 then
if errorCode == 500 then
callback(false, "^1[IMPERIAL_API_CALLBACK]^7 request failed: ImperialCAD is having trouble, Unable to retreive CAD data.")
return
end
if Config.debug then
print("^1[IMPERIAL_API_ERROR]^7 HTTP Error Code:", errorCode)
if errorData and errorData ~= "" then
print("^1[IMPERIAL_API_ERROR]^7 Response: " .. errorData)
elseif resultData and resultData ~= "" then
print("^1[IMPERIAL_API_ERROR]^7 Result Data (fallback): " .. resultData)
end
end
if callback then
if errorData and errorData ~= "" then
local jsonPart = errorData:match("{.*}")
if jsonPart then
callback(false, jsonPart)
else
callback(false, errorData)
end
else
callback(false, "^1[IMPERIAL_API_CALLBACK]^7 request failed: No response data")
end
end
return
end
local status
if resultData and resultData ~= "" then
local ok, body = pcall(json.decode, resultData)
if ok and type(body) == "table" then
status = body.status -- "error", "RATE_LIMIT", "success", "BUSY", "LIMIT_REACHED", "USER_LIMIT", "RESERVED", etc.
end
end
if status and status ~= "success" then
if Config.debug then
print("^1[IMPERIAL_API_STATUS]^7 Non-success Result Data:", resultData)
end
if callback then
callback(false, resultData or ("Status: " .. tostring(status)))
end
return
end
if callback then
if resultData and resultData ~= "" then
callback(true, resultData)
else
callback(true, "^1[IMPERIAL_API_CALLBACK]^7 request succeeded, But No response data was returned")
end
end
if Config.debug then
print("^1[IMPERIAL_API_DEBUG]^7 Result Data: " .. tostring(resultData))
end
end, 'POST', json.encode(data), headers)
end
function Create911Call(data, callback)
local data = {
commId = GetConvar("imperial_community_id", ""),
name = data.name,
street = data.street,
cross_street = data.crossStreet,
info = data.info,
postal = data.postal,
city = data.city,
county = data.county
}
local headers = {
["Content-Type"] = "application/json",
["APIKEY"] = GetConvar("imperialAPI", "")
}
performAPIRequest("https://imperialcad.app/api/1.1/wf/911", data, headers, callback)
if Config.debug then
print("[Imperial_Export_Create911Call] Attemping to create a 911 call!")
end
end
function DeleteCall(data, callback)
local data = {
callId = data.callId,
discordId = data.discordId,
communityId = GetConvar("imperial_community_id", "")
}
local headers = {
["Content-Type"] = "application/json",
["APIKEY"] = GetConvar("imperialAPI", "")
}
performAPIRequest("https://imperialcad.app/api/1.1/wf/CallDelete", data, headers, callback)
if Config.debug then
print("[Imperial_Export_DeleteCall] Attemping to delete a call!")
end
end
function CreateCall(data, callback)
local data = {
commId = GetConvar("imperial_community_id", ""),
users_discordID = data.users_discordID,
street = data.street,
cross_street = data.crossStreet,
postal = data.postal,
city = data.city,
county = data.county,
info = data.info,
nature = data.nature,
status = data.status,
priority = data.priority
}
local headers = {
["Content-Type"] = "application/json",
["APIKEY"] = GetConvar("imperialAPI", "")
}
performAPIRequest("https://imperialcad.app/api/1.1/wf/CallCreate", data, headers, callback)
if Config.debug then
print("[Imperial_Export_CreateCall] Attemping to create a new call!")
end
end
function AttachCall(data, callback)
local data = {
commId = GetConvar("imperial_community_id", ""),
users_discordID = data.users_discordID,
callnum = data.callnum
}
local headers = {
["Content-Type"] = "application/json",
["APIKEY"] = GetConvar("imperialAPI", "")
}
performAPIRequest("https://imperialcad.app/api/1.1/wf/AttachCall", data, headers, callback)
if Config.debug then
print("[Imperial_Export_AttachCall] Attemping to attach player "..source.." to call "..data.callnum)
end
end
function NewCallNote(data, callback)
local data = {
commId = GetConvar("imperial_community_id", ""),
users_discordID = data.users_discordID,
description = data.description
}
local headers = {
["Content-Type"] = "application/json",
["APIKEY"] = GetConvar("imperialAPI", "")
}
performAPIRequest("https://imperialcad.app/api/1.1/wf/callnote", data, headers, callback)
if Config.debug then
print("[Imperial_Export_NewCallNote] Attemping to create a new call note!")
end
end
function Booter(data, callback)
local data = {
commId = GetConvar("imperial_community_id", ""),
users_discordID = data.users_discordID,
}
local headers = {
["Content-Type"] = "application/json",
["APIKEY"] = GetConvar("imperialAPI", "")
}
if Config.debug then
print("Discord ID:" .. data.users_discordID .. "Community ID:" .. data.commId)
end
performAPIRequest("https://imperialcad.app/api/1.1/wf/offduty", data, headers, callback)
if Config.debug then
print("[Imperial_Export_Booter] Attemping to boot a user from the cad!")
end
end
function Panic(data, callback)
local data = {
commId = GetConvar("imperial_community_id", ""),
users_discordID = data.users_discordID,
postal = data.postal,
street = data.street
}
local headers = {
["Content-Type"] = "application/json",
["APIKEY"] = GetConvar("imperialAPI", "")
}
performAPIRequest("https://imperialcad.app/api/1.1/wf/panic", data, headers, callback)
if Config.debug then
print("[Imperial_Export_Panic] Attemping to trigger a user panic in cad!")
end
end
function ClearPanic(callback)
local data = {
commId = GetConvar("imperial_community_id", "")
}
local headers = {
["Content-Type"] = "application/json",
["APIKEY"] = GetConvar("imperialAPI", "")
}
performAPIRequest("https://imperialcad.app/api/1.1/wf/clearpanic", data, headers, callback)
if Config.debug then
print("[Imperial_Export_ClearPanic] Attemping to to clear a community panic")
end
end
function CheckPlate(data, callback)
local data = {
communityId = GetConvar("imperial_community_id", ""),
plate = data.plate
}
local headers = {
["Content-Type"] = "application/json",
["APIKEY"] = GetConvar("imperialAPI", "")
}
performAPIRequest("https://imperialcad.app/api/1.1/wf/checkplate", data, headers, callback)
if Config.debug then
print("[Imperial_Export_CheckPlate] Attempting to check the plate " .. data.plate)
end
end
function GetUnit(data, callback)
local data = {
communityId = GetConvar("imperial_community_id", ""),
users_discordID = data.users_discordID
}
local headers = {
["Content-Type"] = "application/json",
["APIKEY"] = GetConvar("imperialAPI", "")
}
performAPIRequest("https://imperialcad.app/api/1.1/wf/GetUnit", data, headers, callback)
if Config.debug then
print("[Imperial_Export_CheckPlate] Attempting to get unit" .. data.plate)
end
end
exports('Create911Call', Create911Call)
exports('DeleteCall', DeleteCall)
exports('CreateCall', CreateCall)
exports('AttachCall', AttachCall)
exports('NewCallNote', NewCallNote)
exports('Booter', Booter)
exports('CheckPlate', CheckPlate)
exports('Panic', Panic)
exports('ClearPanic', ClearPanic)
exports('GetUnit', GetUnit)
+26
View File
@@ -0,0 +1,26 @@
--[[
Imperial Export for FiveM
DO NOT EDIT THIS FILE UNLESS YOU KNOW WHAT YOUR DOING!
]]--
function GenerateRandomString(length)
local charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
local result = ""
for i = 1, length do
local rand = math.random(1, #charset)
result = result .. charset:sub(rand, rand)
end
return result
end
--trys to find the discord ID
function getDiscordId(src)
if src == nil then return false end
local identifiers = GetPlayerIdentifiers(src)
for _, v in pairs(identifiers) do
if string.sub(v, 1, 8) == "discord:" then
return string.gsub(v, "discord:", "")
end
end
return false
end
+3
View File
@@ -0,0 +1,3 @@
{
"latestVersion": "1.2.4"
}
@@ -1,17 +0,0 @@
resource_manifest_version '77731fab-63ca-442c-a67b-abc70f28dfa5'
-- Leaked By: Leaking Hub | Joshua Y. | https://discord.gg/aXWXXst
files {
'vehicles.meta',
'carvariations.meta',
'carcols.meta',
'handling.meta',
'vehiclelayouts.meta',
}
data_file 'HANDLING_FILE' 'handling.meta'
data_file 'VEHICLE_METADATA_FILE' 'vehicles.meta'
data_file 'CARCOLS_FILE' 'carcols.meta'
data_file 'VEHICLE_VARIATION_FILE' 'carvariations.meta'
data_file 'VEHICLE_LAYOUTS_FILE' 'vehiclelayouts.meta'
File diff suppressed because it is too large Load Diff
@@ -1,62 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<CVehicleModelInfoVariation>
<variationData>
<Item>
<modelName>20legacyfpiu3</modelName>
<colors>
<Item>
<indices content="char_array">
0
134
0
64
64
64
64
</indices>
<liveries>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
</liveries>
</Item>
</colors>
<kits>
<Item>0_default_modkit</Item>
</kits>
<windowsWithExposedEdges/>
<plateProbabilities>
<Probabilities>
<Item>
<Name>Police guv plate</Name>
<Value value="100"/>
</Item>
</Probabilities>
</plateProbabilities>
<lightSettings value="234"/>
<sirenSettings value="2146798"/>
</Item>
</variationData>
</CVehicleModelInfoVariation>
@@ -1,67 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<CHandlingDataMgr>
<HandlingData>
<Item type="CHandlingData">
<handlingName>20fpiu</handlingName>
<fMass value="2404.000000" />
<fInitialDragCoeff value="8.000000" />
<fPercentSubmerged value="85.000000" />
<vecCentreOfMassOffset x="0.000000" y="0.000000" z="-0.055000" />
<vecInertiaMultiplier x="1.200000" y="1.30000" z="1.400000" />
<fDriveBiasFront value="0.420000" />
<nInitialDriveGears value="6" />
<fInitialDriveForce value="0.300000" />
<fDriveInertia value="1.500000" />
<fClutchChangeRateScaleUpShift value="2.300000" />
<fClutchChangeRateScaleDownShift value="2.300000" />
<fInitialDriveMaxFlatVel value="200.000000" />
<fBrakeForce value="2.000000" />
<fBrakeBiasFront value="0.650000" />
<fHandBrakeForce value="1.50000" />
<fSteeringLock value="42.000000" />
<fTractionCurveMax value="2.600000" />
<fTractionCurveMin value="2.300000" />
<fTractionCurveLateral value="22.500000" />
<fTractionSpringDeltaMax value="0.130000" />
<fLowSpeedTractionLossMult value="1.000000" />
<fCamberStiffnesss value="0.000000" />
<fTractionBiasFront value="0.450000" />
<fTractionLossMult value="0.900000" />
<fSuspensionForce value="2.000000" />
<fSuspensionCompDamp value="1.300000" />
<fSuspensionReboundDamp value="1.300000" />
<fSuspensionUpperLimit value="0.09000" />
<fSuspensionLowerLimit value="-0.120000" />
<fSuspensionRaise value="0.000000" />
<fSuspensionBiasFront value="0.500000" />
<fAntiRollBarForce value="1.000000" />
<fAntiRollBarBiasFront value="0.400000" />
<fRollCentreHeightFront value="0.250000" />
<fRollCentreHeightRear value="0.300000" />
<fCollisionDamageMult value="1.000000" />
<fWeaponDamageMult value="1.000000" />
<fDeformationDamageMult value="0.700000" />
<fEngineDamageMult value="1.500000" />
<fPetrolTankVolume value="65.000000" />
<fOilVolume value="5.000000" />
<fSeatOffsetDistX value="0.000000" />
<fSeatOffsetDistY value="0.000000" />
<fSeatOffsetDistZ value="0.000000" />
<nMonetaryValue value="50000" />
<strModelFlags>440010</strModelFlags>
<strHandlingFlags>1</strHandlingFlags>
<strDamageFlags>0</strDamageFlags>
<AIHandling>SPORTS_CAR</AIHandling>
<SubHandlingData>
<Item type="CCarHandlingData">
<fBackEndPopUpCarImpulseMult value="0.100000" />
<fBackEndPopUpBuildingImpulseMult value="0.030000" />
<fBackEndPopUpMaxDeltaSpeed value="0.600000" />
</Item>
<Item type="NULL" />
<Item type="NULL" />
</SubHandlingData>
</Item>
</HandlingData>
</CHandlingDataMgr>
@@ -1,54 +0,0 @@
--[[
Ultimate Lighting Controller Config
the ULC resource is required to use this configuration
get the resource here: https://github.com/Flohhhhh/ultimate-lighting-controller/releases/latest
To learn how to setup and use ULC visit here: https://docs.dwnstr.com/ulc/overview
]]
return {names = {"20legacyfpiu3"},
steadyBurnConfig = {
forceOn = false, useTime = false,
disableWithLights = true,
sbExtras = {11}
},
parkConfig = {
usePark = true,
useSync = false,
syncWith = {},
pExtras = {5,6,7,8,9},
dExtras = {1,2,3,4}
},
hornConfig = {
useHorn = false,
hornExtras = {},
},
brakeConfig = {
useBrakes = true,
speedThreshold = 4,
brakeExtras = {12},
disableExtras = {}
},
reverseConfig = {
useReverse = false,
reverseExtras = {}
},
doorConfig = {
useDoors = false,
driverSide = {enable = {}, disable = {}},
passSide = {enable = {}, disable = {}},
trunk = {enable ={}, disable = {}}
},
buttons = {
{label = "PARK FRONT", key = 2, color = "green", extra = 5, linkedExtras = {6,7}, oppositeExtras = {}, offExtras = {}, repair = false},
{label = "PARK REAR", key = 3, color = "green", extra = 8, linkedExtras = {9}, oppositeExtras = {}, offExtras = {}, repair = false},
{label = "DRIVE", key = 4, color = "green", extra = 1, linkedExtras = {2,3,4}, oppositeExtras = {}, offExtras = {}, repair = false},
{label = "TAKEDOWN", key = 1, color = "green", extra = 10, linkedExtras = {}, oppositeExtras = {}, offExtras = {}, repair = false},
{label = "STEADY", key = 5, color = "green", extra = 11, linkedExtras = {}, oppositeExtras = {}, offExtras = {}, repair = false},
},
defaultStages = {
useDefaults = false,
enableKeys = {3},
disableKeys = {1,2,4,11}
}
}
@@ -1,143 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<CVehicleModelInfo__InitDataList>
<residentTxd>vehshare</residentTxd>
<residentAnims />
<InitDatas>
<Item>
<modelName>20legacyfpiu3</modelName>
<txdName>20legacyfpiu3</txdName>
<handlingId>20Fpiu</handlingId>
<gameName>20legacyfpiu3</gameName>
<vehicleMakeName />
<expressionDictName>null</expressionDictName>
<expressionName>null</expressionName>
<animConvRoofDictName>null</animConvRoofDictName>
<animConvRoofName>null</animConvRoofName>
<animConvRoofWindowsAffected />
<ptfxAssetName>null</ptfxAssetName>
<audioNameHash>ecoboostv6</audioNameHash>
<layout>LAYOUT_STD_EXITFIXUP</layout>
<coverBoundOffsets>POLICE3_COVER_OFFSET_INFO</coverBoundOffsets>
<explosionInfo>EXPLOSION_INFO_DEFAULT</explosionInfo>
<scenarioLayout />
<cameraName>DEFAULT_FOLLOW_VEHICLE_CAMERA</cameraName>
<aimCameraName>MID_BOX_VEHICLE_AIM_CAMERA</aimCameraName>
<bonnetCameraName>VEHICLE_BONNET_CAMERA_MID_NEAR</bonnetCameraName>
<povCameraName>DEFAULT_POV_CAMERA</povCameraName>
<FirstPersonDriveByIKOffset x="0.000000" y="-0.060000" z="-0.030000" />
<FirstPersonDriveByUnarmedIKOffset x="0.000000" y="0.000000" z="-0.020000" />
<FirstPersonProjectileDriveByIKOffset x="0.055000" y="-0.075000" z="-0.045000" />
<FirstPersonProjectileDriveByPassengerIKOffset x="-0.055000" y="-0.075000" z="-0.045000" />
<FirstPersonProjectileDriveByRearLeftIKOffset x="0.000000" y="0.000000" z="0.000000" />
<FirstPersonProjectileDriveByRearRightIKOffset x="0.000000" y="0.000000" z="0.000000" />
<FirstPersonDriveByLeftPassengerIKOffset x="0.000000" y="0.000000" z="0.000000" />
<FirstPersonDriveByRightPassengerIKOffset x="0.000000" y="-0.060000" z="-0.030000" />
<FirstPersonDriveByRightRearPassengerIKOffset x="0.000000" y="0.000000" z="0.000000" />
<FirstPersonDriveByLeftPassengerUnarmedIKOffset x="0.000000" y="0.000000" z="0.000000" />
<FirstPersonDriveByRightPassengerUnarmedIKOffset x="0.000000" y="0.000000" z="0.000000" />
<FirstPersonMobilePhoneOffset x="0.130000" y="0.275000" z="0.530000" />
<FirstPersonPassengerMobilePhoneOffset x="0.136000" y="0.223000" z="0.425000" />
<FirstPersonMobilePhoneSeatIKOffset>
<Item>
<Offset x="0.136000" y="0.156000" z="0.445000" />
<SeatIndex value="2" />
</Item>
<Item>
<Offset x="0.136000" y="0.156000" z="0.445000" />
<SeatIndex value="3" />
</Item>
</FirstPersonMobilePhoneSeatIKOffset>
<PovCameraOffset x="0.000000" y="-0.175000" z="0.675000" />
<PovCameraVerticalAdjustmentForRollCage value="0.000000" />
<PovPassengerCameraOffset x="0.000000" y="0.000000" z="0.000000" />
<PovRearPassengerCameraOffset x="0.000000" y="0.000000" z="0.000000" />
<vfxInfoName>VFXVEHICLEINFO_CAR_GENERIC</vfxInfoName>
<shouldUseCinematicViewMode value="true" />
<shouldCameraTransitionOnClimbUpDown value="false" />
<shouldCameraIgnoreExiting value="false" />
<AllowPretendOccupants value="true" />
<AllowJoyriding value="false" />
<AllowSundayDriving value="false" />
<AllowBodyColorMapping value="false" />
<wheelScale value="0.244000" />
<wheelScaleRear value="0.244000" />
<dirtLevelMin value="0.000000" />
<dirtLevelMax value="0.300000" />
<envEffScaleMin value="0.000000" />
<envEffScaleMax value="1.000000" />
<envEffScaleMin2 value="0.000000" />
<envEffScaleMax2 value="1.000000" />
<damageMapScale value="0.600000" />
<damageOffsetScale value="1.000000" />
<diffuseTint value="0x00FFFFFF" />
<steerWheelMult value="1.000000" />
<HDTextureDist value="5.000000" />
<lodDistances content="float_array">
1500.000000
3000.000000
7000.000000
14000.000000
50000.000000
50000.000000
</lodDistances>
<minSeatHeight value="0.83" />
<identicalModelSpawnDistance value="20" />
<maxNumOfSameColor value="10" />
<defaultBodyHealth value="1000.000000" />
<pretendOccupantsScale value="1.000000" />
<visibleSpawnDistScale value="1.000000" />
<trackerPathWidth value="2.000000" />
<weaponForceMult value="1.000000" />
<frequency value="100" />
<swankness>SWANKNESS_0</swankness>
<maxNum value="2" />
<flags>FLAG_EXTRAS_STRONG FLAG_HAS_LIVERY FLAG_EXTRAS_ALL FLAG_LAW_ENFORCEMENT FLAG_EMERGENCY_SERVICE FLAG_NO_RESPRAY FLAG_DONT_SPAWN_IN_CARGEN FLAG_HAS_INTERIOR_EXTRAS FLAG_REPORT_CRIME_IF_STANDING_ON</flags>
<type>VEHICLE_TYPE_CAR</type>
<plateType>VPT_BACK_PLATES</plateType>
<dashboardType>VDT_FEROCI</dashboardType>
<vehicleClass>VC_EMERGENCY</vehicleClass>
<wheelType>VWT_SPORT</wheelType>
<trailers />
<additionalTrailers />
<drivers>
<Item>
<driverName>S_M_Y_Cop_01</driverName>
<npcName />
</Item>
</drivers>
<extraIncludes />
<doorsWithCollisionWhenClosed />
<driveableDoors />
<bumpersNeedToCollideWithMap value="false" />
<needsRopeTexture value="false" />
<requiredExtras />
<rewards>
<Item>REWARD_WEAPON_PUMPSHOTGUN</Item>
<Item>REWARD_AMMO_PUMPSHOTGUN_ENTER_VEHICLE</Item>
<Item>REWARD_STAT_WEAPON</Item>
</rewards>
<cinematicPartCamera>
<Item>WHEEL_FRONT_RIGHT_CAMERA</Item>
<Item>WHEEL_FRONT_LEFT_CAMERA</Item>
<Item>WHEEL_REAR_RIGHT_CAMERA</Item>
<Item>WHEEL_REAR_LEFT_CAMERA</Item>
</cinematicPartCamera>
<NmBraceOverrideSet />
<buoyancySphereOffset x="0.000000" y="0.000000" z="0.000000" />
<buoyancySphereSizeScale value="1.000000" />
<pOverrideRagdollThreshold type="NULL" />
<firstPersonDrivebyData>
<Item>STD_POLICE3_FRONT_LEFT</Item>
<Item>STD_POLICE3_FRONT_RIGHT</Item>
<Item>STD_POLICE2_REAR_LEFT</Item>
<Item>STD_POLICE2_REAR_RIGHT</Item>
</firstPersonDrivebyData>
</Item>
</InitDatas>
<txdRelationships>
<Item>
<parent>vehicles_feroci_interior</parent>
<child>FPIUK</child>
</Item>
</txdRelationships>
</CVehicleModelInfo__InitDataList>
+3 -8
View File
@@ -136,8 +136,6 @@ SIREN_ASSIGNMENTS = {
['lafdengine'] = { 42, 43, 44, 45 },
['lafdrambulance'] = { 42, 43, 44, 45 },
['24ramambo'] = { 42, 43, 44, 45 },
['e350vanb'] = { 34, 37, 36, 39, 40, 41 },
['e450ambo'] = { 34, 37, 36, 39, 40, 41 },
['202346gmc'] = { 34, 37, 36, 39, 40, 41 },
['ltundra'] = { 34, 37, 36, 39, 40, 41 },
['11firevic'] = { 34, 37, 36, 39, 40, 41 },
@@ -154,9 +152,6 @@ SIREN_ASSIGNMENTS = {
['f250ambo'] = { 34, 37, 36, 31, 32, 33 },
['fd14tahoe'] = { 34, 37, 36, 39, 40, 41 },
['fd20exp'] = { 34, 37, 36, 39, 40, 41 },
['medic22'] = { 34, 37, 36, 39, 40, 41 },
['medic1a'] = { 34, 37, 36, 39, 40, 41 },
['medic1b'] = { 34, 37, 36, 39, 40, 41 },
['ram20pov'] = { 34, 37, 36, 39, 40, 41 },
['safr_fleet'] = { 34, 37, 36, 39, 40, 41 },
['walkinarrow'] = { 34, 37, 36, 39, 40, 41 },
@@ -294,10 +289,10 @@ SIREN_ASSIGNMENTS = {
['senorapd18fpiu_817'] = { 18, 19, 20},
['transportram'] = { 18, 19, 20},
['20legacyfpiu3'] = { 46, 47, 48, 49, 50, 51 },
['20legacyfpiu3'] = { 46, 55, 56, 19, 20, 51 },
['lasd25fpiu'] = { 46, 55, 56 },
['lib20fpiu'] = { 46, 47, 48, 49, 50, 51 },
['25legacyrango1'] = { 28, 29, 30, 31, 32, 33 },
['lib20fpiu'] = { 46, 55, 18, 25, 22, 51 },
['25legacyrango1'] = { 46, 19, 55, 56, 29, 51 },
['lasd1997paramount'] = { 18, 19, 20},
['lasd1998'] = { 18, 19, 20},
-16
View File
@@ -1,16 +0,0 @@
resource_manifest_version '77731fab-63ca-442c-a67b-abc70f28dfa5'
files {
'vehicles.meta',
'carvariations.meta',
'carcols.meta',
'handling.meta',
'vehiclelayouts.meta',
}
data_file 'HANDLING_FILE' 'handling.meta'
data_file 'VEHICLE_METADATA_FILE' 'vehicles.meta'
data_file 'CARCOLS_FILE' 'carcols.meta'
data_file 'VEHICLE_VARIATION_FILE' 'carvariations.meta'
data_file 'VEHICLE_LAYOUTS_FILE' 'vehiclelayouts.meta'
-961
View File
@@ -1,961 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<CVehicleModelInfoVarGlobal>
<Kits>
<Item>
<kitName>maxchasrt_modkit</kitName>
<id value="8327" />
<kitType>MKT_SPECIAL</kitType>
<visibleMods>
<Item>
<modelName>maxchasrt_interior_1</modelName>
<modShopLabel>maxchasrt_interior_1</modShopLabel>
<linkedModels />
<turnOffBones />
<type>VMT_INTERIOR1</type>
<bone>chassis</bone>
<collisionBone>chassis</collisionBone>
<cameraPos>VMCP_DEFAULT</cameraPos>
<audioApply value="1.000000" />
<weight value="20" />
<turnOffExtra value="false" />
<disableBonnetCamera value="false" />
<allowBonnetSlide value="true" />
</Item>
<Item>
<modelName>maxchasrt_interior_2</modelName>
<modShopLabel>maxchasrt_interior_2</modShopLabel>
<linkedModels />
<turnOffBones />
<type>VMT_INTERIOR1</type>
<bone>chassis</bone>
<collisionBone>chassis</collisionBone>
<cameraPos>VMCP_DEFAULT</cameraPos>
<audioApply value="1.000000" />
<weight value="20" />
<turnOffExtra value="false" />
<disableBonnetCamera value="false" />
<allowBonnetSlide value="true" />
</Item>
<Item>
<modelName>maxchasrt_trunk_1</modelName>
<modShopLabel>maxchasrt_trunk_1</modShopLabel>
<linkedModels />
<turnOffBones />
<type>VMT_SPOILER</type>
<bone>boot</bone>
<collisionBone>boot</collisionBone>
<cameraPos>VMCP_DEFAULT</cameraPos>
<audioApply value="1.000000" />
<weight value="20" />
<turnOffExtra value="false" />
<disableBonnetCamera value="false" />
<allowBonnetSlide value="true" />
</Item>
<Item>
<modelName>maxchasrt_trunk_2</modelName>
<modShopLabel>maxchasrt_trunk_2</modShopLabel>
<linkedModels />
<turnOffBones />
<type>VMT_SPOILER</type>
<bone>boot</bone>
<collisionBone>boot</collisionBone>
<cameraPos>VMCP_DEFAULT</cameraPos>
<audioApply value="1.000000" />
<weight value="20" />
<turnOffExtra value="false" />
<disableBonnetCamera value="false" />
<allowBonnetSlide value="true" />
</Item>
<Item>
<modelName>maxchasrt_trunk_3</modelName>
<modShopLabel>maxchasrt_trunk_3</modShopLabel>
<linkedModels />
<turnOffBones />
<type>VMT_SPOILER</type>
<bone>boot</bone>
<collisionBone>boot</collisionBone>
<cameraPos>VMCP_DEFAULT</cameraPos>
<audioApply value="1.000000" />
<weight value="20" />
<turnOffExtra value="false" />
<disableBonnetCamera value="false" />
<allowBonnetSlide value="true" />
</Item>
</visibleMods>
<statMods>
<Item>
<identifier/>
<modifier value="25"/>
<audioApply value="1.00000000"/>
<weight value="20"/>
<type>VMT_ENGINE</type>
</Item>
<Item>
<identifier/>
<modifier value="50"/>
<audioApply value="1.00000000"/>
<weight value="20"/>
<type>VMT_ENGINE</type>
</Item>
<Item>
<identifier/>
<modifier value="75"/>
<audioApply value="1.00000000"/>
<weight value="20"/>
<type>VMT_ENGINE</type>
</Item>
<Item>
<identifier/>
<modifier value="100"/>
<audioApply value="1.00000000"/>
<weight value="20"/>
<type>VMT_ENGINE</type>
</Item>
<Item>
<identifier/>
<modifier value="25"/>
<audioApply value="1.00000000"/>
<weight value="5"/>
<type>VMT_BRAKES</type>
</Item>
<Item>
<identifier/>
<modifier value="50"/>
<audioApply value="1.00000000"/>
<weight value="5"/>
<type>VMT_BRAKES</type>
</Item>
<Item>
<identifier/>
<modifier value="100"/>
<audioApply value="1.00000000"/>
<weight value="5"/>
<type>VMT_BRAKES</type>
</Item>
<Item>
<identifier/>
<modifier value="25"/>
<audioApply value="1.00000000"/>
<weight value="5"/>
<type>VMT_GEARBOX</type>
</Item>
<Item>
<identifier/>
<modifier value="50"/>
<audioApply value="1.00000000"/>
<weight value="5"/>
<type>VMT_GEARBOX</type>
</Item>
<Item>
<identifier/>
<modifier value="100"/>
<audioApply value="1.00000000"/>
<weight value="5"/>
<type>VMT_GEARBOX</type>
</Item>
<Item>
<identifier/>
<modifier value="5"/>
<audioApply value="1.00000000"/>
<weight value="0"/>
<type>VMT_SUSPENSION</type>
</Item>
<Item>
<identifier/>
<modifier value="10"/>
<audioApply value="1.00000000"/>
<weight value="0"/>
<type>VMT_SUSPENSION</type>
</Item>
<Item>
<identifier/>
<modifier value="15"/>
<audioApply value="1.00000000"/>
<weight value="0"/>
<type>VMT_SUSPENSION</type>
</Item>
<Item>
<identifier/>
<modifier value="20"/>
<audioApply value="1.00000000"/>
<weight value="0"/>
<type>VMT_SUSPENSION</type>
</Item>
</statMods>
</Item>
</Kits>
<Sirens>
<Item>
<id value="8234623"/>
<name>maxchasrt</name>
<timeMultiplier value="1.00000000"/>
<lightFalloffMax value="80.00000000" />
<lightFalloffExponent value="52.00000000" />
<lightInnerConeAngle value="2.30000000" />
<lightOuterConeAngle value="70.00000000" />
<lightOffset value="0.00000000"/>
<textureName>VehicleLight_sirenlight</textureName>
<sequencerBpm value="1200"/>
<leftHeadLight>
<sequencer value="0"/>
</leftHeadLight>
<rightHeadLight>
<sequencer value="0"/>
</rightHeadLight>
<leftTailLight>
<sequencer value="0"/>
</leftTailLight>
<rightTailLight>
<sequencer value="0"/>
</rightTailLight>
<leftHeadLightMultiples value="1"/>
<rightHeadLightMultiples value="1"/>
<leftTailLightMultiples value="1"/>
<rightTailLightMultiples value="1"/>
<useRealLights value="true"/>
<sirens>
<!-- Siren 1 blue front -->
<Item>
<rotation>
<delta value="0.000000000"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="4041418792"/>
<multiples value="1"/>
<direction value="false"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="0.000000000"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="4041418792"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="0"/>
<size value="0.000"/>
<pull value="0.02000000"/>
<faceCamera value="false"/>
</corona>
<color value="0xFF0000FF"/>
<intensity value="20.000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="100"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="true"/>
</Item>
<!-- Siren 2 red front -->
<Item>
<rotation>
<delta value="0.000000000"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="253543045"/>
<multiples value="1"/>
<direction value="false"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="0.000000000"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="253543045"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="0"/>
<size value="0.000"/>
<pull value="0.02000000"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFF0000"/>
<intensity value="20.000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="100"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="true"/>
</Item>
<!-- Siren 3 blue front -->
<Item>
<rotation>
<delta value="0.000000000"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="4278255360"/>
<multiples value="1"/>
<direction value="false"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="0.000000000"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="4278255360"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="0"/>
<size value="0.000"/>
<pull value="0.02000000"/>
<faceCamera value="false"/>
</corona>
<color value="0xFF0000FF"/>
<intensity value="20.000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="100"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="true"/>
</Item>
<!-- Siren 4 red front -->
<Item>
<rotation>
<delta value="0.000000000"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="16711935"/>
<multiples value="1"/>
<direction value="false"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="0.000000000"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="16711935"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="0"/>
<size value="0.000"/>
<pull value="0.02000000"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFF0000"/>
<intensity value="20.000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="100"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="true"/>
</Item>
<!-- Siren 5 blue front -->
<Item>
<rotation>
<delta value="0.000000000"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="2821327552"/>
<multiples value="1"/>
<direction value="false"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="0.000000000"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="2821327552"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="0"/>
<size value="0.000"/>
<pull value="0.02000000"/>
<faceCamera value="false"/>
</corona>
<color value="0xFF0000FF"/>
<intensity value="20.000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="100"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="true"/>
</Item>
<!-- Siren 6 red front -->
<Item>
<rotation>
<delta value="0.000000000"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="88166443"/>
<multiples value="1"/>
<direction value="false"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="0.000000000"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="88166443"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="0"/>
<size value="0.000"/>
<pull value="0.02000000"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFF0000"/>
<intensity value="20.000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="100"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="true"/>
</Item>
<!-- Siren 7 blue front -->
<Item>
<rotation>
<delta value="0.000000000"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="2726955650"/>
<multiples value="1"/>
<direction value="false"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="0.000000000"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="2726955650"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="0"/>
<size value="0.000"/>
<pull value="0.02000000"/>
<faceCamera value="false"/>
</corona>
<color value="0xFF0000FF"/>
<intensity value="20.000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="100"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="true"/>
</Item>
<!-- Siren 8 red front -->
<Item>
<rotation>
<delta value="0.000000000"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="340873300"/>
<multiples value="1"/>
<direction value="false"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="0.000000000"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="340873300"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="0"/>
<size value="0.000"/>
<pull value="0.02000000"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFF0000"/>
<intensity value="20.000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="100"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="true"/>
</Item>
<!-- Siren 9 blue back -->
<Item>
<rotation>
<delta value="3.14159265"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="2726955650"/>
<multiples value="1"/>
<direction value="false"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="3.14159265"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="2726955650"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="0"/>
<size value="0.000"/>
<pull value="0.02000000"/>
<faceCamera value="false"/>
</corona>
<color value="0xFF0000FF"/>
<intensity value="20.000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="100"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="true"/>
</Item>
<!-- Siren 10 red back -->
<Item>
<rotation>
<delta value="3.14159265"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="340873300"/>
<multiples value="1"/>
<direction value="false"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="3.14159265"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="340873300"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="0"/>
<size value="0.000"/>
<pull value="0.02000000"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFF0000"/>
<intensity value="20.000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="100"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="true"/>
</Item>
<!-- Siren 11 blue back -->
<Item>
<rotation>
<delta value="3.14159265"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="4261477888"/>
<multiples value="1"/>
<direction value="false"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="3.14159265"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="4261477888"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="0"/>
<size value="0.000"/>
<pull value="0.02000000"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFF0000"/>
<intensity value="20.000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="100"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="true"/>
</Item>
<!-- Siren 12 red back -->
<Item>
<rotation>
<delta value="3.14159265"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="16646396"/>
<multiples value="1"/>
<direction value="false"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="3.14159265"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="16646396"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="0"/>
<size value="0.000"/>
<pull value="0.02000000"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFF0000"/>
<intensity value="20.000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="100"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="true"/>
</Item>
<!-- Siren 13 blue back -->
<Item>
<rotation>
<delta value="3.14159265"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="4261477888"/>
<multiples value="1"/>
<direction value="false"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="3.14159265"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="4261477888"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="0"/>
<size value="0.000"/>
<pull value="0.02000000"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFFFFFF"/>
<intensity value="20.000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="100"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="true"/>
</Item>
<!-- Siren 14 red back -->
<Item>
<rotation>
<delta value="0.000000000"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="2726955650"/>
<multiples value="1"/>
<direction value="false"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="0.000000000"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="2726955650"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="0"/>
<size value="0.000"/>
<pull value="0.02000000"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFF0000"/>
<intensity value="0.000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="100"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="true"/>
</Item>
<!-- Siren 15 blue back -->
<Item>
<rotation>
<delta value="-1.57079633"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="2726955650"/>
<multiples value="1"/>
<direction value="false"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="-1.57079633"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="2726955650"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="0"/>
<size value="0.000"/>
<pull value="0.02000000"/>
<faceCamera value="false"/>
</corona>
<color value="0xFF0000FF"/>
<intensity value="20.000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="100"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="true"/>
</Item>
<!-- Siren 16 red back -->
<Item>
<rotation>
<delta value="1.57079633"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="340873300"/>
<multiples value="1"/>
<direction value="false"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="1.57079633"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="340873300"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="0"/>
<size value="0.000"/>
<pull value="0.02000000"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFF0000"/>
<intensity value="20.000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="100"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="true"/>
</Item>
<!-- Siren 17 blue left -->
<Item>
<rotation>
<delta value="3.14159265"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="2726955650"/>
<multiples value="1"/>
<direction value="false"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="3.14159265"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="2726955650"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="0"/>
<size value="0.000"/>
<pull value="0.02000000"/>
<faceCamera value="false"/>
</corona>
<color value="0xFF0000FF"/>
<intensity value="20.000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="100"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="true"/>
</Item>
<!-- Siren 18 red right -->
<Item>
<rotation>
<delta value="3.14159265"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="340873300"/>
<multiples value="1"/>
<direction value="false"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="3.14159265"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="340873300"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="0"/>
<size value="0.000"/>
<pull value="0.02000000"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFF0000"/>
<intensity value="20.000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="100"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="true"/>
</Item>
<!-- Siren 19 red right -->
<Item>
<rotation>
<delta value="-1.57079633"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="340873300"/>
<multiples value="1"/>
<direction value="false"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="-1.57079633"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="340873300"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="0"/>
<size value="0.000"/>
<pull value="0.02000000"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFF0000"/>
<intensity value="20.000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="100"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="true"/>
</Item>
<!-- Siren 20 red right -->
<Item>
<rotation>
<delta value="1.57079633"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="340873300"/>
<multiples value="1"/>
<direction value="false"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="1.57079633"/>
<start value="0.00000000"/>
<speed value="1.000"/>
<sequencer value="340873300"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="0"/>
<size value="0.000"/>
<pull value="0.02000000"/>
<faceCamera value="false"/>
</corona>
<color value="0xFF0000FF"/>
<intensity value="20.000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="100"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="true"/>
</Item>
</sirens>
</Item>
</Sirens>
</CVehicleModelInfoVarGlobal>
-43
View File
@@ -1,43 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<CVehicleModelInfoVariation>
<variationData>
<Item>
<modelName>maxchasrt</modelName>
<colors>
<Item>
<indices content="char_array">
32
28
0
156
</indices>
<liveries>
<Item value="true" />
<Item value="false" />
<Item value="false" />
<Item value="false" />
<Item value="false" />
<Item value="false" />
<Item value="false" />
<Item value="false" />
</liveries>
</Item>
</colors>
<kits>
<Item>maxchasrt_modkit</Item>
</kits>
<windowsWithExposedEdges />
<plateProbabilities>
<Probabilities>
<Item>
<Name>Standard White</Name>
<Value value="100" />
</Item>
</Probabilities>
</plateProbabilities>
<lightSettings value="0" />
<sirenSettings value="8234623" />
</Item>
</variationData>
</CVehicleModelInfoVariation>
-67
View File
@@ -1,67 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<CHandlingDataMgr>
<HandlingData>
<Item type="CHandlingData">
<handlingName>maxchasrt</handlingName>
<fMass value="1850.000000" />
<fInitialDragCoeff value="6.000000" />
<fPercentSubmerged value="85.000000" />
<vecCentreOfMassOffset x="0.000000" y="0.000000" z="0.000000" />
<vecInertiaMultiplier x="1.000000" y="1.600000" z="1.600000" />
<fDriveBiasFront value="0.300000" />
<nInitialDriveGears value="8" />
<fInitialDriveForce value="0.400000" />
<fDriveInertia value="1.000000" />
<fClutchChangeRateScaleUpShift value="2.000000" />
<fClutchChangeRateScaleDownShift value="2.000000" />
<fInitialDriveMaxFlatVel value="250.000000" />
<fBrakeForce value="0.700000" />
<fBrakeBiasFront value="0.650000" />
<fHandBrakeForce value="0.800000" />
<fSteeringLock value="38.000000" />
<fTractionCurveMax value="2.800000" />
<fTractionCurveMin value="2.400000" />
<fTractionCurveLateral value="32.500000" />
<fTractionSpringDeltaMax value="0.150000" />
<fLowSpeedTractionLossMult value="0.200000" />
<fCamberStiffnesss value="0.000000" />
<fTractionBiasFront value="0.505000" />
<fTractionLossMult value="0.520000" />
<fSuspensionForce value="2.100000" />
<fSuspensionCompDamp value="1.400000" />
<fSuspensionReboundDamp value="2.200000" />
<fSuspensionUpperLimit value="0.090000" />
<fSuspensionLowerLimit value="-0.120000" />
<fSuspensionRaise value="0.000000" />
<fSuspensionBiasFront value="0.470000" />
<fAntiRollBarForce value="1.100000" />
<fAntiRollBarBiasFront value="0.550000" />
<fRollCentreHeightFront value="0.360000" />
<fRollCentreHeightRear value="0.360000" />
<fCollisionDamageMult value="1.700000" />
<fWeaponDamageMult value="1.000000" />
<fDeformationDamageMult value="1.500000" />
<fEngineDamageMult value="1.500000" />
<fPetrolTankVolume value="60.000000" />
<fOilVolume value="4.500000" />
<fSeatOffsetDistX value="0.000000" />
<fSeatOffsetDistY value="-0.100000" />
<fSeatOffsetDistZ value="0.100000" />
<nMonetaryValue value="150000" />
<strModelFlags>440010</strModelFlags>
<strHandlingFlags>0</strHandlingFlags>
<strDamageFlags>0</strDamageFlags>
<AIHandling>AVERAGE</AIHandling>
<SubHandlingData>
<Item type="CCarHandlingData">
<fBackEndPopUpCarImpulseMult value="0.100000" />
<fBackEndPopUpBuildingImpulseMult value="0.030000" />
<fBackEndPopUpMaxDeltaSpeed value="0.600000" />
</Item>
<Item type="NULL" />
<Item type="NULL" />
</SubHandlingData>
</Item>
</HandlingData>
</CHandlingDataMgr>
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
-60
View File
@@ -1,60 +0,0 @@
--[[
Ultimate Lighting Controller Config
the ULC resource is required to use this configuration
get the resource here: https://github.com/Flohhhhh/ultimate-lighting-controller/releases/latest
To learn how to setup and use ULC visit here: https://docs.dwnstr.com/ulc/overview
]]
return {names = {"maxchasrt"},
steadyBurnConfig = {
forceOn = false, useTime = false,
disableWithLights = false,
sbExtras = {}
},
parkConfig = {
usePark = false,
useSync = false,
syncWith = {},
pExtras = {},
dExtras = {}
},
hornConfig = {
useHorn = false,
hornExtras = {},
disableExtras = {}
},
brakeConfig = {
useBrakes = false,
speedThreshold = 3,
brakeExtras = {},
disableExtras = {}
},
reverseConfig = {
useReverse = false,
reverseExtras = {},
disableExtras = {}
},
doorConfig = {
useDoors = false,
driverSide = {enable = {}, disable = {}},
passSide = {enable = {}, disable = {}},
trunk = {enable ={}, disable = {}}
},
buttons = {
{label = "Front Lights", key = 1, color = "green", extra = 4, linkedExtras = {5}, oppositeExtras = {}, offExtras = {10,3}, repair = false},
{label = "Side Lights", key = 2, color = "green", extra = 6, linkedExtras = {8,9}, oppositeExtras = {}, offExtras = {10}, repair = false},
{label = "Rear Lights", key = 3, color = "green", extra = 7, linkedExtras = {}, oppositeExtras = {}, offExtras = {10}, repair = false},
{label = "TKD", key = 4, color = "green", extra = 3, linkedExtras = {}, oppositeExtras = {}, offExtras = {4,10}, repair = true},
{label = "Cruise Flicker", key = 5, color = "green", extra = 10, linkedExtras = {}, oppositeExtras = {}, offExtras = {3,4,5,6,7,8,9}, repair = false}
},
stages = {
useStages = false,
stageKeys = {},
},
defaultStages = {
useDefaults = false,
enableKeys = {},
disableKeys = {}
}
}
-134
View File
@@ -1,134 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<CVehicleModelInfo__InitDataList>
<residentTxd>vehshare</residentTxd>
<residentAnims />
<InitDatas>
<Item>
<modelName>maxchasrt</modelName>
<txdName>maxchasrt</txdName>
<handlingId>maxchasrt</handlingId>
<gameName>maxchasrt</gameName>
<vehicleMakeName>maxchasrt</vehicleMakeName>
<expressionDictName>null</expressionDictName>
<expressionName>null</expressionName>
<animConvRoofDictName>vc_maxchasrt</animConvRoofDictName>
<animConvRoofName>window</animConvRoofName>
<animConvRoofWindowsAffected />
<ptfxAssetName>null</ptfxAssetName>
<audioNameHash>lg81hcredeye</audioNameHash>
<layout>LAYOUT_STANDARD</layout>
<coverBoundOffsets>BUFFALO2_COVER_OFFSET_INFO</coverBoundOffsets>
<explosionInfo>EXPLOSION_INFO_DEFAULT</explosionInfo>
<scenarioLayout />
<cameraName>DEFAULT_FOLLOW_VEHICLE_CAMERA</cameraName>
<aimCameraName>DEFAULT_THIRD_PERSON_VEHICLE_AIM_CAMERA</aimCameraName>
<bonnetCameraName>VEHICLE_BONNET_CAMERA_STANDARD</bonnetCameraName>
<povCameraName>DEFAULT_POV_CAMERA</povCameraName>
<FirstPersonDriveByIKOffset x="0.000000" y="-0.055000" z="-0.035000" />
<FirstPersonDriveByUnarmedIKOffset x="0.000000" y="0.000000" z="-0.020000" />
<FirstPersonProjectileDriveByIKOffset x="0.000000" y="-0.060000" z="-0.030000" />
<FirstPersonProjectileDriveByPassengerIKOffset x="0.000000" y="-0.060000" z="-0.030000" />
<FirstPersonProjectileDriveByRearLeftIKOffset x="0.000000" y="0.020000" z="-0.020000" />
<FirstPersonProjectileDriveByRearRightIKOffset x="0.000000" y="0.020000" z="-0.020000" />
<FirstPersonDriveByLeftPassengerIKOffset x="0.000000" y="0.000000" z="-0.005000" />
<FirstPersonDriveByRightPassengerIKOffset x="-0.020000" y="-0.055000" z="-0.035000" />
<FirstPersonDriveByRightRearPassengerIKOffset x="0.000000" y="0.000000" z="-0.005000" />
<FirstPersonDriveByLeftPassengerUnarmedIKOffset x="0.000000" y="0.040000" z="0.000000" />
<FirstPersonDriveByRightPassengerUnarmedIKOffset x="0.000000" y="-0.020000" z="0.000000" />
<FirstPersonMobilePhoneOffset x="0.135000" y="0.240000" z="0.570000" />
<FirstPersonPassengerMobilePhoneOffset x="0.136000" y="0.223000" z="0.455000" />
<FirstPersonMobilePhoneSeatIKOffset>
<Item>
<Offset x="0.136000" y="0.156000" z="0.455000" />
<SeatIndex value="2" />
</Item>
<Item>
<Offset x="0.136000" y="0.156000" z="0.455000" />
<SeatIndex value="3" />
</Item>
</FirstPersonMobilePhoneSeatIKOffset>
<PovCameraOffset x="0.000000" y="-0.145000" z="0.680000" />
<PovCameraVerticalAdjustmentForRollCage value="0.000000" />
<PovPassengerCameraOffset x="0.000000" y="0.015000" z="0.000000" />
<PovRearPassengerCameraOffset x="0.000000" y="0.015000" z="0.000000" />
<vfxInfoName>VFXVEHICLEINFO_CAR_GENERIC</vfxInfoName>
<shouldUseCinematicViewMode value="true" />
<shouldCameraTransitionOnClimbUpDown value="false" />
<shouldCameraIgnoreExiting value="false" />
<AllowPretendOccupants value="true" />
<AllowJoyriding value="true" />
<AllowSundayDriving value="true" />
<AllowBodyColorMapping value="true" />
<wheelScale value="0.298000" />
<wheelScaleRear value="0.298000" />
<dirtLevelMin value="0.000000" />
<dirtLevelMax value="0.550000" />
<envEffScaleMin value="0.000000" />
<envEffScaleMax value="1.000000" />
<envEffScaleMin2 value="0.000000" />
<envEffScaleMax2 value="1.000000" />
<damageMapScale value="0.900000" />
<damageOffsetScale value="0.700000" />
<diffuseTint value="0x00FFFFFF" />
<steerWheelMult value="1.000000" />
<HDTextureDist value="5.000000" />
<lodDistances content="float_array">
350.000000
350.000000
350.000000
350.000000
350.000000
350.000000
</lodDistances>
<minSeatHeight value="0.818" />
<identicalModelSpawnDistance value="20" />
<maxNumOfSameColor value="10" />
<defaultBodyHealth value="1000.000000" />
<pretendOccupantsScale value="1.000000" />
<visibleSpawnDistScale value="1.000000" />
<trackerPathWidth value="2.000000" />
<weaponForceMult value="1.000000" />
<frequency value="100" />
<swankness>SWANKNESS_3</swankness>
<maxNum value="999" />
<flags>FLAG_USE_INTERIOR_RED_LIGHT FLAG_LAW_ENFORCEMENT FLAG_EMERGENCY_SERVICE FLAG_NO_RESPRAY FLAG_DONT_SPAWN_IN_CARGEN FLAG_REPORT_CRIME_IF_STANDING_ON FLAG_HAS_LIVERY FLAG_EXTRAS_STRONG</flags>
<type>VEHICLE_TYPE_CAR</type>
<plateType>VPT_BACK_PLATES</plateType>
<dashboardType>VDT_RACE</dashboardType>
<vehicleClass>VC_EMERGENCY</vehicleClass>
<wheelType>VWT_SPORT</wheelType>
<trailers />
<additionalTrailers />
<drivers />
<extraIncludes />
<doorsWithCollisionWhenClosed />
<driveableDoors />
<bumpersNeedToCollideWithMap value="false" />
<needsRopeTexture value="false" />
<requiredExtras />
<rewards />
<cinematicPartCamera>
<Item>WHEEL_FRONT_RIGHT_CAMERA</Item>
<Item>WHEEL_FRONT_LEFT_CAMERA</Item>
<Item>WHEEL_REAR_RIGHT_CAMERA</Item>
<Item>WHEEL_REAR_LEFT_CAMERA</Item>
</cinematicPartCamera>
<NmBraceOverrideSet />
<buoyancySphereOffset x="0.000000" y="0.000000" z="0.000000" />
<buoyancySphereSizeScale value="1.000000" />
<pOverrideRagdollThreshold type="NULL" />
<firstPersonDrivebyData>
<Item>STD_BUFFALO2_FRONT_LEFT</Item>
<Item>STD_BUFFALO2_FRONT_RIGHT</Item>
<Item>STD_BUFFALO_REAR_LEFT</Item>
<Item>STD_BUFFALO_REAR_RIGHT</Item>
</firstPersonDrivebyData>
</Item>
</InitDatas>
<txdRelationships>
<Item>
<parent>vehicles_race_generic</parent>
<child>maxchasrt</child>
</Item>
</txdRelationships>
</CVehicleModelInfo__InitDataList>
+669 -10
View File
@@ -24,9 +24,19 @@ Config = {
-- The role or group that has permission to work with a K9 dog.
K9HandlerPermissionRoles = {
"Manager",
"Administrator",
"First Responders",
"EG | Helper",
"EG | Staff",
"EG | Sr. Staff",
"EG | Moderator",
"EG | Sr. Moderator",
"EG | Admin",
"EG | Sr. Admin",
"EG | Head of Staff",
"EG | Server Developerr",
"EG | Owner",
"police",
},
--====================== GENERAL SETTINGS ======================--
@@ -37,7 +47,7 @@ Config = {
AllowRevivingInjuredK9 = true, -- Allows the dog handler to revive their own injured K9 dog.
AllowK9InFrontSeat = false, -- Allows the K9 dog to be in the front passenger seat of a vehicle.
AllowCarryK9 = true, -- Allows the dog handler to carry the dog.
AllowK9ToKillNPCs = false, -- Allows the K9 dog to kill NPCs, setting it false will replicate the attack, but not damage the NPC. They will still be able to kill players.
AllowK9ToKillNPCs = true, -- Allows the K9 dog to kill NPCs, setting it false will replicate the attack, but not damage the NPC. They will still be able to kill players.
AllowK9ToAttackPlayers = true, -- Allows the K9 dog to attack players, if set to false the dog will decline attacks on players.
--====================== K9 DOG HANDLER VEHICLES ======================--
@@ -74,7 +84,7 @@ Config = {
-- Custom vehicle example
{
hash = ` `, spawnOffset = vector3(0.0, -4.0, 0.5),
hash = `SHOP89471`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
@@ -101,7 +111,7 @@ Config = {
},
},
{
hash = ` `, spawnOffset = vector3(0.0, -4.0, 0.5),
hash = `SHOP83039`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
@@ -128,7 +138,7 @@ Config = {
},
},
{
hash = ` `, spawnOffset = vector3(0.0, -4.0, 0.5),
hash = `SHOP81622`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
@@ -155,7 +165,7 @@ Config = {
},
},
{
hash = ` `, spawnOffset = vector3(0.0, -4.0, 0.5),
hash = `SHOP80693`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
@@ -182,7 +192,7 @@ Config = {
},
},
{
hash = ` `, spawnOffset = vector3(0.0, -4.0, 0.5),
hash = `chp15tahoek9`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
@@ -209,7 +219,7 @@ Config = {
},
},
{
hash = ` `, spawnOffset = vector3(0.0, -4.0, 0.5),
hash = `chp19tahoek9`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
@@ -236,7 +246,7 @@ Config = {
},
},
{
hash = ` `, spawnOffset = vector3(0.0, -4.0, 0.5),
hash = `chp20tahoek9`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
@@ -292,6 +302,87 @@ Config = {
-- },
},
{
hash = `chp23tahoek9`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = `spec25silvrb`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = `chptahoek9`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = ` `, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
@@ -318,6 +409,492 @@ Config = {
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = `20legacyfpiu3`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = `lasd15k9`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = `lasd15k9b`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = `lasd20k9`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = `lasd23k9t`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = `lasd23tunm`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = `lasd22tunm`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = `lasdtahoelan`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = `23f150`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = `21f150`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = `fs25f150`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = `21silvst`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = `lasd14tseb`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = `lasd14td`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = `lasd14ta`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = `22f150rb`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = `23f150pr`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = `chpcvpirotatork9`, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = ` `, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
@@ -480,6 +1057,88 @@ Config = {
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = ` `, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = ` `, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
{
hash = ` `, spawnOffset = vector3(0.0, -4.0, 0.5),
dogModelName = "a_c_shepherd",
props = {
-- Example: {prop type (Helmet), prop type index (Motorcycle helmet), prop colour index (Black colour)}
-- { drawable, texture, palette }
{ 0, 1, 1 }, -- Hats / Helments
{ 1, 1, 1 }, -- Glassess
{ 2, 1, 1 }, -- Misc
{ 3, 1, 1 },
},
components = {
-- Example: {component type (Mask), component type index (Clown Mask), component colour index (White colour)}
-- { drawable, texture, palette }
{ 1, 1, 1 }, -- Mask
{ 2, 1, 1 }, -- Hair
{ 3, 1, 1 }, -- Upper body
{ 4, 1, 1 }, -- Legs / Pants
{ 5, 1, 1 }, -- Bags / Parachutes
{ 6, 1, 1 }, -- Shoes
{ 7, 1, 1 }, -- Neck / Scarfs
{ 8, 1, 3 }, -- Shirt / Accessory (This palette is commonly used for the text on the K9 vest)
{ 9, 1, 1 }, -- Body Armor
{ 10, 1, 1 }, -- Badges / Logos
{ 11, 1, 1 }, -- Jackets
},
},
-- -- ANOTHER vehicle example
-- {
-- hash = `l200rescue`, spawnOffset = vector3(0.0, -4.0, 0.5),
+4 -4
View File
@@ -92,20 +92,20 @@ Config = {
-- Final connection string sent to clients. Include protocol and/or port
-- if using a proxy (e.g., "https://proxy.example.com"). When empty, the
-- server's auto-detected IP address and serverPort are used instead.
serverAddress = " ",
serverAddress = " ",
-- Port for the radio voice server and dispatch panel. Choose a port not
-- used by other resources on your server.
serverPort = 7777,
serverPort = 012019,
-- Secure token for radio authentication. Change this to a long, random
-- string — it protects the voice server and dispatch panel API.
authToken = "changeme",
authToken = " ",
-- NAC ID / password for the dispatch channel. In-game players whose NAC
-- ID matches this value can access the trunked control frequency and
-- trigger SGN alerts from their radio.
dispatchNacId = "EGRP-LAW2026",
dispatchNacId = " ",
-- Enable Discord-based authentication for the dispatch panel. Requires
-- a Discord application configured in server/.env (see server/.env.example).
+13 -6
View File
@@ -65,6 +65,18 @@ ensure scully_radio2
ensure pe-core
ensure npwd
setr imperial_community_id "1773531748916x173639514765624670"
set imperialAPI "945UI8YJRMTI3E3U3FNN867EZK1ROI"
ensure ImperialCAD-main
local communityId = GetConvar("1773531748916x173639514765624670", "")
local apiKey = GetConvar("945UI8YJRMTI3E3U3FNN867EZK1ROI", "") -- server-side only
print("ImperialCAD Community ID:", 1773531748916x173639514765624670)
print("ImperialCAD API Key:", 945UI8YJRMTI3E3U3FNN867EZK1ROI ~= "")
#[-----Server Scripts-----]
ensure vMenu
ensure Delete-Vehicle
@@ -96,7 +108,7 @@ ensure SmartHoseLite
ensure SmartFiresLite
ensure SmartFiresLite
ensure ebu_flatbeds_ers
ensure
ensure night_ers_k9
ensure PlayCustomSounds
ensure bodycam
ensure 22f550util
@@ -106,11 +118,6 @@ ensure kq_animsuggest
ensure maxchasrt
ensure thinline_leprops
ensure
///ensure SpeedLimit
ensure fingerpoint
ensure Hands-Up