Config, Blips, Lang, Noti, Vehicles, TheoricalInstructor, PracticeInstructor, TheoricalUserPosition, Receptionist = {}, {}, {}, {}, {}, {}, {}, {}, {} -- Trigger to open menu: -- TriggerClientEvent("bit-driverschool:openMenu") -- Trigger to delete license: -- TriggerServerEvent("bit-driverschool:deleteLicense", playerID, license) -- $$$$$$\ $$$$$$\ $$\ $$\ $$$$$$$$\ $$$$$$\ $$$$$$\ $$\ $$\ $$$$$$$\ $$$$$$\ $$$$$$$$\ $$$$$$\ $$$$$$\ $$\ $$\ -- $$ __$$\ $$ __$$\ $$$\ $$ |$$ _____|\_$$ _|$$ __$$\ $$ | $$ |$$ __$$\ $$ __$$\\__$$ __|\_$$ _|$$ __$$\ $$$\ $$ | -- $$ / \__|$$ / $$ |$$$$\ $$ |$$ | $$ | $$ / \__|$$ | $$ |$$ | $$ |$$ / $$ | $$ | $$ | $$ / $$ |$$$$\ $$ | -- $$ | $$ | $$ |$$ $$\$$ |$$$$$\ $$ | $$ |$$$$\ $$ | $$ |$$$$$$$ |$$$$$$$$ | $$ | $$ | $$ | $$ |$$ $$\$$ | -- $$ | $$ | $$ |$$ \$$$$ |$$ __| $$ | $$ |\_$$ |$$ | $$ |$$ __$$< $$ __$$ | $$ | $$ | $$ | $$ |$$ \$$$$ | -- $$ | $$\ $$ | $$ |$$ |\$$$ |$$ | $$ | $$ | $$ |$$ | $$ |$$ | $$ |$$ | $$ | $$ | $$ | $$ | $$ |$$ |\$$$ | -- \$$$$$$ | $$$$$$ |$$ | \$$ |$$ | $$$$$$\ \$$$$$$ |\$$$$$$ |$$ | $$ |$$ | $$ | $$ | $$$$$$\ $$$$$$ |$$ | \$$ | -- \______/ \______/ \__| \__|\__| \______| \______/ \______/ \__| \__|\__| \__| \__| \______| \______/ \__| \__| -- Use "esx", "qb" or "qbox" Config.Framework = "qb" -- oxmysql, mysql-async or ghmattisql Config.Mysql = "oxmysql" -- A license price Config.licenseAprice = 100 -- B license price Config.licenseBprice = 200 -- C license price Config.licenseCprice = 300 -- Set true if you want use KMH or false if you want to use MPH Config.useKMH = true -- Number of questions for the theoretical test Config.theoricalTotalQuestions = 9 -- Answers needed to pass the theory test Config.correctAnswersNeeded = 5 -- Motorcycle license name in the database Config.licenseNameMoto = "moto" -- Car license name in the database Config.licenseNameCar = "driver" -- Truck license name in the database Config.licenseNameTruck = "truck" -- Instructor audio language. EN -> English / FR -> French / DE -> German / ES -> Spanish / HUN -> Hungarian Config.TTSLanguage = "EN" -- Maximum number of errors that can be made in the practical test Config.MaxErrorsPractice = 5 -- Maximum highway speed Config.highwaySpeed = 130 -- Maximum speed in the city Config.urbanSpeed = 50 -- Maximum speed in interurban areas Config.interUrbanSpeed = 90 -- Font used in alerts. Set to 0 if your language is Chinese Config.alertTextFont = 4 -- Set to true if you want to use ESX.DeleteVehicle or QBCore.Functions.DeleteVehicle. If set to false, the native function will be used. Config.UseEsxQBDeleteVehicle = false -- Check license in the database Config.checkDBLicense = true -- Teleport the user to the driving school if he fails the practical test Config.teleportIfFails = true -- Coordinates to teleport the user if fails the practical test Config.teleportIfFailsCoord = vector3(222.42, -1393.44, 30.59) -- Check if there is a vehicle at spawn point Config.checkspawnpoint = false -- Account to which you want the money to be charged Config.accountToRemoveMoney = "bank" -- Set to true if you want users to have to repeat the theory for each license Config.repeatTheorical = false -- $$\ $$\ $$$$$$$$\ $$\ $$\ $$$$$$\ -- $$ | $$ |$$ _____|\$$\ $$ |$$ __$$\ -- $$ |$$ / $$ | \$$\ $$ / $$ / \__| -- $$$$$ / $$$$$\ \$$$$ / \$$$$$$\ -- $$ $$< $$ __| \$$ / \____$$\ -- $$ |\$$\ $$ | $$ | $$\ $$ | -- $$ | \$$\ $$$$$$$$\ $$ | \$$$$$$ | -- \__| \__|\________| \__| \______/ Config.useKeys = true function addKeys(playerID, vehicle) -- Handle both calling conventions: addKeys(vehicle) or addKeys(playerID, vehicle) if vehicle == nil then vehicle = playerID end if vehicle and DoesEntityExist(vehicle) then local plate = GetVehicleNumberPlateText(vehicle) local model = GetDisplayNameFromVehicleModel(GetEntityModel(vehicle)) exports['qs-vehiclekeys']:GiveKeys(plate, model, true) SetVehicleEngineOn(vehicle, true, true, false) end end function removeKeys(vehicle, plate) if vehicle ~= 0 and plate ~= nil then local model = GetDisplayNameFromVehicleModel(GetEntityModel(vehicle)) exports['qs-vehiclekeys']:RemoveKeys(plate, model) end end -- $$\ $$\ $$$$$$$$\ $$\ $$\ $$$$$$\ $$$$$$\ $$\ $$$$$$$$\ $$$$$$\ -- $$ | $$ |$$ _____|$$ | $$ |\_$$ _|$$ __$$\ $$ | $$ _____|$$ __$$\ -- $$ | $$ |$$ | $$ | $$ | $$ | $$ / \__|$$ | $$ | $$ / \__| -- \$$\ $$ |$$$$$\ $$$$$$$$ | $$ | $$ | $$ | $$$$$\ \$$$$$$\ -- \$$\$$ / $$ __| $$ __$$ | $$ | $$ | $$ | $$ __| \____$$\ -- \$$$ / $$ | $$ | $$ | $$ | $$ | $$\ $$ | $$ | $$\ $$ | -- \$ / $$$$$$$$\ $$ | $$ |$$$$$$\ \$$$$$$ |$$$$$$$$\ $$$$$$$$\ \$$$$$$ | -- \_/ \________|\__| \__|\______| \______/ \________|\________| \______/ Vehicles.moto = "double" Vehicles.car = "blista" Vehicles.truck = "phantom" Vehicles.spawn = { x = 224.92, y = -1379.05, z = 30.54, heading = 204.09 } -- $$$$$$$$\ $$\ $$\ $$$$$$$$\ $$\ -- $$ _____|$$ | $$ |$$ _____|$$ | -- $$ | $$ | $$ |$$ | $$ | -- $$$$$\ $$ | $$ |$$$$$\ $$ | -- $$ __| $$ | $$ |$$ __| $$ | -- $$ | $$ | $$ |$$ | $$ | -- $$ | \$$$$$$ |$$$$$$$$\ $$$$$$$$\ -- \__| \______/ \________|\________| -- set to true if you want to use a custom fuel script Config.useCustomFuel = false function setFuel(vehicle) end -- $$\ $$\ $$$$$$$\ $$$$$$\ $$\ -- $$$\ $$ |$$ __$$\ $$ __$$\ $ | -- $$$$\ $$ |$$ | $$ |$$ / \__|\_/$$$$$$$\ -- $$ $$\$$ |$$$$$$$ |$$ | $$ _____| -- $$ \$$$$ |$$ ____/ $$ | \$$$$$$\ -- $$ |\$$$ |$$ | $$ | $$\ \____$$\ -- $$ | \$$ |$$ | \$$$$$$ | $$$$$$$ | -- \__| \__|\__| \______/ \_______/ Receptionist = { npc = "cs_jewelass", location = vector4(214.45, -1400.163, 29.57, 317.48), } PracticeInstructor = { use = true, npc = "csb_trafficwarden", location = vector4(219.95, -1398.27, 30.20, 334.48), useTeleport = false } TheoricalInstructor = { npc = "csb_reporter", location = vector4(208.69, -1382.96, 29.57, 130.39), } TheoricalUserPosition = { location = vector4(207.40, -1384.23, 29.57, 314.64), } -- $$\ $$\ $$$$$$\ $$$$$$$$\ $$$$$$\ $$$$$$$$\ $$$$$$\ $$$$$$\ $$$$$$\ $$$$$$$$\ $$$$$$\ $$$$$$\ $$\ $$\ $$$$$$\ -- $$$\ $$ |$$ __$$\\__$$ __|\_$$ _|$$ _____|\_$$ _|$$ __$$\ $$ __$$\\__$$ __|\_$$ _|$$ __$$\ $$$\ $$ |$$ __$$\ -- $$$$\ $$ |$$ / $$ | $$ | $$ | $$ | $$ | $$ / \__|$$ / $$ | $$ | $$ | $$ / $$ |$$$$\ $$ |$$ / \__| -- $$ $$\$$ |$$ | $$ | $$ | $$ | $$$$$\ $$ | $$ | $$$$$$$$ | $$ | $$ | $$ | $$ |$$ $$\$$ |\$$$$$$\ -- $$ \$$$$ |$$ | $$ | $$ | $$ | $$ __| $$ | $$ | $$ __$$ | $$ | $$ | $$ | $$ |$$ \$$$$ | \____$$\ -- $$ |\$$$ |$$ | $$ | $$ | $$ | $$ | $$ | $$ | $$\ $$ | $$ | $$ | $$ | $$ | $$ |$$ |\$$$ |$$\ $$ | -- $$ | \$$ | $$$$$$ | $$ | $$$$$$\ $$ | $$$$$$\ \$$$$$$ |$$ | $$ | $$ | $$$$$$\ $$$$$$ |$$ | \$$ |\$$$$$$ | -- \__| \__| \______/ \__| \______|\__| \______| \______/ \__| \__| \__| \______| \______/ \__| \__| \______/ function notifications(notitype, message, time) if notitype == "primary" then notitype = "info" end exports['17mov_Hud']:ShowNotification(message, notitype, 'Scoala Auto', time) end -- Notifications types: Noti.info = "info" Noti.check = "check" Noti.error = "error" -- Notification time: Noti.time = 5000 -- $$$$$$$\ $$\ $$$$$$\ $$$$$$$\ $$$$$$\ -- $$ __$$\ $$ | \_$$ _|$$ __$$\ $$ __$$\ -- $$ | $$ |$$ | $$ | $$ | $$ |$$ / \__| -- $$$$$$$\ |$$ | $$ | $$$$$$$ |\$$$$$$\ -- $$ __$$\ $$ | $$ | $$ ____/ \____$$\ -- $$ | $$ |$$ | $$ | $$ | $$\ $$ | -- $$$$$$$ |$$$$$$$$\ $$$$$$\ $$ | \$$$$$$ | -- \_______/ \________|\______|\__| \______/ Blips = { active = true, coord = vector3(214.45, -1400.163, 30.57), blip = 227, blipColor = 2, blipScale = 0.9, blipText = "Driver School", routeColor = 2 } -- $$\ $$\ $$$$$$\ $$$$$$$\ $$\ $$\ $$$$$$$$\ $$$$$$$\ $$$$$$\ -- $$$\ $$$ |$$ __$$\ $$ __$$\ $$ | $$ |$$ _____|$$ __$$\ $$ __$$\ -- $$$$\ $$$$ |$$ / $$ |$$ | $$ |$$ |$$ / $$ | $$ | $$ |$$ / \__| -- $$\$$\$$ $$ |$$$$$$$$ |$$$$$$$ |$$$$$ / $$$$$\ $$$$$$$ |\$$$$$$\ -- $$ \$$$ $$ |$$ __$$ |$$ __$$< $$ $$< $$ __| $$ __$$< \____$$\ -- $$ |\$ /$$ |$$ | $$ |$$ | $$ |$$ |\$$\ $$ | $$ | $$ |$$\ $$ | -- $$ | \_/ $$ |$$ | $$ |$$ | $$ |$$ | \$$\ $$$$$$$$\ $$ | $$ |\$$$$$$ | -- \__| \__|\__| \__|\__| \__|\__| \__|\________|\__| \__| \______/ Marker = { location = vector3(214.45, -1400.163, 30.57), mtype = 23, color = { r = 245, g = 14, b = 70 }, distance = 3, size = 2.0 } --$$$$$$$$\ $$$$$$\ $$$$$$$\ $$$$$$\ $$$$$$$$\ $$$$$$$$\ --\__$$ __|$$ __$$\ $$ __$$\ $$ __$$\ $$ _____|\__$$ __| -- $$ | $$ / $$ |$$ | $$ |$$ / \__|$$ | $$ | -- $$ | $$$$$$$$ |$$$$$$$ |$$ |$$$$\ $$$$$\ $$ | -- $$ | $$ __$$ |$$ __$$< $$ |\_$$ |$$ __| $$ | -- $$ | $$ | $$ |$$ | $$ |$$ | $$ |$$ | $$ | -- $$ | $$ | $$ |$$ | $$ |\$$$$$$ |$$$$$$$$\ $$ | -- \__| \__| \__|\__| \__| \______/ \________| \__| Config.useTarget = true function entityTarget(entity, event) exports["qb-target"]:AddTargetEntity( entity, { options = { { type = "client", event = event, icon = "fas fa-box-circle-check", label = Lang.open } }, distance = 3.0 } ) end -- $$$$$$$\ $$$$$$\ $$\ $$\ $$$$$$$$\ $$$$$$$$\ -- $$ __$$\ $$ __$$\ $$ | $$ |\__$$ __|$$ _____| -- $$ | $$ |$$ / $$ |$$ | $$ | $$ | $$ | -- $$$$$$$ |$$ | $$ |$$ | $$ | $$ | $$$$$\ -- $$ __$$< $$ | $$ |$$ | $$ | $$ | $$ __| -- $$ | $$ |$$ | $$ |$$ | $$ | $$ | $$ | -- $$ | $$ | $$$$$$ |\$$$$$$ | $$ | $$$$$$$$\ -- \__| \__| \______/ \______/ \__| \________| Routes = { [1] = { speed = Config.urbanSpeed, x = 67.72, y = -1111.93, z = 27.94 }, [2] = { speed = Config.urbanSpeed, x = 645.39, y = -294.65, z = 42.29 }, [3] = { speed = Config.highwaySpeed, x = 2427.21, y = 2889.86, z = 47.83 }, [4] = { speed = Config.interUrbanSpeed, x = 1486.3, y = 2741.52, z = 36.38 }, [5] = { speed = Config.interUrbanSpeed, x = 311.02, y = 2574.02, z = 42.65 }, [6] = { speed = Config.interUrbanSpeed, x = 594.26, y = 2186.18, z = 68.44 }, [7] = { speed = Config.interUrbanSpeed, x = -96.34, y = 1852.26, z = 197.63 }, [8] = { speed = Config.urbanSpeed, x = -43.21, y = -470.87, z = 38.96 }, [9] = { speed = Config.urbanSpeed, x = 248.29, y = -1395.82, z = 29.54 } } -- $$$$$$\ $$\ $$\ $$$$$$$$\ $$$$$$\ $$$$$$$$\ $$$$$$\ $$$$$$\ $$\ $$\ $$$$$$\ -- $$ __$$\ $$ | $$ |$$ _____|$$ __$$\\__$$ __|\_$$ _|$$ __$$\ $$$\ $$ |$$ __$$\ -- $$ / $$ |$$ | $$ |$$ | $$ / \__| $$ | $$ | $$ / $$ |$$$$\ $$ |$$ / \__| -- $$ | $$ |$$ | $$ |$$$$$\ \$$$$$$\ $$ | $$ | $$ | $$ |$$ $$\$$ |\$$$$$$\ -- $$ | $$ |$$ | $$ |$$ __| \____$$\ $$ | $$ | $$ | $$ |$$ \$$$$ | \____$$\ -- $$ $$\$$ |$$ | $$ |$$ | $$\ $$ | $$ | $$ | $$ | $$ |$$ |\$$$ |$$\ $$ | -- \$$$$$$ / \$$$$$$ |$$$$$$$$\ \$$$$$$ | $$ | $$$$$$\ $$$$$$ |$$ | \$$ |\$$$$$$ | -- \___$$$\ \______/ \________| \______/ \__| \______| \______/ \__| \__| \______/ -- \___| Questions = { ["Is it forbidden to perform the reverse maneuver on a highway or freeway?"] = { [1] = "It can only be performed in cases of urgency, such as missing an exit.", [2] = "No, it is allowed as long as it does not affect safety.", [3] = "Yes, always", ["correct"] = 3, ["index"] = 1 }, ["What action should we take when a small tear occurs in a tire?"] = { [1] = "Leave it, as there is no danger of any kind", [2] = "Immediately take it to a repair shop", [3] = "Put the spare tire on and drive as many km as needed", ["correct"] = 2, ["index"] = 2 }, ["Can the doors of a vehicle be left open while driving?"] = { [1] = "Yes, but only if the temperature is very high, especially in summer", [2] = "Yes, it improves the aerodynamics of the vehicle", [3] = "No, it is prohibited", ["correct"] = 3, ["index"] = 3 }, ["When passing near pedestrians on this road, what lateral distance should you leave?"] = { [1] = "no safety distance is required", [2] = "1.5 meters or more", [3] = "just enough not to run over them", ["correct"] = 2, ["index"] = 4 }, ["Should we make an injured person walk after an accident?"] = { [1] = "no, never", [2] = "yes, but only if nothing is broken", [3] = "yes, to give it a little air", ["correct"] = 3, ["index"] = 5 }, ["Is it advisable to stop and rest during travel?"] = { [1] = "yes, it is advisable to stop in order to smoke a little marijuana to wake you up.", [2] = "it is not necessary, that is for the lazy ones.", [3] = "yes, 20 to 30 minutes of rest every 2 hours of driving.", ["correct"] = 3, ["index"] = 6 }, ["can police officers subject a driver to a drug test?"] = { [1] = "yes, always", [2] = "no, because I do not smoke or consume anything", [3] = "yes, but I`ll have to smoke a joint with them", ["correct"] = 1, ["index"] = 7 }, ["Can you overtake cyclists?"] = { [1] = "no, I have to wait behind them until they stop", [2] = "yes, I can overtake them while keeping a safe distance", [3] = "yes, and I can push them off the road", ["correct"] = 2, ["index"] = 8 }, ["if you are riding a motorcycle and find someone in an accident, what should you do?"] = { [1] = "carefully put him/her on the motorcycle and take him/her to the hospital", [2] = "call an ambulance", [3] = "leave him there, it`s not my problem", ["correct"] = 2, ["index"] = 9 } } -- $$\ $$$$$$\ $$\ $$\ $$$$$$\ $$\ $$\ $$$$$$\ $$$$$$\ $$$$$$$$\ -- $$ | $$ __$$\ $$$\ $$ |$$ __$$\ $$ | $$ |$$ __$$\ $$ __$$\ $$ _____| -- $$ | $$ / $$ |$$$$\ $$ |$$ / \__|$$ | $$ |$$ / $$ |$$ / \__|$$ | -- $$ | $$$$$$$$ |$$ $$\$$ |$$ |$$$$\ $$ | $$ |$$$$$$$$ |$$ |$$$$\ $$$$$\ -- $$ | $$ __$$ |$$ \$$$$ |$$ |\_$$ |$$ | $$ |$$ __$$ |$$ |\_$$ |$$ __| -- $$ | $$ | $$ |$$ |\$$$ |$$ | $$ |$$ | $$ |$$ | $$ |$$ | $$ |$$ | -- $$$$$$$$\ $$ | $$ |$$ | \$$ |\$$$$$$ |\$$$$$$ |$$ | $$ |\$$$$$$ |$$$$$$$$\ -- \________|\__| \__|\__| \__| \______/ \______/ \__| \__| \______/ \________| Lang.theoricalneeded = "You must take the theoretical test before taking the practical test" Lang.returnvehicule = "Return to the vehicle. The test will be cancelled in 10 seconds" Lang.testcanceled = "The test has been cancelled. Retest again" Lang.approved = "Congratulations, you have passed!" Lang.suspended = "You have failed, you can try again another time." Lang.passed = "You have already passed this test, you cannot take it again" Lang.enter = "Press ~r~E~w~ to access the ~g~driving school" Lang.deletedLicense = "The license has been successfully removed" Lang.noMoney = "You don't have enough money" Lang.occupiedSpace = "The space to take the vehicle out of the driving school is occupied" Lang.open = "Access the driving school" -- $$$$$$$\ $$$$$$$\ $$$$$$\ $$\ $$\ $$$$$$$$\ $$$$$$$$\ $$\ $$\ $$$$$$$$\ -- $$ __$$\ $$ __$$\ $$ __$$\ $$ | $\ $$ | \__$$ __|$$ _____|$$ | $$ |\__$$ __| -- $$ | $$ |$$ | $$ |$$ / $$ |$$ |$$$\ $$ | $$ | $$ | \$$\ $$ | $$ | -- $$ | $$ |$$$$$$$ |$$$$$$$$ |$$ $$ $$\$$ | $$ | $$$$$\ \$$$$ / $$ | -- $$ | $$ |$$ __$$< $$ __$$ |$$$$ _$$$$ | $$ | $$ __| $$ $$< $$ | -- $$ | $$ |$$ | $$ |$$ | $$ |$$$ / \$$$ | $$ | $$ | $$ /\$$\ $$ | -- $$$$$$$ |$$ | $$ |$$ | $$ |$$ / \$$ | $$ | $$$$$$$$\ $$ / $$ | $$ | -- \_______/ \__| \__|\__| \__|\__/ \__| \__| \________|\__| \__| \__| Config.useCustomDrawTxt = false function customDrawTxt() TriggerEvent("bit-interact:Start", "E", "Press to access the driving school") end -- $$$$$$$$\ $$\ $$\ $$\ $$\ $$$$$$\ $$$$$$$$\ $$$$$$\ $$$$$$\ $$\ $$\ $$$$$$\ -- $$ _____|$$ | $$ |$$$\ $$ |$$ __$$\\__$$ __|\_$$ _|$$ __$$\ $$$\ $$ |$$ __$$\ -- $$ | $$ | $$ |$$$$\ $$ |$$ / \__| $$ | $$ | $$ / $$ |$$$$\ $$ |$$ / \__| -- $$$$$\ $$ | $$ |$$ $$\$$ |$$ | $$ | $$ | $$ | $$ |$$ $$\$$ |\$$$$$$\ -- $$ __| $$ | $$ |$$ \$$$$ |$$ | $$ | $$ | $$ | $$ |$$ \$$$$ | \____$$\ -- $$ | $$ | $$ |$$ |\$$$ |$$ | $$\ $$ | $$ | $$ | $$ |$$ |\$$$ |$$\ $$ | -- $$ | \$$$$$$ |$$ | \$$ |\$$$$$$ | $$ | $$$$$$\ $$$$$$ |$$ | \$$ |\$$$$$$ | -- \__| \______/ \__| \__| \______/ \__| \______| \______/ \__| \__| \______/ -- Function to add licenses to the user function applyLicense(xPlayer, license) if Config.Framework == "esx" then if license == "A" then SqlFunc( Config.Mysql, "execute", "INSERT INTO user_licenses (type, owner) VALUES (@type, @owner)", { ["@type"] = Config.licenseNameMoto, ["@owner"] = xPlayer.identifier } ) elseif license == "B" then SqlFunc( Config.Mysql, "execute", "INSERT INTO user_licenses (type, owner) VALUES (@type, @owner)", { ["@type"] = Config.licenseNameCar, ["@owner"] = xPlayer.identifier } ) elseif license == "C" then SqlFunc( Config.Mysql, "execute", "INSERT INTO user_licenses (type, owner) VALUES (@type, @owner)", { ["@type"] = Config.licenseNameTruck, ["@owner"] = xPlayer.identifier } ) end elseif Config.Framework == "qb" or Config.Framework == "qbox" then if license == "A" then local licenseTable = xPlayer.PlayerData.metadata["licences"] licenseTable[Config.licenseNameMoto] = true xPlayer.Functions.SetMetaData("licences", licenseTable) xPlayer.Functions.AddItem("driver_license", 1) elseif license == "B" then local licenseTable = xPlayer.PlayerData.metadata["licences"] licenseTable[Config.licenseNameCar] = true xPlayer.Functions.SetMetaData("licences", licenseTable) xPlayer.Functions.AddItem("driver_license", 1) elseif license == "C" then local licenseTable = xPlayer.PlayerData.metadata["licences"] licenseTable[Config.licenseNameTruck] = true xPlayer.Functions.SetMetaData("licences", licenseTable) xPlayer.Functions.AddItem("driver_license", 1) end end end -- This function is called after a license is deleted. You can add custom logic here. -- xPlayer: Player object (ESX or QB/QBox) -- license: License type being deleted ("A", "B", or "C") function deleteLicense(xPlayer, license) -- Add your custom logic here. Example: -- Remove custom items, send Discord logs, etc. -- Notification (you can customize or remove this) notifications(Noti.check, Lang.deletedLicense, Noti.time) end -- Make driving school peds passive (invincible + non-combatant) CreateThread(function() Wait(8000) -- wait for peds to spawn local pedLocations = { Receptionist.location, PracticeInstructor.location, TheoricalInstructor.location, } local allPeds = GetGamePool('CPed') for _, ped in ipairs(allPeds) do if DoesEntityExist(ped) and not IsPedAPlayer(ped) then local pedCoord = GetEntityCoords(ped) for _, loc in ipairs(pedLocations) do local coord = vector3(loc.x, loc.y, loc.z) if #(pedCoord - coord) < 3.0 then SetEntityInvincible(ped, true) SetBlockingOfNonTemporaryEvents(ped, true) SetPedFleeAttributes(ped, 0, false) SetPedCombatAttributes(ped, 46, true) SetPedConfigFlag(ped, 2, true) SetPedCanRagdoll(ped, false) break end end end end end)