2026-04-14 21:05:01 +02:00

261 lines
7.6 KiB
Lua
Raw Permalink Blame History

-- DMV School
-- Tech Development - https://discord.gg/tHAbhd94vS
local ESX = exports.es_extended:getSharedObject()
postNUI = function(data)
SendNUIMessage(data)
end
OpenDMV = function()
ESX.TriggerServerCallback('ricky-dmv:getData', function(licenses, money, bank)
postNUI({
type = "SET_CONFIG",
config = Config
})
postNUI({
type = "SET_MONEY",
contanti = bank,
banca = bank
})
postNUI({
type = "OPEN",
licenses = licenses,
license = Config.License
})
SetNuiFocus(true, true)
exports['hex_4_hud']:HideHud(true)
TriggerScreenblurFadeIn(500)
end)
end
RegisterNUICallback('close', function()
SetNuiFocus(false, false)
exports['hex_4_hud']:HideHud(false)
TriggerScreenblurFadeOut(500)
end)
RegisterNUICallback('removeMoney', function(data)
local account = data.account
local amount = tonumber(data.amount)
TriggerServerEvent('ricky-dmv:removeMoney', account, amount)
end)
RegisterNetEvent('ricky-dmv:updateLicense')
AddEventHandler('ricky-dmv:updateLicense', function()
ESX.TriggerServerCallback('ricky-dmv:getData', function(licenses)
postNUI({
type = "UPDATE_LICENSE",
licenses = licenses,
})
end)
end)
RegisterNUICallback('theoryOk', function(data)
local license = data.license
onCompleteTheory(license)
end)
RegisterNUICallback('practiceOk', function(data)
local license = data.license
onCompletePractice(license)
end)
local step = 0
local maxSpeed = nil
local sleep = 1000
local error = 0
local currentRouteIndex = nil
local currentBlip = nil
local practiceActive = false
local function removeCurrentBlip()
if currentBlip and DoesBlipExist(currentBlip) then
RemoveBlip(currentBlip)
currentBlip = nil
end
end
local function createMissionBlip(coords)
if not coords then return end
removeCurrentBlip()
local blip = AddBlipForCoord(coords.x, coords.y, coords.z)
SetBlipSprite(blip, 1)
SetBlipColour(blip, 5)
SetBlipScale(blip, 1.2)
SetBlipRoute(blip, true)
SetBlipRouteColour(blip, 5)
BeginTextCommandSetBlipName("STRING")
AddTextComponentString("Pr<EFBFBD>fungspunkt")
EndTextCommandSetBlipName(blip)
currentBlip = blip
end
local function spawnAtDMV()
local dmvCoords = Config.DMVSchool[1]
RequestCollisionAtCoord(dmvCoords.x, dmvCoords.y, dmvCoords.z)
SetEntityCoords(PlayerPedId(), dmvCoords.x, dmvCoords.y, dmvCoords.z, false, false, false, true)
end
local function endPractice(aborted)
if not practiceActive then return end
practiceActive = false
removeCurrentBlip()
ClearGpsPlayerWaypoint()
currentRouteIndex = nil
local veh = GetVehiclePedIsIn(PlayerPedId(), false)
if veh and veh ~= 0 then
ESX.Game.DeleteVehicle(veh)
end
-- Spieler zur Fahrschule teleportieren
spawnAtDMV()
local errori = error
step = 0
sleep = 1000
error = 0
if aborted then
-- Pr<50>fung abgebrochen wegen zu vieler Fehler
ESX.ShowNotification(Config.Lang[Config.Language]["practice_error"])
postNUI({ type = "DISPLAY_RISULTATO", errori = errori, failed = true })
else
postNUI({ type = "DISPLAY_RISULTATO", errori = errori })
end
SetNuiFocus(true, true)
TriggerScreenblurFadeIn(500)
end
SetUpMarker = function()
if not practiceActive then return end
step = step + 1
if currentRouteIndex == nil then
currentRouteIndex = math.random(1, #Config.PracticeCoords)
end
local coords = Config.PracticeCoords[currentRouteIndex]
coords = coords[step]
if coords == nil then
endPractice(false)
return
end
maxSpeed = coords.speedLimit or nil
-- NEU: Benachrichtigung <20>ber das Tempolimit beim Erreichen eines neuen Abschnitts
if maxSpeed ~= nil then
exports['hex_4_hud']:Notify('Tempolimit', 'In diesem Bereich gilt: ' .. maxSpeed .. ' km/h', 'info', 5000)
end
coords = coords.coordinate
if not coords then
endPractice(false)
return
end
createMissionBlip(coords)
sleep = 0
Citizen.CreateThread(function()
while practiceActive do
Citizen.Wait(sleep)
local playerPed = PlayerPedId()
local vehicle = GetVehiclePedIsIn(playerPed, false)
local myCoords = GetEntityCoords(playerPed)
local distance = GetDistanceBetweenCoords(coords.x, coords.y, coords.z, myCoords, true)
-- Gelber Bodenmarker am Zielpunkt
DrawMarker(27, coords.x, coords.y, coords.z, 0, 0, 0, 0, 0, 0, 3.0, 3.0, 1.0, 255, 200, 0, 180, false, true, 2, false, false, false, false)
if vehicle and vehicle ~= 0 then
local speed = GetEntitySpeed(vehicle) * Config.SpeedMultiplier
-- Geschwindigkeitsfehler pr<70>fen
if maxSpeed ~= nil and speed > maxSpeed then
sleep = 1000
error = error + 1
exports['hex_4_hud']:Notify('Fehler', 'Fehler ' .. error .. '/' .. Config.MaxErrors .. ': ' .. Config.Lang[Config.Language]["speed_error"], 'error', 5000)
-- Pr<50>fung abbrechen bei zu vielen Fehlern
if error >= Config.MaxErrors then
exports['hex_4_hud']:Notify('Pr<EFBFBD>fung', 'Pr<EFBFBD>fung abgebrochen! Zu viele Fehler.', 'error', 5000)
endPractice(true)
break
end
else
sleep = 0
end
-- Auf 50 km/h begrenzen direkt am Checkpoint
if distance < 8.0 then
SetVehicleMaxSpeed(vehicle, 50.0 / 3.6)
else
SetVehicleMaxSpeed(vehicle, 0.0)
end
end
-- Checkpoint erreicht
if distance < 2.5 then
if vehicle and vehicle ~= 0 then
SetVehicleMaxSpeed(vehicle, 0.0)
end
SetUpMarker()
break
end
end
end)
end
RegisterNUICallback('startPractice', function(data)
local license = data.license
practiceActive = true
error = 0
step = 0
currentRouteIndex = nil
for k,v in pairs(Config.License) do
if v.id == license then
local vehicle = v.vehicle
ESX.Game.SpawnVehicle(vehicle.model, vehicle.coords, vehicle.heading, function(veh)
SetVehicleNumberPlateText(veh, vehicle.plate)
SetPedIntoVehicle(PlayerPedId(), veh, -1)
Citizen.CreateThread(function()
Wait(500)
-- VEHICLES KEYS INTEGRATION
TriggerServerEvent("vehicles_keys:selfGiveCurrentVehicleKeys")
end)
end)
end
end
SetUpMarker()
end)
local sleep2 = 1000
Citizen.CreateThread(function()
while true do
Citizen.Wait(sleep2)
for k,v in pairs(Config.DMVSchool) do
DrawMarker(Config.MarkerSettings.type, v.x, v.y, v.z, 0, 0, 0, 0, 0, 0, Config.MarkerSettings.size, Config.MarkerSettings.color, 100, Config.MarkerSettings.bump, true, 2, Config.MarkerSettings.rotate, false, false, false)
local distance = GetDistanceBetweenCoords(v.x, v.y, v.z, GetEntityCoords(PlayerPedId()), true)
if distance < 5.5 then
sleep2 = 0
ESX.ShowHelpNotification(Config.Lang[Config.Language]["open_dmv"])
if IsControlJustReleased(0, 38) then
OpenDMV()
end
else
sleep2 = 1000
end
end
end
end)