From 92d76ed67c55fbef446333831773d5a8af8d8e1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20N=27gadi?= Date: Tue, 19 Sep 2017 10:29:42 +0200 Subject: [PATCH 01/36] chore(repo): Initial commit --- README.md | 22 +++ __resource.lua | 27 +++ client/main.lua | 454 +++++++++++++++++++++++++++++++++++++++++++ config.lua | 187 ++++++++++++++++++ esx_dmvschool.sql | 7 + html/badge.png | Bin 0 -> 96716 bytes html/cursor.png | Bin 0 -> 1255 bytes html/debounce.min.js | 9 + html/dmv.png | Bin 0 -> 745 bytes html/questions.js | 71 +++++++ html/scripts.js | 144 ++++++++++++++ html/styles.css | 191 ++++++++++++++++++ html/ui.html | 102 ++++++++++ server/main.lua | 34 ++++ 14 files changed, 1248 insertions(+) create mode 100644 README.md create mode 100644 __resource.lua create mode 100644 client/main.lua create mode 100644 config.lua create mode 100644 esx_dmvschool.sql create mode 100644 html/badge.png create mode 100644 html/cursor.png create mode 100644 html/debounce.min.js create mode 100644 html/dmv.png create mode 100644 html/questions.js create mode 100644 html/scripts.js create mode 100644 html/styles.css create mode 100644 html/ui.html create mode 100644 server/main.lua diff --git a/README.md b/README.md new file mode 100644 index 00000000..8000ed26 --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +# esx_dmvschool +FXServer ESX DMV SChool + +[INSTALLATION] + +1) Using [fvm](https://github.com/qlaffont/fvm-installer) +``` +fvm install --save --folder=esx esx-org/esx_dmvschool +``` + +2) Manually + +- Download https://github.com/ESX-Org/esx_dmvschool/releases/latest +- Put it in [esx] directory + + +1) Import esx_dmvschool.sql in your database +2) Add this in your server.cfg : + +``` +start esx_dmvschool +``` diff --git a/__resource.lua b/__resource.lua new file mode 100644 index 00000000..23906bda --- /dev/null +++ b/__resource.lua @@ -0,0 +1,27 @@ +resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' + +description 'ESX DMV School' + +version '1.0.0' + +server_scripts { + 'server/main.lua' +} + +client_scripts { + 'config.lua', + 'client/main.lua' +} + +ui_page 'html/ui.html' + +files { + 'html/ui.html', + 'html/logo.png', + 'html/dmv.png', + 'html/cursor.png', + 'html/styles.css', + 'html/questions.js', + 'html/scripts.js', + 'html/debounce.min.js' +} \ No newline at end of file diff --git a/client/main.lua b/client/main.lua new file mode 100644 index 00000000..96b9eee0 --- /dev/null +++ b/client/main.lua @@ -0,0 +1,454 @@ +local Keys = { + ["ESC"] = 322, ["F1"] = 288, ["F2"] = 289, ["F3"] = 170, ["F5"] = 166, ["F6"] = 167, ["F7"] = 168, ["F8"] = 169, ["F9"] = 56, ["F10"] = 57, + ["~"] = 243, ["1"] = 157, ["2"] = 158, ["3"] = 160, ["4"] = 164, ["5"] = 165, ["6"] = 159, ["7"] = 161, ["8"] = 162, ["9"] = 163, ["-"] = 84, ["="] = 83, ["BACKSPACE"] = 177, + ["TAB"] = 37, ["Q"] = 44, ["W"] = 32, ["E"] = 38, ["R"] = 45, ["T"] = 245, ["Y"] = 246, ["U"] = 303, ["P"] = 199, ["["] = 39, ["]"] = 40, ["ENTER"] = 18, + ["CAPS"] = 137, ["A"] = 34, ["S"] = 8, ["D"] = 9, ["F"] = 23, ["G"] = 47, ["H"] = 74, ["K"] = 311, ["L"] = 182, + ["LEFTSHIFT"] = 21, ["Z"] = 20, ["X"] = 73, ["C"] = 26, ["V"] = 0, ["B"] = 29, ["N"] = 249, ["M"] = 244, [","] = 82, ["."] = 81, + ["LEFTCTRL"] = 36, ["LEFTALT"] = 19, ["SPACE"] = 22, ["RIGHTCTRL"] = 70, + ["HOME"] = 213, ["PAGEUP"] = 10, ["PAGEDOWN"] = 11, ["DELETE"] = 178, + ["LEFT"] = 174, ["RIGHT"] = 175, ["TOP"] = 27, ["DOWN"] = 173, + ["NENTER"] = 201, ["N4"] = 108, ["N5"] = 60, ["N6"] = 107, ["N+"] = 96, ["N-"] = 97, ["N7"] = 117, ["N8"] = 61, ["N9"] = 118 +} + +ESX = nil +local CurrentAction = nil +local CurrentActionMsg = nil +local CurrentActionData = nil +local Licenses = {} +local CurrentTest = nil +local CurrentTestType = nil +local CurrentVehicle = nil +local CurrentCheckPoint = 0 +local LastCheckPoint = -1 +local CurrentBlip = nil +local CurrentZoneType = nil +local DriveErrors = 0 +local IsAboveSpeedLimit = false +local LastVehicleHealth = nil + +Citizen.CreateThread(function() + while ESX == nil do + TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) + Citizen.Wait(0) + end +end) + +function DrawMissionText(msg, time) + ClearPrints() + SetTextEntry_2('STRING') + AddTextComponentString(msg) + DrawSubtitleTimed(time, 1) +end + +function StartTheoryTest() + + CurrentTest = 'theory' + + SendNUIMessage({ + openQuestion = true + }) + + ESX.SetTimeout(200, function() + SetNuiFocus(true, true) + end) + + TriggerServerEvent('esx_dmvschool:pay', Config.Prices['dmv']) + +end + +function StopTheoryTest(success) + + CurrentTest = nil + + SendNUIMessage({ + openQuestion = false + }) + + SetNuiFocus(false) + + if success then + TriggerServerEvent('esx_dmvschool:addLicense', 'dmv') + ESX.ShowNotification('Vous avez ~g~réussi~s~ le test') + else + ESX.ShowNotification('Vous avez ~r~raté~s~ le test') + end + +end + +function StartDriveTest(type) + + + ESX.Game.SpawnVehicle(Config.VehicleModels[type], Config.Zones.VehicleSpawnPoint.Pos, 317.0, function(vehicle) + + CurrentTest = 'drive' + CurrentTestType = type + CurrentCheckPoint = 0 + LastCheckPoint = -1 + CurrentZoneType = 'residence' + DriveErrors = 0 + IsAboveSpeedLimit = false + CurrentVehicle = vehicle + LastVehicleHealth = GetEntityHealth(vehicle) + local playerPed = GetPlayerPed(-1) + + TaskWarpPedIntoVehicle(playerPed, vehicle, -1) + end) + + TriggerServerEvent('esx_dmvschool:pay', Config.Prices[type]) + +end + +function StopDriveTest(success) + + if success then + TriggerServerEvent('esx_dmvschool:addLicense', CurrentTestType) + ESX.ShowNotification('Vous avez ~g~réussi~s~ le test') + else + ESX.ShowNotification('Vous avez ~r~raté~s~ le test') + end + + CurrentTest = nil + CurrentTestType = nil + +end + +function SetCurrentZoneType(type) + CurrentZoneType = type +end + +function OpenDMVSchoolMenu() + + local ownedLicenses = {} + + for i=1, #Licenses, 1 do + ownedLicenses[Licenses[i].type] = true + end + + local elements = {} + + if not ownedLicenses['dmv'] then + table.insert(elements, {label = 'Examen du code $' .. Config.Prices['dmv'], value = 'theory_test'}) + end + + if ownedLicenses['dmv'] then + + if not ownedLicenses['drive'] then + table.insert(elements, {label = 'Examen de conduite [voiture] $' .. Config.Prices['drive'], value = 'drive_test', type = 'drive'}) + end + + if not ownedLicenses['drive_bike'] then + table.insert(elements, {label = 'Examen de conduite [moto] $' .. Config.Prices['drive_bike'], value = 'drive_test', type = 'drive_bike'}) + end + + if not ownedLicenses['drive_truck'] then + table.insert(elements, {label = 'Examen de conduite [camion] $' .. Config.Prices['drive_truck'], value = 'drive_test', type = 'drive_truck'}) + end + + end + + ESX.UI.Menu.CloseAll() + + ESX.UI.Menu.Open( + 'default', GetCurrentResourceName(), 'dmvschool_actions', + { + title = 'Ecole de conduite', + elements = elements + }, + function(data, menu) + + if data.current.value == 'theory_test' then + menu.close() + StartTheoryTest() + end + + if data.current.value == 'drive_test' then + menu.close() + StartDriveTest(data.current.type) + end + + end, + function(data, menu) + + menu.close() + + CurrentAction = 'dmvschool_menu' + CurrentActionMsg = 'Appuyez sur ~INPUT_CONTEXT~ pour ouvrir le menu' + CurrentActionData = {} + + end + ) + +end + +RegisterNUICallback('question', function(data, cb) + + SendNUIMessage({ + openSection = 'question' + }) + + cb('OK') +end) + +RegisterNUICallback('close', function(data, cb) + StopTheoryTest(true) + cb('OK') +end) + +RegisterNUICallback('kick', function(data, cb) + StopTheoryTest(false) + cb('OK') +end) + +AddEventHandler('esx_dmvschool:hasEnteredMarker', function(zone) + + if zone == 'DMVSchool' then + + CurrentAction = 'dmvschool_menu' + CurrentActionMsg = 'Appuyez sur ~INPUT_CONTEXT~ pour ouvrir le menu' + CurrentActionData = {} + + end + +end) + +AddEventHandler('esx_dmvschool:hasExitedMarker', function(zone) + CurrentAction = nil + ESX.UI.Menu.CloseAll() +end) + +RegisterNetEvent('esx_dmvschool:loadLicenses') +AddEventHandler('esx_dmvschool:loadLicenses', function(licenses) + Licenses = licenses +end) + +-- Create Blips +Citizen.CreateThread(function() + + local blip = AddBlipForCoord(Config.Zones.DMVSchool.Pos.x, Config.Zones.DMVSchool.Pos.y, Config.Zones.DMVSchool.Pos.z) + + SetBlipSprite (blip, 408) + SetBlipDisplay(blip, 4) + SetBlipScale (blip, 1.2) + SetBlipAsShortRange(blip, true) + + BeginTextCommandSetBlipName("STRING") + AddTextComponentString("Auto-école") + EndTextCommandSetBlipName(blip) + +end) + +-- Display markers +Citizen.CreateThread(function() + while true do + + Citizen.Wait(0) + + local coords = GetEntityCoords(GetPlayerPed(-1)) + + for k,v in pairs(Config.Zones) do + if(v.Type ~= -1 and GetDistanceBetweenCoords(coords, v.Pos.x, v.Pos.y, v.Pos.z, true) < Config.DrawDistance) then + DrawMarker(v.Type, v.Pos.x, v.Pos.y, v.Pos.z, 0.0, 0.0, 0.0, 0, 0.0, 0.0, v.Size.x, v.Size.y, v.Size.z, v.Color.r, v.Color.g, v.Color.b, 100, false, true, 2, false, false, false, false) + end + end + + end +end) + +-- Enter / Exit marker events +Citizen.CreateThread(function() + while true do + + Citizen.Wait(0) + + local coords = GetEntityCoords(GetPlayerPed(-1)) + local isInMarker = false + local currentZone = nil + + for k,v in pairs(Config.Zones) do + if(GetDistanceBetweenCoords(coords, v.Pos.x, v.Pos.y, v.Pos.z, true) < v.Size.x) then + isInMarker = true + currentZone = k + end + end + + if (isInMarker and not HasAlreadyEnteredMarker) or (isInMarker and LastZone ~= currentZone) then + HasAlreadyEnteredMarker = true + LastZone = currentZone + TriggerEvent('esx_dmvschool:hasEnteredMarker', currentZone) + end + + if not isInMarker and HasAlreadyEnteredMarker then + HasAlreadyEnteredMarker = false + TriggerEvent('esx_dmvschool:hasExitedMarker', LastZone) + end + + end +end) + +-- Block UI +Citizen.CreateThread(function() + while true do + + Citizen.Wait(0) + + if CurrentTest == 'theory' then + + local playerPed = GetPlayerPed(-1) + + DisableControlAction(0, 1, true) -- LookLeftRight + DisableControlAction(0, 2, true) -- LookUpDown + DisablePlayerFiring(playerPed, true) -- Disable weapon firing + DisableControlAction(0, 142, true) -- MeleeAttackAlternate + DisableControlAction(0, 106, true) -- VehicleMouseControlOverride + + end + + end +end) + +-- Key Controls +Citizen.CreateThread(function() + while true do + + Citizen.Wait(0) + + if CurrentAction ~= nil then + + SetTextComponentFormat('STRING') + AddTextComponentString(CurrentActionMsg) + DisplayHelpTextFromStringLabel(0, 0, 1, -1) + + if IsControlJustReleased(0, Keys['E']) then + + if CurrentAction == 'dmvschool_menu' then + OpenDMVSchoolMenu() + end + + CurrentAction = nil + + end + + end + + end +end) + +-- Drive test +Citizen.CreateThread(function() + while true do + + Citizen.Wait(0) + + if CurrentTest == 'drive' then + + local playerPed = GetPlayerPed(-1) + local coords = GetEntityCoords(playerPed) + local nextCheckPoint = CurrentCheckPoint + 1 + + if Config.CheckPoints[nextCheckPoint] == nil then + + if DoesBlipExist(CurrentBlip) then + RemoveBlip(CurrentBlip) + end + + CurrentTest = nil + + ESX.ShowNotification('Test de conduite terminé') + + if DriveErrors < Config.MaxErrors then + StopDriveTest(true) + else + StopDriveTest(false) + end + + else + + if CurrentCheckPoint ~= LastCheckPoint then + + if DoesBlipExist(CurrentBlip) then + RemoveBlip(CurrentBlip) + end + + CurrentBlip = AddBlipForCoord(Config.CheckPoints[nextCheckPoint].Pos.x, Config.CheckPoints[nextCheckPoint].Pos.y, Config.CheckPoints[nextCheckPoint].Pos.z) + SetBlipRoute(CurrentBlip, 1) + + LastCheckPoint = CurrentCheckPoint + + end + + local distance = GetDistanceBetweenCoords(coords, Config.CheckPoints[nextCheckPoint].Pos.x, Config.CheckPoints[nextCheckPoint].Pos.y, Config.CheckPoints[nextCheckPoint].Pos.z, true) + + if distance <= 100.0 then + DrawMarker(1, Config.CheckPoints[nextCheckPoint].Pos.x, Config.CheckPoints[nextCheckPoint].Pos.y, Config.CheckPoints[nextCheckPoint].Pos.z, 0.0, 0.0, 0.0, 0, 0.0, 0.0, 1.5, 1.5, 1.5, 102, 204, 102, 100, false, true, 2, false, false, false, false) + end + + if distance <= 3.0 then + Config.CheckPoints[nextCheckPoint].Action(playerPed, CurrentVehicle, SetCurrentZoneType) + CurrentCheckPoint = CurrentCheckPoint + 1 + end + + end + + end + + end +end) + +-- Speed / Damage control +Citizen.CreateThread(function() + while true do + + Citizen.Wait(0) + + if CurrentTest == 'drive' then + + local playerPed = GetPlayerPed(-1) + + if IsPedInAnyVehicle(playerPed, false) then + + local vehicle = GetVehiclePedIsIn(playerPed, false) + local speed = GetEntitySpeed(vehicle) * Config.SpeedMultiplier + local tooMuchSpeed = false + + for k,v in pairs(Config.SpeedLimits) do + if CurrentZoneType == k and speed > v then + + tooMuchSpeed = true + + if not IsAboveSpeedLimit then + + DriveErrors = DriveErrors + 1 + IsAboveSpeedLimit = true + + ESX.ShowNotification('Vous roulez trop vite, vitesse limite : ~y~' .. v .. 'km/h') + ESX.ShowNotification('Erreurs : ~r~' .. DriveErrors .. '~s~/' .. Config.MaxErrors) + + end + + end + end + + if not tooMuchSpeed then + IsAboveSpeedLimit = false + end + + local health = GetEntityHealth(vehicle) + + if health < LastVehicleHealth then + + DriveErrors = DriveErrors + 1 + + ESX.ShowNotification('Vous avez endommagé votre véhicule') + ESX.ShowNotification('Erreurs : ~r~' .. DriveErrors .. '~s~/' .. Config.MaxErrors) + + LastVehicleHealth = health + + end + + end + + end + + end + +end) \ No newline at end of file diff --git a/config.lua b/config.lua new file mode 100644 index 00000000..7e864ca6 --- /dev/null +++ b/config.lua @@ -0,0 +1,187 @@ +Config = {} +Config.DrawDistance = 100.0 +Config.MaxErrors = 5 +Config.SpeedMultiplier = 3.6 + +Config.Prices = { + dmv = 200, + drive = 500, + drive_bike = 500, + drive_truck = 500 +} + +Config.VehicleModels = { + drive = 'blista', + drive_bike = 'sanchez', + drive_truck = 'mule3' +} + +Config.SpeedLimits = { + residence = 50, + town = 80, + freeway = 120 +} + +Config.Zones = { + + DMVSchool = { + Pos = {x = 239.471, y = -1380.960, z = 32.741}, + Size = {x = 1.5, y = 1.5, z = 1.0}, + Color = {r = 204, g = 204, b = 0}, + Type = 1 + }, + + VehicleSpawnPoint = { + Pos = {x = 249.409, y = -1407.230, z = 30.4094}, + Size = {x = 1.5, y = 1.5, z = 1.0}, + Color = {r = 204, g = 204, b = 0}, + Type = -1 + }, + +} + +Config.CheckPoints = { + + { + Pos = {x = 255.139, y = -1400.731, z = 29.537}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText('Allez vers le prochain passage ! Vitesse limite : ~y~' .. Config.SpeedLimits['residence'] .. 'km/h', 5000) + end + }, + + { + Pos = {x = 271.874, y = -1370.574, z = 30.932}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText('Allez vers le prochain passage !', 5000) + end + }, + + { + Pos = {x = 234.907, y = -1345.385, z = 29.542}, + Action = function(playerPed, vehicle, setCurrentZoneType) + Citizen.CreateThread(function() + DrawMissionText('Faite rapidement un ~r~stop~s~ pour le piéton qui ~y~traverse', 5000) + PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) + FreezeEntityPosition(vehicle, true) + Citizen.Wait(4000) + FreezeEntityPosition(vehicle, false) + DrawMissionText('~g~Bien!~s~ continuons!', 5000) + + end) + end + }, + + { + Pos = {x = 217.821, y = -1410.520, z = 28.292}, + Action = function(playerPed, vehicle, setCurrentZoneType) + + setCurrentZoneType('town') + + Citizen.CreateThread(function() + DrawMissionText('Marquer rapidement un ~r~stop~s~ et regardez à votre ~y~gauche~s~. Vitesse limite : ~y~' .. Config.SpeedLimits['town'] .. 'km/h', 5000) + PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) + FreezeEntityPosition(vehicle, true) + Citizen.Wait(6000) + FreezeEntityPosition(vehicle, false) + DrawMissionText('~g~bien!~s~ prenez à ~y~droite~s~ et suivez votre file', 5000) + end) + end + }, + + { + Pos = {x = 178.550, y = -1401.755, z = 27.725}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText('Observez le traffic ~y~allumez vos feux~s~ !', 5000) + end + }, + + { + Pos = {x = 113.160, y = -1365.276, z = 27.725}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText('Allez vers le prochain passage !', 5000) + end + }, + + { + Pos = {x = -73.542, y = -1364.335, z = 27.789}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText('Marquez le stop pour laisser passer les véhicules !', 5000) + PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) + FreezeEntityPosition(vehicle, true) + Citizen.Wait(6000) + FreezeEntityPosition(vehicle, false) + end + }, + + { + Pos = {x = -355.143, y = -1420.282, z = 27.868}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText('Allez vers le prochain passage !', 5000) + end + }, + + { + Pos = {x = -439.148, y = -1417.100, z = 27.704}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText('Allez vers le prochain passage !', 5000) + end + }, + + { + Pos = {x = -453.790, y = -1444.726, z = 27.665}, + Action = function(playerPed, vehicle, setCurrentZoneType) + + setCurrentZoneType('freeway') + + DrawMissionText('Il est temps d\'aller sur la rocade ! Vitesse limite : ~y~' .. Config.SpeedLimits['freeway'] .. 'km/h', 5000) + PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) + end + }, + + { + Pos = {x = -463.237, y = -1592.178, z = 37.519}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText('Allez vers le prochain passage !', 5000) + end + }, + + { + Pos = {x = -900.647, y = -1986.28, z = 26.109}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText('Allez vers le prochain passage !', 5000) + end + }, + + { + Pos = {x = 1225.759, y = -1948.792, z = 38.718}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText('Allez vers le prochain passage !', 5000) + end + }, + + { + Pos = {x = 1225.759, y = -1948.792, z = 38.718}, + Action = function(playerPed, vehicle, setCurrentZoneType) + + setCurrentZoneType('town') + + DrawMissionText('Entrée en ville, attention à votre vitesse ! Vitesse limite : ~y~' .. Config.SpeedLimits['town'] .. 'km/h', 5000) + end + }, + + { + Pos = {x = 1163.603, y = -1841.771, z = 35.679}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText('Bravo, restez vigilant!', 5000) + PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) + end + }, + + { + Pos = {x = 235.283, y = -1398.329, z = 28.921}, + Action = function(playerPed, vehicle, setCurrentZoneType) + ESX.Game.DeleteVehicle(vehicle) + end + }, + +} \ No newline at end of file diff --git a/esx_dmvschool.sql b/esx_dmvschool.sql new file mode 100644 index 00000000..330e1ac7 --- /dev/null +++ b/esx_dmvschool.sql @@ -0,0 +1,7 @@ +USE `essentialmode`; + +INSERT INTO `licenses` (`type`, `label`) VALUES + ('drive', 'Permis de conduire'), + ('drive_bike', 'Permis moto'), + ('drive_truck', 'Permis camion') +; \ No newline at end of file diff --git a/html/badge.png b/html/badge.png new file mode 100644 index 0000000000000000000000000000000000000000..0f3656286944ebf017066734470782553c3ffa4b GIT binary patch literal 96716 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 K#HSpwl3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y-fM)1rW~NwKx|o~0IU8CSnK_#o8oC-;7y!e{)Y941*wWd| z)XWg3*Cju>G&eP`1g19yq1O_pUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+d7PnZqx)?b* zIve6N52`l>i(8<2jd1GK2RcR{6tzfE4HE*U9}p9saDg0n(of9;ruQOX!Y z80qQa7*cWT&9wb~hYbXdC0|$4bxKN0cZ!k|(0A)! zlCmp&l{d^)Rj;*D&#JYLulXkVzV_mB$y1lQIRl;VXBj?F{lFoWyveKOBTEsN#>&W5 zf4tfaH?2zb>zL5^>G$j$MX{X@F`)Yud0@brRztxiy!M2yDBYI8oqG zncYSqM;Vq0m-RZ%ch6wRiw}t081+}?ooG~0;9Ci+@3&Q}e%=1C=3cBr`h}G;cPH7- zoxA_kN^Xrcf7lKmmtFAw%pvxW@||mTyhBd)6N=f6i9(tp3#uhQ7&b z1yk7mv(yT`Nj(0(e@3TOnxvV}YL*zovx`I*tSe#t^GbS=nMzgAd556)>KCS%Ka(!; zKcN-ooD_A>I_|P6qsog}tAd$DR)unB@~@3ry!zRFhFbHb+g{vcYhX-ZkYK1{zrkU^ YP!o7T%jG1m6{zU(boFyt=akR{0NGEqQ~&?~ literal 0 HcmV?d00001 diff --git a/html/debounce.min.js b/html/debounce.min.js new file mode 100644 index 00000000..648fe5d3 --- /dev/null +++ b/html/debounce.min.js @@ -0,0 +1,9 @@ +/* + * jQuery throttle / debounce - v1.1 - 3/7/2010 + * http://benalman.com/projects/jquery-throttle-debounce-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function(b,c){var $=b.jQuery||b.Cowboy||(b.Cowboy={}),a;$.throttle=a=function(e,f,j,i){var h,d=0;if(typeof f!=="boolean"){i=j;j=f;f=c}function g(){var o=this,m=+new Date()-d,n=arguments;function l(){d=+new Date();j.apply(o,n)}function k(){h=c}if(i&&!h){l()}h&&clearTimeout(h);if(i===c&&m>e){l()}else{if(f!==true){h=setTimeout(i?k:l,i===c?e-m:e)}}}if($.guid){g.guid=j.guid=j.guid||$.guid++}return g};$.debounce=function(d,e,f){return f===c?a(d,e,false):a(d,f,e!==false)}})(this); diff --git a/html/dmv.png b/html/dmv.png new file mode 100644 index 0000000000000000000000000000000000000000..b5cf951fbc1081413a18cd29a9339b96e249059e GIT binary patch literal 745 zcmVy zMNn@NDWr(nQz#N*i!FK(t7#z$F3D!KvWq_p`#0I$$tJLKo$v2`@6CLZ4TA<>OoP`C zAAr{k`V9CCIP8EgA%_ig?9QZ@E9;J<7zB8}EGat!yI5K&KotPBs#Srh0+{(IDU5hn2$ZS z3|==9Ix@RKQ|ya_6(Rt2AtAdASR!=6fJj2h8CW=r=-M;L^2zPFPjm*%By{F(zUuNH z4tHyOhyYZb>5qfiEmSiAtA)>ao1Mdlr98xP2`vE*9i83i-Nz#wZncZeH9u1Z-sQ5$ zq@NfjH`Zgg@A)k>eP;rqST-zBW@9jM$rOOmEkr6IJ>9DlnldmodDW8Yq0wuW zHhKm%0br{#m6PWZasz;;gKS-p@M9_mX|brm!gfWlaVQ2RWbdU(Dj{{^s^@_4U;*Nr z72`wPzXPFDyKUV<)B*fjE8+WLYm2v48W z!lU;PXFegyZ%5~O?Fe7Gl}9170`6!#xMLkokBe=8-D|Ws_7W)lBo4|1S!}*>Kx6O5 zTgcWN_zNJOOhFVlWRioL;?#RhTR4Q1eYyZV8)U^q2K?n|RD=Lt-8`)+PQ4dN@x*Mo zZD=@&WdNkh2!N-9>`Nkz09q_Dlp$hUDqerL(B$4?YqE{{I6cU7~5@GeEPuB(Z%4NV-JR#%F+LcS&M5 bJOjT0|36WBnZnCB00000NkvXXu0mjf?$1Z4 literal 0 HcmV?d00001 diff --git a/html/questions.js b/html/questions.js new file mode 100644 index 00000000..2c1ae9cb --- /dev/null +++ b/html/questions.js @@ -0,0 +1,71 @@ +var tableauQuestion = [ + { question : "Si vous conduisez à 80km/h, que vous approchez d'un lieu de résidence, cela veut dire que :", + propositionA : "Vous devez accélérer", + propositionB : "Vous pouvez garder votre vitesse, si vous ne croisez pas d'autres véhicules", + propositionC : "Vous devez ralentir", + propositionD : "Vous pouvez garder votre vitesse", + reponse : "C"}, + + { question : "Vous vous apprétez à tourner à droite au feu vert, mais vous voyez un piéton qui traverse :", + propositionA : "Vous passez avant le piéton", + propositionB : "Vous vérifiez qu'il n'y a pas d'autre véhicule et vous passez", + propositionC : "Vous attendez que le piéton est terminé", + propositionD : "Vous shoutez le piéton pour passer", + reponse : "C"}, + + { question : "Sans aucune indication : La vitesse dans une zone résidentielle est de : __ km/h", + propositionA : "50", + propositionB : "55", + propositionC : "65", + propositionD : "70", + reponse : "A"}, + + { question : "Avant chaque changement de file vous devez :", + propositionA : "Vérifiez vos rétroviseurs", + propositionB : "Vérifiez vos angles morts", + propositionC : "Signalez vos intentions", + propositionD : "Tout cela", + reponse : "D"}, + + { question : "What blood alcohol level is classified as driving while intoxicated?", + propositionA : "0.05%", + propositionB : "0.18%", + propositionC : "0.08%", + propositionD : "0.06%", + reponse : "C"}, + + { question : "A quel moment vous pouvez passer aux feux ?", + propositionA : "Quand il est vert", + propositionB : "Quand il n'y a personne sur l'intersection", + propositionC : "Vous êtes dans une zone d'école", + propositionD : "Quand il est vert et/ou rouge et que je tourne à droite", + reponse : "D"}, + + { question : "Un piéton est au feu rouge pour les piétons", + propositionA : "Vous le laissez passer", + propositionB : "Vous observez avant de continuer", + propositionC : "Vous lui faite un signe de la main", + propositionD : "Vous continuez votre chemin car votre feu est vert", + reponse : "D"}, + + { question : "Qu'est ce qui est permit quand vous dépassez un autre véhicule", + propositionA : "Le suivre de près pour le doubler plus vite", + propositionB : "Le doubler en quittant la route", + propositionC : "Conduire sur la route opposé pour le dépasser", + propositionD : "Dépasser la vitesse limite", + reponse : "C"}, + + { question : "Vous conduisez sur une rocade qui indique une vitesse maximum de 110 km/h. La plupart du traffic roule à 120 km/h, alors vous ne devriez pas conduire plus vite que :", + propositionA : "80 kmh", + propositionB : "40 kmh", + propositionC : "50 kmh", + propositionD : "110 kmh", + reponse : "D"}, + + { question : "Quand vous êtes dépassé par un autre véhicule il est important de ne PAS :", + propositionA : "Ralentir", + propositionB : "Vérifiez vos rétroviseurs", + propositionC : "Regarder les autres conducteurs", + propositionD : "Augmenter votre vitesse", + reponse : "D"}, +] diff --git a/html/scripts.js b/html/scripts.js new file mode 100644 index 00000000..6494266f --- /dev/null +++ b/html/scripts.js @@ -0,0 +1,144 @@ +// Mouse Controls +var documentWidth = document.documentElement.clientWidth; +var documentHeight = document.documentElement.clientHeight; +var cursor = $('#cursor'); +var cursorX = documentWidth / 2; +var cursorY = documentHeight / 2; + +//question variables +var questionNumber = 1; +var userAnswer = []; +var goodAnswer = []; +var questionUsed = []; +var nbQuestionToAnswer = 10; // don't forget to change the progress bar max value in html +var nbAnswerNeeded = 1; // out of nbQuestionToAnswer +var nbPossibleQuestions = 10; //number of questions in database questions.js +var lastClick = 0; +/* +var nbQuestionToAnswer = 10; // don't forget to change the progress bar max value in html +var nbAnswerNeeded = 8; // out of nbQuestionToAnswer +var nbPossibleQuestions = 15; //number of questions in database questions.js +*/ + +function getRandomQuestion() { + var continuer = true; + var random; + while (continuer){ + continuer=false; // do not continue loop + random = Math.floor(Math.random() * nbPossibleQuestions) ; // number of possible questions + if(questionNumber==1){ + return random; + } + for(i=0; i= nbAnswerNeeded) { + openResultGood(); + } + else{ + openResultBad(); + } + } + + return false; + +}); diff --git a/html/styles.css b/html/styles.css new file mode 100644 index 00000000..4b6a8e51 --- /dev/null +++ b/html/styles.css @@ -0,0 +1,191 @@ +html { + overflow: hidden; + font-family: 'Open Sans', sans-serif; +} + +#cursor { + position: absolute; + z-index: 99999999; + display: none; +} + +.full-screen { + width: 100%; + height:100%; + display: flex; + align-items: center; +} + +.question-container { + width: 70%; + height: 700px; + background-color: #fff; + border: 1px solid #222; + border-radius: 1px; + margin-left: auto; + margin-right: auto; + overflow: hidden; + z-index: 9999999; + display: none; +} + +.header { + width:100%; + height: 20%; + background-color: #eee; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; +} + +.header .logo { + width: 80%; + max-height: 50%; + margin: auto; + margin-bottom: 0; +} + +.header h1 { + font-size: 2em; + text-align: center; + margin:auto; +} + +.body { + width: 100%; + height: 80%; + display: flex; + flex-direction: row; + flex-wrap: wrap; + display: none; +} + +.content { + display: flex; + flex-direction: column; + align-self: center; + width: 90%; + height: 70%; + margin: auto; + border:none; +} + +.content .logo { + width: auto; + max-height: auto; + margin: auto; + margin-bottom: 0; +} + +.content h2, p { + margin: 5px; +} + +.buttonspot { + display: flex; + flex-direction: column; + align-self: center; + width: auto; + height: 15%; + margin: auto; + border:none; +} + +.buttonspot h2, p { + margin: 5px; +} + +.button { + width: 30%; + height: 40px; + align-self: center; + text-align: center; + margin-left: 40px; + margin-right: 40px; + background: #6699ff; + background-image: linear-gradient(to bottom, #6699ff, #4d88ff); + border-radius: 4px; + color: #ffffff; + font-size: 1.5em; + text-decoration: none; +} + + +.form { + display: flex; + flex-direction: row; + justify-content: center; + flex-wrap: wrap; + width: 100%; + margin-top:5px; +} + +.form div { + margin :auto; + margin-top:5px; + margin-bottom: 5px; + width: 100%; +} + +.submit{ + align-items: center; + height: 30px; + text-align: center; + width: 30%; + background: #017ebc; + background-image: linear-gradient(to bottom, #6699ff, #4d88ff); + border-radius: 4px; + color: #fff; + font-size: 1.2em; + margin-top: 10px; +} + +.barre-progression { + width: 50%; + align-self: center; + height: 10%; + margin: auto; + margin-top: 0; + display: flex; + flex-wrap: wrap; + justify-content: center; + padding: 0; +} + +.barre-progression h2{ + width: 100%; + height: 60%; + text-align: center; + display: flex; + justify-content: center; + align-items: center; + margin:0; + color: #6699ff; +} + +.progression { + width: 80%; + border: 0 none; + background: #ddd; + border-radius: 14px; + box-shadow: inset 0px 1px 1px rgba(0,0,0,0.5), 0px 1px 0px rgba(255,255,255,0.2); +} +.progression::-moz-progress-bar { + background: #FFF; + border-radius: 14px; + box-shadow: inset 0 -2px 4px rgba(0,0,0,0.4), 0 2px 5px 0px rgba(0,0,0,0.3); +} +.progression::-webkit-progress-bar { + background: transparent; +} +.progression::-webkit-progress-value { + background-image: linear-gradient(to bottom, #6699ff, #4d88ff); + border-radius: 14px; + box-shadow: inset 0 -2px 4px rgba(0,0,0,0.4), 0 2px 5px 0px rgba(0,0,0,0.3); +} + +.bold-text{ + font-weight: bold; + font-size: 1.3em; +} \ No newline at end of file diff --git a/html/ui.html b/html/ui.html new file mode 100644 index 00000000..53446a50 --- /dev/null +++ b/html/ui.html @@ -0,0 +1,102 @@ + + + + + + +
+
+ +
+

Auto-école

+
+ +
+
+ +

Bienvenu à votre Auto-école

+
Tous les citoyens de Los Santos doivent réussir leur examen de code avant de pouvoir conduire.
Prenez votre temps, répondez avec du bon sens, ne répondez pas au hasard.

+ Examen de Code
+ - L'examen de code coute 200$, cela n'est pas remboursé si vous échouez.
+ - N'ayez pas peur, l'auto-école accepte les crédits, mais faite attention à ne pas vous endetter
+ - Si vous loupez votre test une première fois, vous ne pouvez pas le repasser de suite, vous devrez le retenter un autre jour.

+ Examen de Conduite
+ - L'examen de Conduite coute 500$, comme pour l'examen de code, ce paiement ne vous sera pas remboursé si vous échoué.
+ - La chose principale pour votre permis c'est de faire attention à ce qui vous entoure et surtout éviter les accidents !

+
+
+ Démarrer +
+
+

Progrès

+ +
+
+ +
+
+

+

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+

Progrès

+ +
+
+ +
+
+

Bon travail !



Vous avez bien travaillé durant l'examen!

Vous pouvez maintenant fermer cette fenètre et passer à l'examen.
+
+
+ Fermer +
+
+

Progrès

+ +
+
+
+
+

Vous avez échoué



Vous n'êtes pas prêt pour ce test, essayez une nouvelle fois, plus tard...

+
+
+ Fermer +
+
+

Progrès

+ +
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/server/main.lua b/server/main.lua new file mode 100644 index 00000000..d81d4daa --- /dev/null +++ b/server/main.lua @@ -0,0 +1,34 @@ +ESX = nil + +TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) + +AddEventHandler('esx:playerLoaded', function(source) + TriggerEvent('esx_license:getLicenses', source, function(licenses) + TriggerClientEvent('esx_dmvschool:loadLicenses', source, licenses) + end) +end) + +RegisterNetEvent('esx_dmvschool:addLicense') +AddEventHandler('esx_dmvschool:addLicense', function(type) + + local _source = source + + TriggerEvent('esx_license:addLicense', _source, type, function() + TriggerEvent('esx_license:getLicenses', _source, function(licenses) + TriggerClientEvent('esx_dmvschool:loadLicenses', _source, licenses) + end) + end) + +end) + +RegisterNetEvent('esx_dmvschool:pay') +AddEventHandler('esx_dmvschool:pay', function(price) + + local _source = source + local xPlayer = ESX.GetPlayerFromId(_source) + + xPlayer.removeMoney(price) + + TriggerClientEvent('esx:showNotification', _source, 'Vous avez payé ~g~$' .. price) + +end) From 072ef503b21091a960568022950b525eadeee97b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20N=27gadi?= Date: Tue, 19 Sep 2017 15:18:42 +0200 Subject: [PATCH 02/36] fix(sql): Add dmv --- __resource.lua | 2 +- esx_dmvschool.sql | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/__resource.lua b/__resource.lua index 23906bda..6a917dbe 100644 --- a/__resource.lua +++ b/__resource.lua @@ -2,7 +2,7 @@ resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' description 'ESX DMV School' -version '1.0.0' +version '1.0.1' server_scripts { 'server/main.lua' diff --git a/esx_dmvschool.sql b/esx_dmvschool.sql index 330e1ac7..a6ecd0cb 100644 --- a/esx_dmvschool.sql +++ b/esx_dmvschool.sql @@ -1,6 +1,7 @@ USE `essentialmode`; INSERT INTO `licenses` (`type`, `label`) VALUES + ('dmv', 'Code de la route'), ('drive', 'Permis de conduire'), ('drive_bike', 'Permis moto'), ('drive_truck', 'Permis camion') From 4c7e767a1dc8c4de3a41f38717eaea00e8ce24ba Mon Sep 17 00:00:00 2001 From: nearbyplayer Date: Thu, 21 Sep 2017 12:23:36 -0400 Subject: [PATCH 03/36] update(feat): Multi-Language Support chore(coding-style): Fix Indentation --- .editorconfig | 9 + __resource.lua | 33 ++- client/main.lua | 441 +++++++++++++++--------------- config.lua | 273 +++++++++--------- html/questions_en.js | 71 +++++ html/scripts.js | 2 +- html/ui_en.html | 98 +++++++ locales/en.lua | 29 ++ locales/fr.lua | 29 ++ localization/en_esx_dmvschool.sql | 8 + server/main.lua | 26 +- 11 files changed, 633 insertions(+), 386 deletions(-) create mode 100644 .editorconfig create mode 100644 html/questions_en.js create mode 100644 html/ui_en.html create mode 100644 locales/en.lua create mode 100644 locales/fr.lua create mode 100644 localization/en_esx_dmvschool.sql diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..41c2aaf2 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +indent_size = 2 +indent_style = space +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true \ No newline at end of file diff --git a/__resource.lua b/__resource.lua index 6a917dbe..06cb9fea 100644 --- a/__resource.lua +++ b/__resource.lua @@ -2,26 +2,33 @@ resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' description 'ESX DMV School' -version '1.0.1' +version '1.0.2' server_scripts { - 'server/main.lua' + '@es_extended/locale.lua', + 'locales/fr.lua', + 'locales/en.lua', + 'config.lua', + 'server/main.lua' } client_scripts { - 'config.lua', - 'client/main.lua' + '@es_extended/locale.lua', + 'locales/fr.lua', + 'locales/en.lua', + 'config.lua', + 'client/main.lua' } ui_page 'html/ui.html' files { - 'html/ui.html', - 'html/logo.png', - 'html/dmv.png', - 'html/cursor.png', - 'html/styles.css', - 'html/questions.js', - 'html/scripts.js', - 'html/debounce.min.js' -} \ No newline at end of file + 'html/ui.html', + 'html/logo.png', + 'html/dmv.png', + 'html/cursor.png', + 'html/styles.css', + 'html/questions.js', + 'html/scripts.js', + 'html/debounce.min.js' +} diff --git a/client/main.lua b/client/main.lua index 96b9eee0..e2ee0cf9 100644 --- a/client/main.lua +++ b/client/main.lua @@ -1,13 +1,13 @@ local Keys = { - ["ESC"] = 322, ["F1"] = 288, ["F2"] = 289, ["F3"] = 170, ["F5"] = 166, ["F6"] = 167, ["F7"] = 168, ["F8"] = 169, ["F9"] = 56, ["F10"] = 57, - ["~"] = 243, ["1"] = 157, ["2"] = 158, ["3"] = 160, ["4"] = 164, ["5"] = 165, ["6"] = 159, ["7"] = 161, ["8"] = 162, ["9"] = 163, ["-"] = 84, ["="] = 83, ["BACKSPACE"] = 177, - ["TAB"] = 37, ["Q"] = 44, ["W"] = 32, ["E"] = 38, ["R"] = 45, ["T"] = 245, ["Y"] = 246, ["U"] = 303, ["P"] = 199, ["["] = 39, ["]"] = 40, ["ENTER"] = 18, - ["CAPS"] = 137, ["A"] = 34, ["S"] = 8, ["D"] = 9, ["F"] = 23, ["G"] = 47, ["H"] = 74, ["K"] = 311, ["L"] = 182, - ["LEFTSHIFT"] = 21, ["Z"] = 20, ["X"] = 73, ["C"] = 26, ["V"] = 0, ["B"] = 29, ["N"] = 249, ["M"] = 244, [","] = 82, ["."] = 81, - ["LEFTCTRL"] = 36, ["LEFTALT"] = 19, ["SPACE"] = 22, ["RIGHTCTRL"] = 70, - ["HOME"] = 213, ["PAGEUP"] = 10, ["PAGEDOWN"] = 11, ["DELETE"] = 178, - ["LEFT"] = 174, ["RIGHT"] = 175, ["TOP"] = 27, ["DOWN"] = 173, - ["NENTER"] = 201, ["N4"] = 108, ["N5"] = 60, ["N6"] = 107, ["N+"] = 96, ["N-"] = 97, ["N7"] = 117, ["N8"] = 61, ["N9"] = 118 + ["ESC"] = 322, ["F1"] = 288, ["F2"] = 289, ["F3"] = 170, ["F5"] = 166, ["F6"] = 167, ["F7"] = 168, ["F8"] = 169, ["F9"] = 56, ["F10"] = 57, + ["~"] = 243, ["1"] = 157, ["2"] = 158, ["3"] = 160, ["4"] = 164, ["5"] = 165, ["6"] = 159, ["7"] = 161, ["8"] = 162, ["9"] = 163, ["-"] = 84, ["="] = 83, ["BACKSPACE"] = 177, + ["TAB"] = 37, ["Q"] = 44, ["W"] = 32, ["E"] = 38, ["R"] = 45, ["T"] = 245, ["Y"] = 246, ["U"] = 303, ["P"] = 199, ["["] = 39, ["]"] = 40, ["ENTER"] = 18, + ["CAPS"] = 137, ["A"] = 34, ["S"] = 8, ["D"] = 9, ["F"] = 23, ["G"] = 47, ["H"] = 74, ["K"] = 311, ["L"] = 182, + ["LEFTSHIFT"] = 21, ["Z"] = 20, ["X"] = 73, ["C"] = 26, ["V"] = 0, ["B"] = 29, ["N"] = 249, ["M"] = 244, [","] = 82, ["."] = 81, + ["LEFTCTRL"] = 36, ["LEFTALT"] = 19, ["SPACE"] = 22, ["RIGHTCTRL"] = 70, + ["HOME"] = 213, ["PAGEUP"] = 10, ["PAGEDOWN"] = 11, ["DELETE"] = 178, + ["LEFT"] = 174, ["RIGHT"] = 175, ["TOP"] = 27, ["DOWN"] = 173, + ["NENTER"] = 201, ["N4"] = 108, ["N5"] = 60, ["N6"] = 107, ["N+"] = 96, ["N-"] = 97, ["N7"] = 117, ["N8"] = 61, ["N9"] = 118 } ESX = nil @@ -27,29 +27,29 @@ local IsAboveSpeedLimit = false local LastVehicleHealth = nil Citizen.CreateThread(function() - while ESX == nil do - TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) - Citizen.Wait(0) - end + while ESX == nil do + TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) + Citizen.Wait(0) + end end) function DrawMissionText(msg, time) ClearPrints() - SetTextEntry_2('STRING') - AddTextComponentString(msg) - DrawSubtitleTimed(time, 1) + SetTextEntry_2('STRING') + AddTextComponentString(msg) + DrawSubtitleTimed(time, 1) end function StartTheoryTest() - CurrentTest = 'theory' + CurrentTest = 'theory' SendNUIMessage({ - openQuestion = true + openQuestion = true }) ESX.SetTimeout(200, function() - SetNuiFocus(true, true) + SetNuiFocus(true, true) end) TriggerServerEvent('esx_dmvschool:pay', Config.Prices['dmv']) @@ -57,20 +57,20 @@ function StartTheoryTest() end function StopTheoryTest(success) - - CurrentTest = nil + + CurrentTest = nil SendNUIMessage({ - openQuestion = false + openQuestion = false }) SetNuiFocus(false) if success then - TriggerServerEvent('esx_dmvschool:addLicense', 'dmv') - ESX.ShowNotification('Vous avez ~g~réussi~s~ le test') + TriggerServerEvent('esx_dmvschool:addLicense', 'dmv') + ESX.ShowNotification(_U('passed_test')) else - ESX.ShowNotification('Vous avez ~r~raté~s~ le test') + ESX.ShowNotification(_U('failed_test')) end end @@ -78,33 +78,31 @@ end function StartDriveTest(type) - ESX.Game.SpawnVehicle(Config.VehicleModels[type], Config.Zones.VehicleSpawnPoint.Pos, 317.0, function(vehicle) - - CurrentTest = 'drive' - CurrentTestType = type - CurrentCheckPoint = 0 + ESX.Game.SpawnVehicle(Config.VehicleModels[type], Config.Zones.VehicleSpawnPoint.Pos, 317.0, function(vehicle) + CurrentTest = 'drive' + CurrentTestType = type + CurrentCheckPoint = 0 LastCheckPoint = -1 - CurrentZoneType = 'residence' - DriveErrors = 0 - IsAboveSpeedLimit = false - CurrentVehicle = vehicle - LastVehicleHealth = GetEntityHealth(vehicle) - local playerPed = GetPlayerPed(-1) - - TaskWarpPedIntoVehicle(playerPed, vehicle, -1) - end) + CurrentZoneType = 'residence' + DriveErrors = 0 + IsAboveSpeedLimit = false + CurrentVehicle = vehicle + LastVehicleHealth = GetEntityHealth(vehicle) + local playerPed = GetPlayerPed(-1) + TaskWarpPedIntoVehicle(playerPed, vehicle, -1) + end) - TriggerServerEvent('esx_dmvschool:pay', Config.Prices[type]) + TriggerServerEvent('esx_dmvschool:pay', Config.Prices[type]) end function StopDriveTest(success) if success then - TriggerServerEvent('esx_dmvschool:addLicense', CurrentTestType) - ESX.ShowNotification('Vous avez ~g~réussi~s~ le test') + TriggerServerEvent('esx_dmvschool:addLicense', CurrentTestType) + ESX.ShowNotification(_U('passed_test')) else - ESX.ShowNotification('Vous avez ~r~raté~s~ le test') + ESX.ShowNotification(_U('failed_test')) end CurrentTest = nil @@ -113,77 +111,77 @@ function StopDriveTest(success) end function SetCurrentZoneType(type) - CurrentZoneType = type + CurrentZoneType = type end function OpenDMVSchoolMenu() - local ownedLicenses = {} + local ownedLicenses = {} - for i=1, #Licenses, 1 do - ownedLicenses[Licenses[i].type] = true - end + for i=1, #Licenses, 1 do + ownedLicenses[Licenses[i].type] = true + end - local elements = {} + local elements = {} - if not ownedLicenses['dmv'] then - table.insert(elements, {label = 'Examen du code $' .. Config.Prices['dmv'], value = 'theory_test'}) - end + if not ownedLicenses['dmv'] then + table.insert(elements, {label = _U('theory_test') .. Config.Prices['dmv'], value = 'theory_test'}) + end - if ownedLicenses['dmv'] then + if ownedLicenses['dmv'] then - if not ownedLicenses['drive'] then - table.insert(elements, {label = 'Examen de conduite [voiture] $' .. Config.Prices['drive'], value = 'drive_test', type = 'drive'}) - end + if not ownedLicenses['drive'] then + table.insert(elements, {label = _U('road_test_car') .. Config.Prices['drive'], value = 'drive_test', type = 'drive'}) + end - if not ownedLicenses['drive_bike'] then - table.insert(elements, {label = 'Examen de conduite [moto] $' .. Config.Prices['drive_bike'], value = 'drive_test', type = 'drive_bike'}) - end + if not ownedLicenses['drive_bike'] then + table.insert(elements, {label = _U('road_test_bike') .. Config.Prices['drive_bike'], value = 'drive_test', type = 'drive_bike'}) + end - if not ownedLicenses['drive_truck'] then - table.insert(elements, {label = 'Examen de conduite [camion] $' .. Config.Prices['drive_truck'], value = 'drive_test', type = 'drive_truck'}) - end + if not ownedLicenses['drive_truck'] then + table.insert(elements, {label = _U('road_test_truck') .. Config.Prices['drive_truck'], value = 'drive_test', type = 'drive_truck'}) + end - end + end - ESX.UI.Menu.CloseAll() + ESX.UI.Menu.CloseAll() - ESX.UI.Menu.Open( - 'default', GetCurrentResourceName(), 'dmvschool_actions', - { - title = 'Ecole de conduite', - elements = elements - }, - function(data, menu) + ESX.UI.Menu.Open( + 'default', GetCurrentResourceName(), 'dmvschool_actions', + { + title = _U('driving_school'), + elements = elements + }, + function(data, menu) - if data.current.value == 'theory_test' then - menu.close() - StartTheoryTest() - end + if data.current.value == 'theory_test' then + menu.close() + StartTheoryTest() + end - if data.current.value == 'drive_test' then - menu.close() - StartDriveTest(data.current.type) - end + if data.current.value == 'drive_test' then + menu.close() + StartDriveTest(data.current.type) + end - end, - function(data, menu) + end, + function(data, menu) - menu.close() + menu.close() - CurrentAction = 'dmvschool_menu' - CurrentActionMsg = 'Appuyez sur ~INPUT_CONTEXT~ pour ouvrir le menu' - CurrentActionData = {} + CurrentAction = 'dmvschool_menu' + CurrentActionMsg = _U('press_open_menu') + CurrentActionData = {} - end - ) + end + ) end RegisterNUICallback('question', function(data, cb) - + SendNUIMessage({ - openSection = 'question' + openSection = 'question' }) cb('OK') @@ -201,88 +199,88 @@ end) AddEventHandler('esx_dmvschool:hasEnteredMarker', function(zone) - if zone == 'DMVSchool' then + if zone == 'DMVSchool' then - CurrentAction = 'dmvschool_menu' - CurrentActionMsg = 'Appuyez sur ~INPUT_CONTEXT~ pour ouvrir le menu' - CurrentActionData = {} + CurrentAction = 'dmvschool_menu' + CurrentActionMsg = _U('press_open_menu') + CurrentActionData = {} - end + end end) AddEventHandler('esx_dmvschool:hasExitedMarker', function(zone) - CurrentAction = nil - ESX.UI.Menu.CloseAll() + CurrentAction = nil + ESX.UI.Menu.CloseAll() end) RegisterNetEvent('esx_dmvschool:loadLicenses') AddEventHandler('esx_dmvschool:loadLicenses', function(licenses) - Licenses = licenses + Licenses = licenses end) -- Create Blips Citizen.CreateThread(function() - local blip = AddBlipForCoord(Config.Zones.DMVSchool.Pos.x, Config.Zones.DMVSchool.Pos.y, Config.Zones.DMVSchool.Pos.z) + local blip = AddBlipForCoord(Config.Zones.DMVSchool.Pos.x, Config.Zones.DMVSchool.Pos.y, Config.Zones.DMVSchool.Pos.z) - SetBlipSprite (blip, 408) - SetBlipDisplay(blip, 4) - SetBlipScale (blip, 1.2) - SetBlipAsShortRange(blip, true) + SetBlipSprite (blip, 408) + SetBlipDisplay(blip, 4) + SetBlipScale (blip, 1.2) + SetBlipAsShortRange(blip, true) - BeginTextCommandSetBlipName("STRING") - AddTextComponentString("Auto-école") - EndTextCommandSetBlipName(blip) + BeginTextCommandSetBlipName("STRING") + AddTextComponentString(_U('driving_school_blip')) + EndTextCommandSetBlipName(blip) end) -- Display markers Citizen.CreateThread(function() - while true do + while true do - Citizen.Wait(0) + Citizen.Wait(0) - local coords = GetEntityCoords(GetPlayerPed(-1)) + local coords = GetEntityCoords(GetPlayerPed(-1)) - for k,v in pairs(Config.Zones) do - if(v.Type ~= -1 and GetDistanceBetweenCoords(coords, v.Pos.x, v.Pos.y, v.Pos.z, true) < Config.DrawDistance) then - DrawMarker(v.Type, v.Pos.x, v.Pos.y, v.Pos.z, 0.0, 0.0, 0.0, 0, 0.0, 0.0, v.Size.x, v.Size.y, v.Size.z, v.Color.r, v.Color.g, v.Color.b, 100, false, true, 2, false, false, false, false) - end - end + for k,v in pairs(Config.Zones) do + if(v.Type ~= -1 and GetDistanceBetweenCoords(coords, v.Pos.x, v.Pos.y, v.Pos.z, true) < Config.DrawDistance) then + DrawMarker(v.Type, v.Pos.x, v.Pos.y, v.Pos.z, 0.0, 0.0, 0.0, 0, 0.0, 0.0, v.Size.x, v.Size.y, v.Size.z, v.Color.r, v.Color.g, v.Color.b, 100, false, true, 2, false, false, false, false) + end + end - end + end end) -- Enter / Exit marker events Citizen.CreateThread(function() - while true do + while true do - Citizen.Wait(0) + Citizen.Wait(0) - local coords = GetEntityCoords(GetPlayerPed(-1)) - local isInMarker = false - local currentZone = nil + local coords = GetEntityCoords(GetPlayerPed(-1)) + local isInMarker = false + local currentZone = nil - for k,v in pairs(Config.Zones) do - if(GetDistanceBetweenCoords(coords, v.Pos.x, v.Pos.y, v.Pos.z, true) < v.Size.x) then - isInMarker = true - currentZone = k - end - end + for k,v in pairs(Config.Zones) do + if(GetDistanceBetweenCoords(coords, v.Pos.x, v.Pos.y, v.Pos.z, true) < v.Size.x) then + isInMarker = true + currentZone = k + end + end - if (isInMarker and not HasAlreadyEnteredMarker) or (isInMarker and LastZone ~= currentZone) then - HasAlreadyEnteredMarker = true - LastZone = currentZone - TriggerEvent('esx_dmvschool:hasEnteredMarker', currentZone) - end + if (isInMarker and not HasAlreadyEnteredMarker) or (isInMarker and LastZone ~= currentZone) then + HasAlreadyEnteredMarker = true + LastZone = currentZone + TriggerEvent('esx_dmvschool:hasEnteredMarker', currentZone) + end - if not isInMarker and HasAlreadyEnteredMarker then - HasAlreadyEnteredMarker = false - TriggerEvent('esx_dmvschool:hasExitedMarker', LastZone) - end + if not isInMarker and HasAlreadyEnteredMarker then + HasAlreadyEnteredMarker = false + TriggerEvent('esx_dmvschool:hasExitedMarker', LastZone) + end - end + end end) -- Block UI @@ -300,7 +298,7 @@ Citizen.CreateThread(function() DisablePlayerFiring(playerPed, true) -- Disable weapon firing DisableControlAction(0, 142, true) -- MeleeAttackAlternate DisableControlAction(0, 106, true) -- VehicleMouseControlOverride - + end end @@ -308,147 +306,144 @@ end) -- Key Controls Citizen.CreateThread(function() - while true do + while true do - Citizen.Wait(0) + Citizen.Wait(0) - if CurrentAction ~= nil then + if CurrentAction ~= nil then - SetTextComponentFormat('STRING') - AddTextComponentString(CurrentActionMsg) - DisplayHelpTextFromStringLabel(0, 0, 1, -1) + SetTextComponentFormat('STRING') + AddTextComponentString(CurrentActionMsg) + DisplayHelpTextFromStringLabel(0, 0, 1, -1) - if IsControlJustReleased(0, Keys['E']) then + if IsControlJustReleased(0, Keys['E']) then - if CurrentAction == 'dmvschool_menu' then - OpenDMVSchoolMenu() - end + if CurrentAction == 'dmvschool_menu' then + OpenDMVSchoolMenu() + end - CurrentAction = nil + CurrentAction = nil - end + end - end + end - end + end end) -- Drive test Citizen.CreateThread(function() - while true do + while true do - Citizen.Wait(0) + Citizen.Wait(0) - if CurrentTest == 'drive' then + if CurrentTest == 'drive' then - local playerPed = GetPlayerPed(-1) - local coords = GetEntityCoords(playerPed) - local nextCheckPoint = CurrentCheckPoint + 1 + local playerPed = GetPlayerPed(-1) + local coords = GetEntityCoords(playerPed) + local nextCheckPoint = CurrentCheckPoint + 1 - if Config.CheckPoints[nextCheckPoint] == nil then - - if DoesBlipExist(CurrentBlip) then - RemoveBlip(CurrentBlip) - end + if Config.CheckPoints[nextCheckPoint] == nil then + if DoesBlipExist(CurrentBlip) then + RemoveBlip(CurrentBlip) + end - CurrentTest = nil + CurrentTest = nil - ESX.ShowNotification('Test de conduite terminé') + ESX.ShowNotification(_U('driving_test_complete')) - if DriveErrors < Config.MaxErrors then - StopDriveTest(true) - else - StopDriveTest(false) - end - - else + if DriveErrors < Config.MaxErrors then + StopDriveTest(true) + else + StopDriveTest(false) + end + else - if CurrentCheckPoint ~= LastCheckPoint then + if CurrentCheckPoint ~= LastCheckPoint then - if DoesBlipExist(CurrentBlip) then - RemoveBlip(CurrentBlip) - end + if DoesBlipExist(CurrentBlip) then + RemoveBlip(CurrentBlip) + end - CurrentBlip = AddBlipForCoord(Config.CheckPoints[nextCheckPoint].Pos.x, Config.CheckPoints[nextCheckPoint].Pos.y, Config.CheckPoints[nextCheckPoint].Pos.z) - SetBlipRoute(CurrentBlip, 1) + CurrentBlip = AddBlipForCoord(Config.CheckPoints[nextCheckPoint].Pos.x, Config.CheckPoints[nextCheckPoint].Pos.y, Config.CheckPoints[nextCheckPoint].Pos.z) + SetBlipRoute(CurrentBlip, 1) - LastCheckPoint = CurrentCheckPoint + LastCheckPoint = CurrentCheckPoint - end + end - local distance = GetDistanceBetweenCoords(coords, Config.CheckPoints[nextCheckPoint].Pos.x, Config.CheckPoints[nextCheckPoint].Pos.y, Config.CheckPoints[nextCheckPoint].Pos.z, true) + local distance = GetDistanceBetweenCoords(coords, Config.CheckPoints[nextCheckPoint].Pos.x, Config.CheckPoints[nextCheckPoint].Pos.y, Config.CheckPoints[nextCheckPoint].Pos.z, true) - if distance <= 100.0 then - DrawMarker(1, Config.CheckPoints[nextCheckPoint].Pos.x, Config.CheckPoints[nextCheckPoint].Pos.y, Config.CheckPoints[nextCheckPoint].Pos.z, 0.0, 0.0, 0.0, 0, 0.0, 0.0, 1.5, 1.5, 1.5, 102, 204, 102, 100, false, true, 2, false, false, false, false) - end + if distance <= 100.0 then + DrawMarker(1, Config.CheckPoints[nextCheckPoint].Pos.x, Config.CheckPoints[nextCheckPoint].Pos.y, Config.CheckPoints[nextCheckPoint].Pos.z, 0.0, 0.0, 0.0, 0, 0.0, 0.0, 1.5, 1.5, 1.5, 102, 204, 102, 100, false, true, 2, false, false, false, false) + end - if distance <= 3.0 then - Config.CheckPoints[nextCheckPoint].Action(playerPed, CurrentVehicle, SetCurrentZoneType) - CurrentCheckPoint = CurrentCheckPoint + 1 - end + if distance <= 3.0 then + Config.CheckPoints[nextCheckPoint].Action(playerPed, CurrentVehicle, SetCurrentZoneType) + CurrentCheckPoint = CurrentCheckPoint + 1 + end - end + end - end + end - end + end end) -- Speed / Damage control Citizen.CreateThread(function() - while true do + while true do - Citizen.Wait(0) + Citizen.Wait(0) - if CurrentTest == 'drive' then + if CurrentTest == 'drive' then - local playerPed = GetPlayerPed(-1) + local playerPed = GetPlayerPed(-1) - if IsPedInAnyVehicle(playerPed, false) then + if IsPedInAnyVehicle(playerPed, false) then - local vehicle = GetVehiclePedIsIn(playerPed, false) - local speed = GetEntitySpeed(vehicle) * Config.SpeedMultiplier - local tooMuchSpeed = false + local vehicle = GetVehiclePedIsIn(playerPed, false) + local speed = GetEntitySpeed(vehicle) * Config.SpeedMultiplier + local tooMuchSpeed = false - for k,v in pairs(Config.SpeedLimits) do - if CurrentZoneType == k and speed > v then + for k,v in pairs(Config.SpeedLimits) do + if CurrentZoneType == k and speed > v then - tooMuchSpeed = true + tooMuchSpeed = true - if not IsAboveSpeedLimit then + if not IsAboveSpeedLimit then - DriveErrors = DriveErrors + 1 - IsAboveSpeedLimit = true + DriveErrors = DriveErrors + 1 + IsAboveSpeedLimit = true - ESX.ShowNotification('Vous roulez trop vite, vitesse limite : ~y~' .. v .. 'km/h') - ESX.ShowNotification('Erreurs : ~r~' .. DriveErrors .. '~s~/' .. Config.MaxErrors) + ESX.ShowNotification(_U('driving_too_fast') .. v .. 'km/h') + ESX.ShowNotification(_U('errors') .. DriveErrors .. '~s~/' .. Config.MaxErrors) - end + end - end - end + end + end - if not tooMuchSpeed then - IsAboveSpeedLimit = false - end + if not tooMuchSpeed then + IsAboveSpeedLimit = false + end - local health = GetEntityHealth(vehicle) + local health = GetEntityHealth(vehicle) - if health < LastVehicleHealth then + if health < LastVehicleHealth then - DriveErrors = DriveErrors + 1 + DriveErrors = DriveErrors + 1 - ESX.ShowNotification('Vous avez endommagé votre véhicule') - ESX.ShowNotification('Erreurs : ~r~' .. DriveErrors .. '~s~/' .. Config.MaxErrors) - - LastVehicleHealth = health + ESX.ShowNotification(_U('you_damaged_veh')) + ESX.ShowNotification(_U('errors') .. DriveErrors .. '~s~/' .. Config.MaxErrors) + LastVehicleHealth = health - end + end - end + end - end + end - end + end -end) \ No newline at end of file +end) diff --git a/config.lua b/config.lua index 7e864ca6..aa8eed1a 100644 --- a/config.lua +++ b/config.lua @@ -2,186 +2,187 @@ Config = {} Config.DrawDistance = 100.0 Config.MaxErrors = 5 Config.SpeedMultiplier = 3.6 +Config.Locale = 'fr' Config.Prices = { - dmv = 200, - drive = 500, - drive_bike = 500, - drive_truck = 500 + dmv = 200, + drive = 500, + drive_bike = 500, + drive_truck = 500 } Config.VehicleModels = { - drive = 'blista', - drive_bike = 'sanchez', - drive_truck = 'mule3' + drive = 'blista', + drive_bike = 'sanchez', + drive_truck = 'mule3' } Config.SpeedLimits = { - residence = 50, - town = 80, - freeway = 120 + residence = 50, + town = 80, + freeway = 120 } Config.Zones = { - DMVSchool = { - Pos = {x = 239.471, y = -1380.960, z = 32.741}, - Size = {x = 1.5, y = 1.5, z = 1.0}, - Color = {r = 204, g = 204, b = 0}, - Type = 1 - }, + DMVSchool = { + Pos = {x = 239.471, y = -1380.960, z = 32.741}, + Size = {x = 1.5, y = 1.5, z = 1.0}, + Color = {r = 204, g = 204, b = 0}, + Type = 1 + }, - VehicleSpawnPoint = { - Pos = {x = 249.409, y = -1407.230, z = 30.4094}, - Size = {x = 1.5, y = 1.5, z = 1.0}, - Color = {r = 204, g = 204, b = 0}, - Type = -1 - }, + VehicleSpawnPoint = { + Pos = {x = 249.409, y = -1407.230, z = 30.4094}, + Size = {x = 1.5, y = 1.5, z = 1.0}, + Color = {r = 204, g = 204, b = 0}, + Type = -1 + }, } Config.CheckPoints = { - { - Pos = {x = 255.139, y = -1400.731, z = 29.537}, - Action = function(playerPed, vehicle, setCurrentZoneType) - DrawMissionText('Allez vers le prochain passage ! Vitesse limite : ~y~' .. Config.SpeedLimits['residence'] .. 'km/h', 5000) - end - }, - - { - Pos = {x = 271.874, y = -1370.574, z = 30.932}, - Action = function(playerPed, vehicle, setCurrentZoneType) - DrawMissionText('Allez vers le prochain passage !', 5000) - end - }, + { + Pos = {x = 255.139, y = -1400.731, z = 29.537}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText(_U('next_point_speed') .. Config.SpeedLimits['residence'] .. 'km/h', 5000) + end + }, { - Pos = {x = 234.907, y = -1345.385, z = 29.542}, - Action = function(playerPed, vehicle, setCurrentZoneType) - Citizen.CreateThread(function() - DrawMissionText('Faite rapidement un ~r~stop~s~ pour le piéton qui ~y~traverse', 5000) - PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) - FreezeEntityPosition(vehicle, true) - Citizen.Wait(4000) - FreezeEntityPosition(vehicle, false) - DrawMissionText('~g~Bien!~s~ continuons!', 5000) - - end) - end - }, + Pos = {x = 271.874, y = -1370.574, z = 30.932}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText(_U('go_next_point'), 5000) + end + }, { - Pos = {x = 217.821, y = -1410.520, z = 28.292}, - Action = function(playerPed, vehicle, setCurrentZoneType) + Pos = {x = 234.907, y = -1345.385, z = 29.542}, + Action = function(playerPed, vehicle, setCurrentZoneType) + Citizen.CreateThread(function() + DrawMissionText(_U('stop_for_ped'), 5000) + PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) + FreezeEntityPosition(vehicle, true) + Citizen.Wait(4000) + FreezeEntityPosition(vehicle, false) + DrawMissionText(_U('good_lets_cont'), 5000) - setCurrentZoneType('town') - - Citizen.CreateThread(function() - DrawMissionText('Marquer rapidement un ~r~stop~s~ et regardez à votre ~y~gauche~s~. Vitesse limite : ~y~' .. Config.SpeedLimits['town'] .. 'km/h', 5000) - PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) - FreezeEntityPosition(vehicle, true) - Citizen.Wait(6000) - FreezeEntityPosition(vehicle, false) - DrawMissionText('~g~bien!~s~ prenez à ~y~droite~s~ et suivez votre file', 5000) - end) - end - }, + end) + end + }, { - Pos = {x = 178.550, y = -1401.755, z = 27.725}, - Action = function(playerPed, vehicle, setCurrentZoneType) - DrawMissionText('Observez le traffic ~y~allumez vos feux~s~ !', 5000) - end - }, + Pos = {x = 217.821, y = -1410.520, z = 28.292}, + Action = function(playerPed, vehicle, setCurrentZoneType) + + setCurrentZoneType('town') + + Citizen.CreateThread(function() + DrawMissionText(_U('stop_look_left') .. Config.SpeedLimits['town'] .. 'km/h', 5000) + PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) + FreezeEntityPosition(vehicle, true) + Citizen.Wait(6000) + FreezeEntityPosition(vehicle, false) + DrawMissionText(_U('good_turn_right'), 5000) + end) + end + }, { - Pos = {x = 113.160, y = -1365.276, z = 27.725}, - Action = function(playerPed, vehicle, setCurrentZoneType) - DrawMissionText('Allez vers le prochain passage !', 5000) - end - }, + Pos = {x = 178.550, y = -1401.755, z = 27.725}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText(_U('watch_traffic_lightson'), 5000) + end + }, { - Pos = {x = -73.542, y = -1364.335, z = 27.789}, - Action = function(playerPed, vehicle, setCurrentZoneType) - DrawMissionText('Marquez le stop pour laisser passer les véhicules !', 5000) - PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) - FreezeEntityPosition(vehicle, true) - Citizen.Wait(6000) - FreezeEntityPosition(vehicle, false) - end - }, + Pos = {x = 113.160, y = -1365.276, z = 27.725}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText(_U('go_next_point'), 5000) + end + }, { - Pos = {x = -355.143, y = -1420.282, z = 27.868}, - Action = function(playerPed, vehicle, setCurrentZoneType) - DrawMissionText('Allez vers le prochain passage !', 5000) - end - }, + Pos = {x = -73.542, y = -1364.335, z = 27.789}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText(_U('stop_for_passing'), 5000) + PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) + FreezeEntityPosition(vehicle, true) + Citizen.Wait(6000) + FreezeEntityPosition(vehicle, false) + end + }, { - Pos = {x = -439.148, y = -1417.100, z = 27.704}, - Action = function(playerPed, vehicle, setCurrentZoneType) - DrawMissionText('Allez vers le prochain passage !', 5000) - end - }, + Pos = {x = -355.143, y = -1420.282, z = 27.868}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText(_U('go_next_point'), 5000) + end + }, { - Pos = {x = -453.790, y = -1444.726, z = 27.665}, - Action = function(playerPed, vehicle, setCurrentZoneType) - - setCurrentZoneType('freeway') - - DrawMissionText('Il est temps d\'aller sur la rocade ! Vitesse limite : ~y~' .. Config.SpeedLimits['freeway'] .. 'km/h', 5000) - PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) - end - }, + Pos = {x = -439.148, y = -1417.100, z = 27.704}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText(_U('go_next_point'), 5000) + end + }, { - Pos = {x = -463.237, y = -1592.178, z = 37.519}, - Action = function(playerPed, vehicle, setCurrentZoneType) - DrawMissionText('Allez vers le prochain passage !', 5000) - end - }, + Pos = {x = -453.790, y = -1444.726, z = 27.665}, + Action = function(playerPed, vehicle, setCurrentZoneType) + + setCurrentZoneType('freeway') + + DrawMissionText(_U('hway_time') .. Config.SpeedLimits['freeway'] .. 'km/h', 5000) + PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) + end + }, { - Pos = {x = -900.647, y = -1986.28, z = 26.109}, - Action = function(playerPed, vehicle, setCurrentZoneType) - DrawMissionText('Allez vers le prochain passage !', 5000) - end - }, + Pos = {x = -463.237, y = -1592.178, z = 37.519}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText(_U('go_next_point'), 5000) + end + }, { - Pos = {x = 1225.759, y = -1948.792, z = 38.718}, - Action = function(playerPed, vehicle, setCurrentZoneType) - DrawMissionText('Allez vers le prochain passage !', 5000) - end - }, + Pos = {x = -900.647, y = -1986.28, z = 26.109}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText(_U('go_next_point'), 5000) + end + }, { - Pos = {x = 1225.759, y = -1948.792, z = 38.718}, - Action = function(playerPed, vehicle, setCurrentZoneType) - - setCurrentZoneType('town') - - DrawMissionText('Entrée en ville, attention à votre vitesse ! Vitesse limite : ~y~' .. Config.SpeedLimits['town'] .. 'km/h', 5000) - end - }, + Pos = {x = 1225.759, y = -1948.792, z = 38.718}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText(_U('go_next_point'), 5000) + end + }, { - Pos = {x = 1163.603, y = -1841.771, z = 35.679}, - Action = function(playerPed, vehicle, setCurrentZoneType) - DrawMissionText('Bravo, restez vigilant!', 5000) - PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) - end - }, + Pos = {x = 1225.759, y = -1948.792, z = 38.718}, + Action = function(playerPed, vehicle, setCurrentZoneType) + + setCurrentZoneType('town') + + DrawMissionText(_U('in_town_speed') .. Config.SpeedLimits['town'] .. 'km/h', 5000) + end + }, { - Pos = {x = 235.283, y = -1398.329, z = 28.921}, - Action = function(playerPed, vehicle, setCurrentZoneType) - ESX.Game.DeleteVehicle(vehicle) - end - }, - -} \ No newline at end of file + Pos = {x = 1163.603, y = -1841.771, z = 35.679}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText(_U('gratz_stay_alert'), 5000) + PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) + end + }, + + { + Pos = {x = 235.283, y = -1398.329, z = 28.921}, + Action = function(playerPed, vehicle, setCurrentZoneType) + ESX.Game.DeleteVehicle(vehicle) + end + }, + +} diff --git a/html/questions_en.js b/html/questions_en.js new file mode 100644 index 00000000..01e95a07 --- /dev/null +++ b/html/questions_en.js @@ -0,0 +1,71 @@ +var tableauQuestion = [ + { question : "If you're going 65 mph, and you're approaching a residential area you must:", + propositionA : "You accelerate", + propositionB : "You keep your speed, if you do not pass other vehicles", + propositionC : "You slow down", + propositionD : "You keep your speed", + reponse : "C"}, + + { question : "If you're turning right at a traffic light, but see a pedestrian crossing what do you do:", + propositionA : "You pass the pedestrian", + propositionB : "You check that there is no other vehicles around", + propositionC : "You wait until the pedestrian has crossed", + propositionD : "You shoot the pedestrian and continue to drive", + reponse : "C"}, + + { question : "Without any prior indication, the speed in a residential area is: __ mph", + propositionA : "30", + propositionB : "35", + propositionC : "40", + propositionD : "45", + reponse : "A"}, + + { question : "Before every lane change you must:", + propositionA : "Check your mirrors", + propositionB : "Check your blind spots", + propositionC : "Signal your intentions", + propositionD : "All of the above", + reponse : "D"}, + + { question : "What blood alcohol level is classified as driving while intoxicated?", + propositionA : "0.05%", + propositionB : "0.18%", + propositionC : "0.08%", + propositionD : "0.06%", + reponse : "C"}, + + { question : "When can you continue to drive at a traffic light?", + propositionA : "When it is green", + propositionB : "When there is nobody in the intersection", + propositionC : "You are in a school zone", + propositionD : "When it is green and / or red and you're turning right", + reponse : "D"}, + + { question : "A pedestrian has a do not cross signal, what do you do?", + propositionA : "You let them pass", + propositionB : "You observe before continuing", + propositionC : "You wave to tell them to cross", + propositionD : "You continue because your traffic light is green", + reponse : "D"}, + + { question : "What is allowed when passing another vehicle", + propositionA : "You follow it closely to pass it faster", + propositionB : "You pass it without leaving the roadway", + propositionC : "You drive on the opposite side of the road to pass", + propositionD : "You exceed the speed limit to pass them", + reponse : "C"}, + + { question : "You are driving on a highway which indicates a maximum speed of 70 mph. Most traffic drives at 75 mph, so you should not drive faster than:", + propositionA : "50 mph", + propositionB : "25 mph", + propositionC : "30 mph", + propositionD : "70 mph", + reponse : "D"}, + + { question : "When you are overtaken by another vehicle it is important NOT to:", + propositionA : "Slow Down", + propositionB : "Check your mirrors", + propositionC : "Watch other drivers", + propositionD : "Increase your speed", + reponse : "D"}, +] diff --git a/html/scripts.js b/html/scripts.js index 6494266f..234a2a4a 100644 --- a/html/scripts.js +++ b/html/scripts.js @@ -52,7 +52,7 @@ function closeAll() { function openQuestionnaire() { $(".questionnaire-container").css("display", "block"); var randomQuestion = getRandomQuestion(); - $("#questionNumero").html("Question : " + questionNumber); + $("#questionNumero").html("Question: " + questionNumber); $("#question").html(tableauQuestion[randomQuestion].question); $(".answerA").html(tableauQuestion[randomQuestion].propositionA); $(".answerB").html(tableauQuestion[randomQuestion].propositionB); diff --git a/html/ui_en.html b/html/ui_en.html new file mode 100644 index 00000000..e0844ab4 --- /dev/null +++ b/html/ui_en.html @@ -0,0 +1,98 @@ + + + + + + +
+
+ +
+

Driving School

+
+ +
+
+ +

Welcome to Driving School

+
All citizens of Los Santos must pass their exam before they can drive.
Take your time, answer with common sense, and do not answer randomly.

+ Theory Test
+ - The Theory Test costs $200, this is not refunded if you fail the test.
+ - Don't be afraid, the driving school accepts credit, but be careful not to get into debt.
+ - If you fail your test the first time, you can't retake it immediately, you'll have to take it at a later date.

+ Driving Test
+ - The Driving Test costs $500, just like the theory test, this payment will not be refunded if you fail.
+ - Make sure you stay alert whilst driving, and avoid accidents!

+
+
+ Start +
+
+

Progress

+ +
+
+ +
+
+

+

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+

Progress

+ +
+
+ +
+
+

Good work!



You did well during the examination.

You can close this window, and go take your road test(s).
+
+
+ Close +
+
+

Progress

+ +
+
+
+
+

You failed



You weren't ready for this test, try again later...

+
+
+ Close +
+
+

Progress

+ +
+
+
+
+ + + + + + + diff --git a/locales/en.lua b/locales/en.lua new file mode 100644 index 00000000..646f8839 --- /dev/null +++ b/locales/en.lua @@ -0,0 +1,29 @@ +Locales['en'] = { + + ['you_paid'] = 'you paid ~g~$', + ['go_next_point'] = 'go to the next point!', + ['in_town_speed'] = 'entered town, pay attention to your speed! Speed Limit: ~y~', + ['next_point_speed'] = 'go to the next point! Speed Limit: ~y~', + ['stop_for_ped'] = '~r~Stop~s~ for the pedestrian ~y~crossing', + ['good_lets_cont'] = '~g~Good~s~, continue.', + ['stop_look_left'] = '~r~Stop~s~ and look ~y~left~s~. Speed Limit:~y~ ', + ['good_turn_right'] = '~g~Good~s~, turn right and follow the line', + ['watch_traffic_lightson'] = 'watch traffic, and ~y~turn on your lights~s~!', + ['stop_for_passing'] = '~r~Stop~s~ for passing vehicles!', + ['hway_time'] = 'it\'s time to drive on the highway! Speed Limit:~y~ ', + ['gratz_stay_alert'] = 'congrats, stay ~r~alert~s~ whilst driving!', + ['passed_test'] = 'you ~g~passed~s~ the test', + ['failed_test'] = 'you ~r~failed~s~ the test', + ['theory_test'] = 'theoretical Driving Test $', + ['road_test_car'] = 'driving Test $', + ['road_test_bike'] = 'motorcycle Skills Test $', + ['road_test_truck'] = 'cDL Skills Test $', + ['driving_school'] = 'driving School', + ['press_open_menu'] = 'press ~INPUT_CONTEXT~ to open the menu', + ['driving_school_blip'] = 'driving School', + ['driving_test_complete'] = 'driving test completed', + ['driving_too_fast'] = '~r~You\'re driving too fast!~s~ Speed Limit:~y~ ', + ['errors'] = 'errors: ~r~', + ['you_damaged_veh'] = 'you damaged the vehicle', + +} diff --git a/locales/fr.lua b/locales/fr.lua new file mode 100644 index 00000000..c0d75435 --- /dev/null +++ b/locales/fr.lua @@ -0,0 +1,29 @@ +Locales['fr'] = { + + ['you_paid'] = 'vous avez payé ~g~$', + ['go_next_point'] = 'allez vers le prochain passage !', + ['in_town_speed'] = 'entrée en ville, attention à votre vitesse ! Vitesse limite : ~y~', + ['next_point_speed'] = 'allez vers le prochain passage ! Vitesse limite : ~y~', + ['stop_for_ped'] = 'faite rapidement un ~r~stop~s~ pour le piéton qui ~y~traverse', + ['good_lets_cont'] = '~g~Bien!~s~ continuons!', + ['stop_look_left'] = 'marquer rapidement un ~r~stop~s~ et regardez à votre ~y~gauche~s~. Vitesse limite : ~y~', + ['good_turn_right'] = '~g~Bien!~s~ prenez à ~y~droite~s~ et suivez votre file', + ['watch_traffic_lightson'] = 'observez le traffic ~y~allumez vos feux~s~ !', + ['stop_for_passing'] = 'marquez le stop pour laisser passer les véhicules !', + ['hway_time'] = 'il est temps d\'aller sur la rocade ! Vitesse limite : ~y~', + ['gratz_stay_alert'] = 'bravo, restez vigiliant!', + ['passed_test'] = 'vous avez ~g~réussi~s~ le test', + ['failed_test'] = 'vous avez ~r~raté~s~ le test', + ['theory_test'] = 'examen du code $', + ['road_test_car'] = 'examen de conduite [voiture] $', + ['road_test_bike'] = 'examen de conduite [moto] $', + ['road_test_truck'] = 'examen de conduite [camion] $', + ['driving_school'] = 'ecole de conduite', + ['press_open_menu'] = 'appuyez sur ~INPUT_CONTEXT~ pour ouvrir le menu', + ['driving_school_blip'] = 'auto-école', + ['driving_test_complete'] = 'test de conduite terminé', + ['driving_too_fast'] = 'vous roulez trop vite, vitesse limite : ~y~', + ['errors'] = 'erreurs : ~r~', + ['you_damaged_veh'] = 'vous avez endommagé votre véhicule', + +} diff --git a/localization/en_esx_dmvschool.sql b/localization/en_esx_dmvschool.sql new file mode 100644 index 00000000..db2034e9 --- /dev/null +++ b/localization/en_esx_dmvschool.sql @@ -0,0 +1,8 @@ +USE `essentialmode`; + +INSERT INTO `licenses` (`type`, `label`) VALUES + ('dmv', 'Driving Permit'), + ('drive', 'Drivers License'), + ('drive_bike', 'Motorcycle License'), + ('drive_truck', 'Commercial Drivers License') +; diff --git a/server/main.lua b/server/main.lua index d81d4daa..2906c7d7 100644 --- a/server/main.lua +++ b/server/main.lua @@ -3,32 +3,32 @@ ESX = nil TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) AddEventHandler('esx:playerLoaded', function(source) - TriggerEvent('esx_license:getLicenses', source, function(licenses) - TriggerClientEvent('esx_dmvschool:loadLicenses', source, licenses) - end) + TriggerEvent('esx_license:getLicenses', source, function(licenses) + TriggerClientEvent('esx_dmvschool:loadLicenses', source, licenses) + end) end) RegisterNetEvent('esx_dmvschool:addLicense') AddEventHandler('esx_dmvschool:addLicense', function(type) - local _source = source + local _source = source - TriggerEvent('esx_license:addLicense', _source, type, function() - TriggerEvent('esx_license:getLicenses', _source, function(licenses) - TriggerClientEvent('esx_dmvschool:loadLicenses', _source, licenses) - end) - end) + TriggerEvent('esx_license:addLicense', _source, type, function() + TriggerEvent('esx_license:getLicenses', _source, function(licenses) + TriggerClientEvent('esx_dmvschool:loadLicenses', _source, licenses) + end) + end) end) RegisterNetEvent('esx_dmvschool:pay') AddEventHandler('esx_dmvschool:pay', function(price) - local _source = source - local xPlayer = ESX.GetPlayerFromId(_source) + local _source = source + local xPlayer = ESX.GetPlayerFromId(_source) - xPlayer.removeMoney(price) + xPlayer.removeMoney(price) - TriggerClientEvent('esx:showNotification', _source, 'Vous avez payé ~g~$' .. price) + TriggerClientEvent('esx:showNotification', _source, _U('you_paid') .. price) end) From b5ae1318e665b673976b28b2404bb843f69967df Mon Sep 17 00:00:00 2001 From: Romain Lanz Date: Sat, 14 Oct 2017 15:54:38 +0200 Subject: [PATCH 04/36] chore(js): clean while loop --- html/scripts.js | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/html/scripts.js b/html/scripts.js index 234a2a4a..6b56f4e4 100644 --- a/html/scripts.js +++ b/html/scripts.js @@ -14,29 +14,21 @@ var nbQuestionToAnswer = 10; // don't forget to change the progress bar max valu var nbAnswerNeeded = 1; // out of nbQuestionToAnswer var nbPossibleQuestions = 10; //number of questions in database questions.js var lastClick = 0; -/* -var nbQuestionToAnswer = 10; // don't forget to change the progress bar max value in html -var nbAnswerNeeded = 8; // out of nbQuestionToAnswer -var nbPossibleQuestions = 15; //number of questions in database questions.js -*/ function getRandomQuestion() { - var continuer = true; - var random; - while (continuer){ - continuer=false; // do not continue loop - random = Math.floor(Math.random() * nbPossibleQuestions) ; // number of possible questions - if(questionNumber==1){ - return random; - } - for(i=0; i Date: Sat, 14 Oct 2017 15:55:13 +0200 Subject: [PATCH 05/36] chore: bump version --- __resource.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__resource.lua b/__resource.lua index 06cb9fea..d221dfd4 100644 --- a/__resource.lua +++ b/__resource.lua @@ -2,7 +2,7 @@ resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' description 'ESX DMV School' -version '1.0.2' +version '1.0.3' server_scripts { '@es_extended/locale.lua', From e8a0f07296b22f358a4b4ad9b195ba149e70eae9 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Mon, 9 Apr 2018 12:56:27 +0200 Subject: [PATCH 06/36] Improved string formatting, minor edits --- client/main.lua | 29 ++++++++++++++--------------- locales/en.lua | 22 +++++++++++----------- locales/fr.lua | 14 +++++++------- localization/sv_esx_dmvschool.sql | 8 ++++++++ server/main.lua | 31 +++++++++++++------------------ 5 files changed, 53 insertions(+), 51 deletions(-) create mode 100644 localization/sv_esx_dmvschool.sql diff --git a/client/main.lua b/client/main.lua index e2ee0cf9..934923e7 100644 --- a/client/main.lua +++ b/client/main.lua @@ -125,21 +125,21 @@ function OpenDMVSchoolMenu() local elements = {} if not ownedLicenses['dmv'] then - table.insert(elements, {label = _U('theory_test') .. Config.Prices['dmv'], value = 'theory_test'}) + table.insert(elements, {label = _U('theory_test') .. ' $' .. Config.Prices['dmv'] .. '', value = 'theory_test'}) end if ownedLicenses['dmv'] then if not ownedLicenses['drive'] then - table.insert(elements, {label = _U('road_test_car') .. Config.Prices['drive'], value = 'drive_test', type = 'drive'}) + table.insert(elements, {label = _U('road_test_car') .. ' $' .. Config.Prices['drive'] .. '', value = 'drive_test', type = 'drive'}) end if not ownedLicenses['drive_bike'] then - table.insert(elements, {label = _U('road_test_bike') .. Config.Prices['drive_bike'], value = 'drive_test', type = 'drive_bike'}) + table.insert(elements, {label = _U('road_test_bike') .. ' $' .. Config.Prices['drive_bike'] .. '', value = 'drive_test', type = 'drive_bike'}) end if not ownedLicenses['drive_truck'] then - table.insert(elements, {label = _U('road_test_truck') .. Config.Prices['drive_truck'], value = 'drive_test', type = 'drive_truck'}) + table.insert(elements, {label = _U('road_test_truck') .. ' $' .. Config.Prices['drive_truck'] .. '', value = 'drive_test', type = 'drive_truck'}) end end @@ -239,7 +239,7 @@ end) Citizen.CreateThread(function() while true do - Citizen.Wait(0) + Citizen.Wait(10) local coords = GetEntityCoords(GetPlayerPed(-1)) @@ -256,7 +256,7 @@ end) Citizen.CreateThread(function() while true do - Citizen.Wait(0) + Citizen.Wait(10) local coords = GetEntityCoords(GetPlayerPed(-1)) local isInMarker = false @@ -287,7 +287,7 @@ end) Citizen.CreateThread(function() while true do - Citizen.Wait(0) + Citizen.Wait(10) if CurrentTest == 'theory' then @@ -308,7 +308,7 @@ end) Citizen.CreateThread(function() while true do - Citizen.Wait(0) + Citizen.Wait(10) if CurrentAction ~= nil then @@ -335,7 +335,7 @@ end) Citizen.CreateThread(function() while true do - Citizen.Wait(0) + Citizen.Wait(10) if CurrentTest == 'drive' then @@ -394,7 +394,7 @@ end) Citizen.CreateThread(function() while true do - Citizen.Wait(0) + Citizen.Wait(10) if CurrentTest == 'drive' then @@ -416,8 +416,8 @@ Citizen.CreateThread(function() DriveErrors = DriveErrors + 1 IsAboveSpeedLimit = true - ESX.ShowNotification(_U('driving_too_fast') .. v .. 'km/h') - ESX.ShowNotification(_U('errors') .. DriveErrors .. '~s~/' .. Config.MaxErrors) + ESX.ShowNotification(_U('driving_too_fast', v)) + ESX.ShowNotification(_U('errors', DriveErrors, Config.MaxErrors)) end @@ -435,9 +435,8 @@ Citizen.CreateThread(function() DriveErrors = DriveErrors + 1 ESX.ShowNotification(_U('you_damaged_veh')) - ESX.ShowNotification(_U('errors') .. DriveErrors .. '~s~/' .. Config.MaxErrors) - LastVehicleHealth = health - + ESX.ShowNotification(_U('errors', DriveErrors, Config.MaxErrors)) + LastVehicleHealth = health end end diff --git a/locales/en.lua b/locales/en.lua index 646f8839..7a22e717 100644 --- a/locales/en.lua +++ b/locales/en.lua @@ -1,6 +1,6 @@ Locales['en'] = { - ['you_paid'] = 'you paid ~g~$', + ['you_paid'] = 'you paid ~g~$%s~s~ to the DMV school', ['go_next_point'] = 'go to the next point!', ['in_town_speed'] = 'entered town, pay attention to your speed! Speed Limit: ~y~', ['next_point_speed'] = 'go to the next point! Speed Limit: ~y~', @@ -8,22 +8,22 @@ Locales['en'] = { ['good_lets_cont'] = '~g~Good~s~, continue.', ['stop_look_left'] = '~r~Stop~s~ and look ~y~left~s~. Speed Limit:~y~ ', ['good_turn_right'] = '~g~Good~s~, turn right and follow the line', - ['watch_traffic_lightson'] = 'watch traffic, and ~y~turn on your lights~s~!', + ['watch_traffic_lightson'] = 'watch the traffic and ~y~turn on your lights~s~!', ['stop_for_passing'] = '~r~Stop~s~ for passing vehicles!', ['hway_time'] = 'it\'s time to drive on the highway! Speed Limit:~y~ ', - ['gratz_stay_alert'] = 'congrats, stay ~r~alert~s~ whilst driving!', - ['passed_test'] = 'you ~g~passed~s~ the test', - ['failed_test'] = 'you ~r~failed~s~ the test', - ['theory_test'] = 'theoretical Driving Test $', - ['road_test_car'] = 'driving Test $', - ['road_test_bike'] = 'motorcycle Skills Test $', - ['road_test_truck'] = 'cDL Skills Test $', + ['gratz_stay_alert'] = 'i\'m impressed, but don\'t forget to stay ~r~alert~s~ whilst driving!', + ['passed_test'] = 'you ~g~passed~s~ the test, congratulations!', + ['failed_test'] = 'you ~r~failed~s~ the test, better luck next time!', + ['theory_test'] = 'theoretical Driving Test', + ['road_test_car'] = 'driving Test', + ['road_test_bike'] = 'motorcycle Skills Test', + ['road_test_truck'] = 'truck Skills Test', ['driving_school'] = 'driving School', ['press_open_menu'] = 'press ~INPUT_CONTEXT~ to open the menu', ['driving_school_blip'] = 'driving School', ['driving_test_complete'] = 'driving test completed', - ['driving_too_fast'] = '~r~You\'re driving too fast!~s~ Speed Limit:~y~ ', - ['errors'] = 'errors: ~r~', + ['driving_too_fast'] = '~r~You\'re driving too fast,~s~ the current speed limit is: ~y~%s~s~ km/h!', + ['errors'] = 'mistakes: ~r~%s~s~/%s', ['you_damaged_veh'] = 'you damaged the vehicle', } diff --git a/locales/fr.lua b/locales/fr.lua index c0d75435..6c34d87e 100644 --- a/locales/fr.lua +++ b/locales/fr.lua @@ -1,6 +1,6 @@ Locales['fr'] = { - ['you_paid'] = 'vous avez payé ~g~$', + ['you_paid'] = 'vous avez payé ~g~$%s~s~', ['go_next_point'] = 'allez vers le prochain passage !', ['in_town_speed'] = 'entrée en ville, attention à votre vitesse ! Vitesse limite : ~y~', ['next_point_speed'] = 'allez vers le prochain passage ! Vitesse limite : ~y~', @@ -14,16 +14,16 @@ Locales['fr'] = { ['gratz_stay_alert'] = 'bravo, restez vigiliant!', ['passed_test'] = 'vous avez ~g~réussi~s~ le test', ['failed_test'] = 'vous avez ~r~raté~s~ le test', - ['theory_test'] = 'examen du code $', - ['road_test_car'] = 'examen de conduite [voiture] $', - ['road_test_bike'] = 'examen de conduite [moto] $', - ['road_test_truck'] = 'examen de conduite [camion] $', + ['theory_test'] = 'examen du code', + ['road_test_car'] = 'examen de conduite [voiture]', + ['road_test_bike'] = 'examen de conduite [moto]', + ['road_test_truck'] = 'examen de conduite [camion]', ['driving_school'] = 'ecole de conduite', ['press_open_menu'] = 'appuyez sur ~INPUT_CONTEXT~ pour ouvrir le menu', ['driving_school_blip'] = 'auto-école', ['driving_test_complete'] = 'test de conduite terminé', - ['driving_too_fast'] = 'vous roulez trop vite, vitesse limite : ~y~', - ['errors'] = 'erreurs : ~r~', + ['driving_too_fast'] = 'vous roulez trop vite, vitesse limite: ~y~%s~s~ km/h!', + ['errors'] = 'erreurs : ~r~%s~s~/%s', ['you_damaged_veh'] = 'vous avez endommagé votre véhicule', } diff --git a/localization/sv_esx_dmvschool.sql b/localization/sv_esx_dmvschool.sql new file mode 100644 index 00000000..becaf0ff --- /dev/null +++ b/localization/sv_esx_dmvschool.sql @@ -0,0 +1,8 @@ +USE `essentialmode`; + +INSERT INTO `licenses` (`type`, `label`) VALUES + ('dmv', 'Körkortstillstånd'), + ('drive', 'B-körkort'), + ('drive_bike', 'A-körkort'), + ('drive_truck', 'C-körkort') +; diff --git a/server/main.lua b/server/main.lua index 2906c7d7..dd364795 100644 --- a/server/main.lua +++ b/server/main.lua @@ -3,32 +3,27 @@ ESX = nil TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) AddEventHandler('esx:playerLoaded', function(source) - TriggerEvent('esx_license:getLicenses', source, function(licenses) - TriggerClientEvent('esx_dmvschool:loadLicenses', source, licenses) - end) + TriggerEvent('esx_license:getLicenses', source, function(licenses) + TriggerClientEvent('esx_dmvschool:loadLicenses', source, licenses) + end) end) RegisterNetEvent('esx_dmvschool:addLicense') AddEventHandler('esx_dmvschool:addLicense', function(type) + local _source = source - local _source = source - - TriggerEvent('esx_license:addLicense', _source, type, function() - TriggerEvent('esx_license:getLicenses', _source, function(licenses) - TriggerClientEvent('esx_dmvschool:loadLicenses', _source, licenses) - end) - end) - + TriggerEvent('esx_license:addLicense', _source, type, function() + TriggerEvent('esx_license:getLicenses', _source, function(licenses) + TriggerClientEvent('esx_dmvschool:loadLicenses', _source, licenses) + end) + end) end) RegisterNetEvent('esx_dmvschool:pay') AddEventHandler('esx_dmvschool:pay', function(price) + local _source = source + local xPlayer = ESX.GetPlayerFromId(_source) - local _source = source - local xPlayer = ESX.GetPlayerFromId(_source) - - xPlayer.removeMoney(price) - - TriggerClientEvent('esx:showNotification', _source, _U('you_paid') .. price) - + xPlayer.removeMoney(price) + TriggerClientEvent('esx:showNotification', _source, _U('you_paid', price)) end) From d3025b18c70b51512fdd027689bb9ff4aa43dc6c Mon Sep 17 00:00:00 2001 From: renildomarcio Date: Mon, 9 Apr 2018 15:43:18 -0300 Subject: [PATCH 07/36] Create br.lua --- locales/br.lua | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 locales/br.lua diff --git a/locales/br.lua b/locales/br.lua new file mode 100644 index 00000000..4358a08b --- /dev/null +++ b/locales/br.lua @@ -0,0 +1,29 @@ +Locales['br'] = { + + ['you_paid'] = 'você pagou ~g~$%s~s~ para a auto escola', + ['go_next_point'] = 'vá para o próximo ponto!', + ['in_town_speed'] = 'entrou na cidade, preste atenção à sua velocidade! Limite de velocidade: ~y~', + ['next_point_speed'] = 'vá para o próximo ponto! Limite de velocidade: ~y~', + ['stop_for_ped'] = '~r~Pare~s~ para o pedestre atravessar o ~y~cruzando', + ['good_lets_cont'] = '~g~Boa~s~, vamos continuar.', + ['stop_look_left'] = '~r~Pare~s~ and look ~y~left~s~. Speed Limit:~y~ ', + ['good_turn_right'] = '~g~Boa~s~, vire à direita e siga a em frente', + ['watch_traffic_lightson'] = 'observe o trânsito e ~y~acenda suas luzes~s~!', + ['stop_for_passing'] = '~r~Pare~s~ olher para um lado e para o outro e veja ser não tem veículos passando!', + ['hway_time'] = 'é hora de dirigir na auto-estrada! Limite de velocidade:~y~ ', + ['gratz_stay_alert'] = 'Estou impressionado, mas não se esqueça de ficar ~r~alerta~s~ enquanto dirigindo!', + ['passed_test'] = 'você ~g~passou~s~ no teste, parabéns!', + ['failed_test'] = 'você ~r~falhou~s~ no teste, melhor sorte da próxima vez!', + ['theory_test'] = 'teste teórico de condução', + ['road_test_car'] = 'teste de habilidades de condução', + ['road_test_bike'] = 'teste de habilidades da motocicleta', + ['road_test_truck'] = 'teste de habilidades de caminhão', + ['driving_school'] = 'escola de condução', + ['press_open_menu'] = 'pressione ~INPUT_CONTEXT~ para abrir o menu', + ['driving_school_blip'] = 'escola de condução', + ['driving_test_complete'] = 'teste de condução concluído', + ['driving_too_fast'] = '~r~Você está dirigindo rápido demais~s~ o limite de velocidade atual é: ~y~%s~s~ km/h!', + ['errors'] = 'erros: ~r~%s~s~/%s', + ['you_damaged_veh'] = 'você danificou o veículo', + +} From e6475a038336a60fdad6b99137156fa597c2a329 Mon Sep 17 00:00:00 2001 From: AdrineX Date: Wed, 13 Jun 2018 00:04:30 +0300 Subject: [PATCH 08/36] Add Finnish lang... --- __resource.lua | 2 + html/questions_fi.js | 71 ++++++++++++++++++++++ html/ui_fi.html | 98 +++++++++++++++++++++++++++++++ locales/fi.lua | 29 +++++++++ localization/fi_esx_dmvschool.sql | 8 +++ 5 files changed, 208 insertions(+) create mode 100644 html/questions_fi.js create mode 100644 html/ui_fi.html create mode 100644 locales/fi.lua create mode 100644 localization/fi_esx_dmvschool.sql diff --git a/__resource.lua b/__resource.lua index d221dfd4..899f6147 100644 --- a/__resource.lua +++ b/__resource.lua @@ -6,6 +6,7 @@ version '1.0.3' server_scripts { '@es_extended/locale.lua', + 'locales/fi.lua', 'locales/fr.lua', 'locales/en.lua', 'config.lua', @@ -14,6 +15,7 @@ server_scripts { client_scripts { '@es_extended/locale.lua', + 'locales/fi.lua', 'locales/fr.lua', 'locales/en.lua', 'config.lua', diff --git a/html/questions_fi.js b/html/questions_fi.js new file mode 100644 index 00000000..eda062cd --- /dev/null +++ b/html/questions_fi.js @@ -0,0 +1,71 @@ +var tableauQuestion = [ + { question : "Jos ajat 80km/h ja vastaan on tulossa asutus alue mitä teet ?", + propositionA : "Painat kaasua että pääset mahollisimman nopeaa pois", + propositionB : "Voit ajaa samaa vauhtia jos alueella ei ole muita autoja", + propositionC : "Sinun pitää hidastaa", + propositionD : "Voit jatkaa samaan malliin", + reponse : "C"}, + + { question : "Kun olet kääntymässä vasemmalle vihreistä valoista, näet jalankulkian jalkakäytävällä. Kummalla on lupa mennä ensin.", + propositionA : "Jalankulkijalla koska he voivat mennä tien yli millä valoilla tahansa", + propositionB : "Sinulla koska valo oli vihreä", + propositionC : "Jalankulkijalla, koska hänellä palaa vihreä valo", + propositionD : "Sinulla koska ajoneuvolla on aina oikeus ensin", + reponse : "C"}, + + { question : "Muualla ilmoittamatta, sallittu nopeus asutusalueella on ____ kmh.", + propositionA : "50", + propositionB : "55", + propositionC : "65", + propositionD : "70", + reponse : "A"}, + + { question : "Ennen jokaista kaistan vaihtoa, sinun pitäisi?", + propositionA : "Katsoa peilit", + propositionB : "Katsoa kuolleet kulmat", + propositionC : "Näyttää vilkuilla mitä aijot tehdä", + propositionD : "Kaikki yllä mainitut", + reponse : "D"}, + + { question : "Minkä veren alkoholipitoisuus luokitellaan päihtyneeksi?", + propositionA : "0.2 promillea", + propositionB : "0.8 promillea", + propositionC : "0.5 promillea", + propositionD : "0.4 promillea", + reponse : "C"}, + + { question : "Sinun on vedettävä sivuun ja pysähtyä, kunnes hälyytysajoneuvo on ajanut ohi sireenit päällä, ellei:", + propositionA : "Sinulla ole kiirre", + propositionB : "Jos hälyytysajoneuvolla on toisella kaistalla tilaa", + propositionC : "Olet koulunalueella", + propositionD : "Olet risteyksessä", + reponse : "D"}, + + { question : "Täytyykö poliisin vilkkuviin valoihin pysähtyä jos ne seuraavat sinua?", + propositionA : "Ei, jos poliisilla ei ole sireenejä päällä", + propositionB : "Kyllä", + propositionC : "Riippuu tilanteesta", + propositionD : "Ei", + reponse : "B"}, + + { question : "Mikä seuraavista on sallittua kun aloitat ohittaan ajoneuvoa?", + propositionA : "Ajaminen lähellä ennen ohitusta", + propositionB : "Koitat ajaa katukivetyksen kautta", + propositionC : "Ajaminen vastakkaisella kaistalla", + propositionD : "Nopeusrajoituksen ylittäminen", + reponse : "A"}, + + { question : "Ajat moottoritiellä, jonka nopeus on 120 km/h. Suurinosa liikenteestä ajaa 130km/h, joten sinun ei pitäisi ajaa nopeampaa kuin", + propositionA : "80 kmh", + propositionB : "40 kmh", + propositionC : "50 kmh", + propositionD : "120 kmh", + reponse : "D"}, + + { question : "Kun sinut ohittaa toinen ajoneuvo, mitä sinun EI pitäisi tehdä?", + propositionA : "Hiljentää", + propositionB : "Tarkistaa peilit", + propositionC : "Katsot toista kuskia", + propositionD : "Kiihdyttää", + reponse : "D"}, +] diff --git a/html/ui_fi.html b/html/ui_fi.html new file mode 100644 index 00000000..a47d4b74 --- /dev/null +++ b/html/ui_fi.html @@ -0,0 +1,98 @@ + + + + + + +
+
+ +
+

Autokoulu

+
+ +
+
+ +

Tervetuloa autokouluun

+
Vaadimme kaikilta kansalaisilta että pääset läpi teoriaoppitestin ennen kuin voit saada voimassa olevan ajokortin.
Varaa aikaa ja vastaa maalaisjärjellä, älä yritä vastata tuurilla.

+ Teoriakoe
+ - Teoriakoe maksaa 200 € ja siitä ei voi saada rahoja takaisin jos epäonnistut
+ - Älä huoli, Autokoulu antaa maksaa luotolla, mutta älä ota liian paljon luottoa
+ - Jos epäonnistut testissä, et voi ottaa sitä heti uudelleen, palaa takaisin toisella kertaa yrittään uudelleen.

+ Inssi
+ - Ajokortti vaihtoehtoja on useita ja hinnat vaihtelee niitten mukaan.
+ - Inssin päätavote on kiinittää huomiota yksityiskohtiin, ympäristöön ja liikenteeseen. Älä myöskään kolaroi!

+
+
+ Aloitus +
+
+

Edistyminen

+ +
+
+ +
+
+

+

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+

Edistyminen

+ +
+
+ +
+
+

Hienoa !



Sinulla meni testi aika hyvin!

Voit sulkea tämän ikkunan nyt ja jatkaa inssikokeeseen.
+
+
+ Sulje +
+
+

Edistyminen

+ +
+
+
+
+

Epäonnistuit



Et ole vielä valmis aloittaa suorittaa mitään ajokorttia, kokeile toisella kertaa.

+
+
+ Sulje +
+
+

Edistyminen

+ +
+
+
+
+ + + + + + + diff --git a/locales/fi.lua b/locales/fi.lua new file mode 100644 index 00000000..4d58dd5f --- /dev/null +++ b/locales/fi.lua @@ -0,0 +1,29 @@ +Locales['fi'] = { + + ['you_paid'] = 'sinä maksoit ~g~$', + ['go_next_point'] = 'mene seuraavaan pisteeseen.', + ['in_town_speed'] = 'saavuit kaupunkiin! Seuraa nopeuttasi Nopeusrajoitus: ~y~', + ['next_point_speed'] = 'mene seuraavaan pisteeseen Nopeusrajoitus: ~y~', + ['stop_for_ped'] = '~r~Pysähdy~s~ katso tietä ~y~ylittäviä ~w~ jalankulikijoita', + ['good_lets_cont'] = '~g~Hyvä~s~, jatkakaa.', + ['stop_look_left'] = '~r~Pysähdy~s~ ja katso ~y~vasemmalle~s~. Nopeusrajoitus:~y~ ', + ['good_turn_right'] = '~g~Hyvä~s~, käänny oikealle ja seuraa kaistaa', + ['watch_traffic_lightson'] = 'seuraa liikennettä, ja ~y~käänny kun valot ovat vihreät~s~!', + ['stop_for_passing'] = '~r~Pysähdy~s~ ohi menevien autojen vuoksi', + ['hway_time'] = 'on aika mennä moottoritielle. Nopeusrajoitus:~y~ ', + ['gratz_stay_alert'] = 'onnitelut, ole ~r~tarkkana~s~ kun ajat!', + ['passed_test'] = 'sinä ~g~läpäisit~s~ kokeen', + ['failed_test'] = 'sinä ~r~epäonnistuit~s~ kokeessa', + ['theory_test'] = 'Teoriakoe $', + ['road_test_car'] = 'Ajokoe $', + ['road_test_bike'] = 'moottoripyörä ajokoe $', + ['road_test_truck'] = 'rekka ajokoe $', + ['driving_school'] = 'Autokoulu', + ['press_open_menu'] = 'paina ~INPUT_CONTEXT~ hankkiaksesi ajokortin', + ['driving_school_blip'] = 'Autokoulu', + ['driving_test_complete'] = 'ajokoe suoritettu', + ['driving_too_fast'] = '~r~Ajat liian nopeeta! Hidasta!~s~ Nopeusrajoitus:~y~ ', + ['errors'] = 'virheet: ~r~', + ['you_damaged_veh'] = 'sinä vahingoitit ajoneuvoa. Aja varovaisemmin...', + +} diff --git a/localization/fi_esx_dmvschool.sql b/localization/fi_esx_dmvschool.sql new file mode 100644 index 00000000..df8d6656 --- /dev/null +++ b/localization/fi_esx_dmvschool.sql @@ -0,0 +1,8 @@ +USE `essentialmode`; + +INSERT INTO `licenses` (`type`, `label`) VALUES + ('dmv', 'Teoriakoe'), + ('drive', 'Autokortti'), + ('drive_bike', 'Moottoripyöräkortti'), + ('drive_truck', 'Rekkakortti') +; From 59bf796e43edc921f8b7f0573f693ac9128f2516 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Sat, 30 Jun 2018 20:48:36 +0200 Subject: [PATCH 09/36] Removed unused cursor --- __resource.lua | 1 - html/badge.png | Bin 96716 -> 0 bytes html/cursor.png | Bin 1255 -> 0 bytes html/scripts.js | 15 +++------------ html/styles.css | 6 ------ html/ui.html | 6 +----- html/ui_en.html | 2 +- 7 files changed, 5 insertions(+), 25 deletions(-) delete mode 100644 html/badge.png delete mode 100644 html/cursor.png diff --git a/__resource.lua b/__resource.lua index 899f6147..b4aa6979 100644 --- a/__resource.lua +++ b/__resource.lua @@ -28,7 +28,6 @@ files { 'html/ui.html', 'html/logo.png', 'html/dmv.png', - 'html/cursor.png', 'html/styles.css', 'html/questions.js', 'html/scripts.js', diff --git a/html/badge.png b/html/badge.png deleted file mode 100644 index 0f3656286944ebf017066734470782553c3ffa4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96716 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 K#HSpwl3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y-fM)1rW~NwKx|o~0IU8CSnK_#o8oC-;7y!e{)Y941*wWd| z)XWg3*Cju>G&eP`1g19yq1O_pUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+d7PnZqx)?b* zIve6N52`l>i(8<2jd1GK2RcR{6tzfE4HE*U9}p9saDg0n(of9;ruQOX!Y z80qQa7*cWT&9wb~hYbXdC0|$4bxKN0cZ!k|(0A)! zlCmp&l{d^)Rj;*D&#JYLulXkVzV_mB$y1lQIRl;VXBj?F{lFoWyveKOBTEsN#>&W5 zf4tfaH?2zb>zL5^>G$j$MX{X@F`)Yud0@brRztxiy!M2yDBYI8oqG zncYSqM;Vq0m-RZ%ch6wRiw}t081+}?ooG~0;9Ci+@3&Q}e%=1C=3cBr`h}G;cPH7- zoxA_kN^Xrcf7lKmmtFAw%pvxW@||mTyhBd)6N=f6i9(tp3#uhQ7&b z1yk7mv(yT`Nj(0(e@3TOnxvV}YL*zovx`I*tSe#t^GbS=nMzgAd556)>KCS%Ka(!; zKcN-ooD_A>I_|P6qsog}tAd$DR)unB@~@3ry!zRFhFbHb+g{vcYhX-ZkYK1{zrkU^ YP!o7T%jG1m6{zU(boFyt=akR{0NGEqQ~&?~ diff --git a/html/scripts.js b/html/scripts.js index 6b56f4e4..e68ea08f 100644 --- a/html/scripts.js +++ b/html/scripts.js @@ -1,18 +1,11 @@ -// Mouse Controls -var documentWidth = document.documentElement.clientWidth; -var documentHeight = document.documentElement.clientHeight; -var cursor = $('#cursor'); -var cursorX = documentWidth / 2; -var cursorY = documentHeight / 2; - -//question variables +// question variables var questionNumber = 1; var userAnswer = []; var goodAnswer = []; var questionUsed = []; var nbQuestionToAnswer = 10; // don't forget to change the progress bar max value in html -var nbAnswerNeeded = 1; // out of nbQuestionToAnswer -var nbPossibleQuestions = 10; //number of questions in database questions.js +var nbAnswerNeeded = 5; // out of nbQuestionToAnswer +var nbPossibleQuestions = 10; // number of questions in database questions.js var lastClick = 0; function getRandomQuestion() { @@ -62,11 +55,9 @@ function openResultBad() { } function openContainer() { $(".question-container").css("display", "block"); - $("#cursor").css("display", "block"); } function closeContainer() { $(".question-container").css("display", "none"); - $("#cursor").css("display", "none"); } // Listen for NUI Events diff --git a/html/styles.css b/html/styles.css index 4b6a8e51..4653f29a 100644 --- a/html/styles.css +++ b/html/styles.css @@ -3,12 +3,6 @@ html { font-family: 'Open Sans', sans-serif; } -#cursor { - position: absolute; - z-index: 99999999; - display: none; -} - .full-screen { width: 100%; height:100%; diff --git a/html/ui.html b/html/ui.html index 53446a50..e0f8dcd0 100644 --- a/html/ui.html +++ b/html/ui.html @@ -95,8 +95,4 @@ - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/html/ui_en.html b/html/ui_en.html index e0844ab4..4b4adfa6 100644 --- a/html/ui_en.html +++ b/html/ui_en.html @@ -95,4 +95,4 @@ - + \ No newline at end of file From 9978c43d96536329761214d33600961886202289 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Sun, 1 Jul 2018 13:12:40 +0200 Subject: [PATCH 10/36] Cleanup, 4 tab indent, closes #3 --- README.md | 38 +++- __resource.lua | 45 ++-- client/main.lua | 530 ++++++++++++++++++++++-------------------------- 3 files changed, 298 insertions(+), 315 deletions(-) diff --git a/README.md b/README.md index 8000ed26..bd0143b9 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,42 @@ # esx_dmvschool -FXServer ESX DMV SChool +Realistic DMV school for ESX -[INSTALLATION] +## Requirements +- [esx_license](https://github.com/ESX-Org/esx_license) -1) Using [fvm](https://github.com/qlaffont/fvm-installer) +## Download & Installation + +### Using [fvm](https://github.com/qlaffont/fvm-installer) ``` fvm install --save --folder=esx esx-org/esx_dmvschool ``` -2) Manually +### Using Git +``` +cd resources +git clone https://github.com/ESX-Org/esx_dmvschool [esx]/esx_dmvschool +``` -- Download https://github.com/ESX-Org/esx_dmvschool/releases/latest -- Put it in [esx] directory +### Manually +- Download https://github.com/ESX-Org/esx_dmvschool/archive/master.zip +- Put it in the `[esx]` directory - -1) Import esx_dmvschool.sql in your database -2) Add this in your server.cfg : +## Installation +- Import `esx_dmvschool.sql` in your database +- Add this in your `server.cfg`: ``` start esx_dmvschool ``` + +# Legal +### License +esx_dmvschool - realistic DMV school for ESX + +Copyright (C) 2015-2018 Jérémie N'gadi + +This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version. + +This program Is distributed In the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty Of MERCHANTABILITY Or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License For more details. + +You should have received a copy Of the GNU General Public License along with this program. If Not, see http://www.gnu.org/licenses/. \ No newline at end of file diff --git a/__resource.lua b/__resource.lua index b4aa6979..56b148ab 100644 --- a/__resource.lua +++ b/__resource.lua @@ -2,34 +2,39 @@ resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' description 'ESX DMV School' -version '1.0.3' +version '1.0.4' server_scripts { - '@es_extended/locale.lua', - 'locales/fi.lua', - 'locales/fr.lua', - 'locales/en.lua', - 'config.lua', - 'server/main.lua' + '@es_extended/locale.lua', + 'locales/fi.lua', + 'locales/fr.lua', + 'locales/en.lua', + 'config.lua', + 'server/main.lua' } client_scripts { - '@es_extended/locale.lua', - 'locales/fi.lua', - 'locales/fr.lua', - 'locales/en.lua', - 'config.lua', - 'client/main.lua' + '@es_extended/locale.lua', + 'locales/fi.lua', + 'locales/fr.lua', + 'locales/en.lua', + 'config.lua', + 'client/main.lua' } ui_page 'html/ui.html' files { - 'html/ui.html', - 'html/logo.png', - 'html/dmv.png', - 'html/styles.css', - 'html/questions.js', - 'html/scripts.js', - 'html/debounce.min.js' + 'html/ui.html', + 'html/logo.png', + 'html/dmv.png', + 'html/styles.css', + 'html/questions.js', + 'html/scripts.js', + 'html/debounce.min.js' } + +dependencies { + 'es_extended', + 'esx_license' +} \ No newline at end of file diff --git a/client/main.lua b/client/main.lua index 934923e7..3acc8be9 100644 --- a/client/main.lua +++ b/client/main.lua @@ -27,422 +27,380 @@ local IsAboveSpeedLimit = false local LastVehicleHealth = nil Citizen.CreateThread(function() - while ESX == nil do - TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) - Citizen.Wait(0) - end + while ESX == nil do + TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) + Citizen.Wait(0) + end end) function DrawMissionText(msg, time) - ClearPrints() - SetTextEntry_2('STRING') - AddTextComponentString(msg) - DrawSubtitleTimed(time, 1) + ClearPrints() + SetTextEntry_2('STRING') + AddTextComponentString(msg) + DrawSubtitleTimed(time, 1) end function StartTheoryTest() + CurrentTest = 'theory' - CurrentTest = 'theory' + SendNUIMessage({ + openQuestion = true + }) - SendNUIMessage({ - openQuestion = true - }) - - ESX.SetTimeout(200, function() - SetNuiFocus(true, true) - end) - - TriggerServerEvent('esx_dmvschool:pay', Config.Prices['dmv']) + ESX.SetTimeout(200, function() + SetNuiFocus(true, true) + end) + TriggerServerEvent('esx_dmvschool:pay', Config.Prices['dmv']) end function StopTheoryTest(success) + CurrentTest = nil - CurrentTest = nil + SendNUIMessage({ + openQuestion = false + }) - SendNUIMessage({ - openQuestion = false - }) - - SetNuiFocus(false) - - if success then - TriggerServerEvent('esx_dmvschool:addLicense', 'dmv') - ESX.ShowNotification(_U('passed_test')) - else - ESX.ShowNotification(_U('failed_test')) - end + SetNuiFocus(false) + if success then + TriggerServerEvent('esx_dmvschool:addLicense', 'dmv') + ESX.ShowNotification(_U('passed_test')) + else + ESX.ShowNotification(_U('failed_test')) + end end function StartDriveTest(type) + ESX.Game.SpawnVehicle(Config.VehicleModels[type], Config.Zones.VehicleSpawnPoint.Pos, 317.0, function(vehicle) + CurrentTest = 'drive' + CurrentTestType = type + CurrentCheckPoint = 0 + LastCheckPoint = -1 + CurrentZoneType = 'residence' + DriveErrors = 0 + IsAboveSpeedLimit = false + CurrentVehicle = vehicle + LastVehicleHealth = GetEntityHealth(vehicle) + local playerPed = GetPlayerPed(-1) + TaskWarpPedIntoVehicle(playerPed, vehicle, -1) + end) - ESX.Game.SpawnVehicle(Config.VehicleModels[type], Config.Zones.VehicleSpawnPoint.Pos, 317.0, function(vehicle) - CurrentTest = 'drive' - CurrentTestType = type - CurrentCheckPoint = 0 - LastCheckPoint = -1 - CurrentZoneType = 'residence' - DriveErrors = 0 - IsAboveSpeedLimit = false - CurrentVehicle = vehicle - LastVehicleHealth = GetEntityHealth(vehicle) - local playerPed = GetPlayerPed(-1) - TaskWarpPedIntoVehicle(playerPed, vehicle, -1) - end) - - TriggerServerEvent('esx_dmvschool:pay', Config.Prices[type]) - + TriggerServerEvent('esx_dmvschool:pay', Config.Prices[type]) end function StopDriveTest(success) + if success then + TriggerServerEvent('esx_dmvschool:addLicense', CurrentTestType) + ESX.ShowNotification(_U('passed_test')) + else + ESX.ShowNotification(_U('failed_test')) + end - if success then - TriggerServerEvent('esx_dmvschool:addLicense', CurrentTestType) - ESX.ShowNotification(_U('passed_test')) - else - ESX.ShowNotification(_U('failed_test')) - end - - CurrentTest = nil - CurrentTestType = nil - + CurrentTest = nil + CurrentTestType = nil end function SetCurrentZoneType(type) - CurrentZoneType = type +CurrentZoneType = type end function OpenDMVSchoolMenu() + local ownedLicenses = {} - local ownedLicenses = {} + for i=1, #Licenses, 1 do + ownedLicenses[Licenses[i].type] = true + end - for i=1, #Licenses, 1 do - ownedLicenses[Licenses[i].type] = true - end + local elements = {} - local elements = {} + if not ownedLicenses['dmv'] then + table.insert(elements, {label = _U('theory_test') .. ' $' .. Config.Prices['dmv'] .. '', value = 'theory_test'}) + end - if not ownedLicenses['dmv'] then - table.insert(elements, {label = _U('theory_test') .. ' $' .. Config.Prices['dmv'] .. '', value = 'theory_test'}) - end + if ownedLicenses['dmv'] then - if ownedLicenses['dmv'] then + if not ownedLicenses['drive'] then + table.insert(elements, {label = _U('road_test_car') .. ' $' .. Config.Prices['drive'] .. '', value = 'drive_test', type = 'drive'}) + end - if not ownedLicenses['drive'] then - table.insert(elements, {label = _U('road_test_car') .. ' $' .. Config.Prices['drive'] .. '', value = 'drive_test', type = 'drive'}) - end + if not ownedLicenses['drive_bike'] then + table.insert(elements, {label = _U('road_test_bike') .. ' $' .. Config.Prices['drive_bike'] .. '', value = 'drive_test', type = 'drive_bike'}) + end - if not ownedLicenses['drive_bike'] then - table.insert(elements, {label = _U('road_test_bike') .. ' $' .. Config.Prices['drive_bike'] .. '', value = 'drive_test', type = 'drive_bike'}) - end + if not ownedLicenses['drive_truck'] then + table.insert(elements, {label = _U('road_test_truck') .. ' $' .. Config.Prices['drive_truck'] .. '', value = 'drive_test', type = 'drive_truck'}) + end - if not ownedLicenses['drive_truck'] then - table.insert(elements, {label = _U('road_test_truck') .. ' $' .. Config.Prices['drive_truck'] .. '', value = 'drive_test', type = 'drive_truck'}) - end + end - end + ESX.UI.Menu.CloseAll() - ESX.UI.Menu.CloseAll() + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'dmvschool_actions', + { + title = _U('driving_school'), + elements = elements, + align = 'top-left', + }, function(data, menu) + if data.current.value == 'theory_test' then + menu.close() + StartTheoryTest() + end - ESX.UI.Menu.Open( - 'default', GetCurrentResourceName(), 'dmvschool_actions', - { - title = _U('driving_school'), - elements = elements - }, - function(data, menu) + if data.current.value == 'drive_test' then + menu.close() + StartDriveTest(data.current.type) + end - if data.current.value == 'theory_test' then - menu.close() - StartTheoryTest() - end - - if data.current.value == 'drive_test' then - menu.close() - StartDriveTest(data.current.type) - end - - end, - function(data, menu) - - menu.close() - - CurrentAction = 'dmvschool_menu' - CurrentActionMsg = _U('press_open_menu') - CurrentActionData = {} - - end - ) + end, function(data, menu) + menu.close() + CurrentAction = 'dmvschool_menu' + CurrentActionMsg = _U('press_open_menu') + CurrentActionData = {} + end + ) end RegisterNUICallback('question', function(data, cb) + SendNUIMessage({ + openSection = 'question' + }) - SendNUIMessage({ - openSection = 'question' - }) - - cb('OK') + cb('OK') end) RegisterNUICallback('close', function(data, cb) - StopTheoryTest(true) - cb('OK') + StopTheoryTest(true) + cb('OK') end) RegisterNUICallback('kick', function(data, cb) - StopTheoryTest(false) - cb('OK') + StopTheoryTest(false) + cb('OK') end) AddEventHandler('esx_dmvschool:hasEnteredMarker', function(zone) - - if zone == 'DMVSchool' then - - CurrentAction = 'dmvschool_menu' - CurrentActionMsg = _U('press_open_menu') - CurrentActionData = {} - - end - + if zone == 'DMVSchool' then + CurrentAction = 'dmvschool_menu' + CurrentActionMsg = _U('press_open_menu') + CurrentActionData = {} + end end) AddEventHandler('esx_dmvschool:hasExitedMarker', function(zone) - CurrentAction = nil - ESX.UI.Menu.CloseAll() + CurrentAction = nil + ESX.UI.Menu.CloseAll() end) RegisterNetEvent('esx_dmvschool:loadLicenses') AddEventHandler('esx_dmvschool:loadLicenses', function(licenses) - Licenses = licenses + Licenses = licenses end) -- Create Blips Citizen.CreateThread(function() + local blip = AddBlipForCoord(Config.Zones.DMVSchool.Pos.x, Config.Zones.DMVSchool.Pos.y, Config.Zones.DMVSchool.Pos.z) - local blip = AddBlipForCoord(Config.Zones.DMVSchool.Pos.x, Config.Zones.DMVSchool.Pos.y, Config.Zones.DMVSchool.Pos.z) - - SetBlipSprite (blip, 408) - SetBlipDisplay(blip, 4) - SetBlipScale (blip, 1.2) - SetBlipAsShortRange(blip, true) - - BeginTextCommandSetBlipName("STRING") - AddTextComponentString(_U('driving_school_blip')) - EndTextCommandSetBlipName(blip) + SetBlipSprite (blip, 408) + SetBlipDisplay(blip, 4) + SetBlipScale (blip, 1.2) + SetBlipAsShortRange(blip, true) + BeginTextCommandSetBlipName("STRING") + AddTextComponentString(_U('driving_school_blip')) + EndTextCommandSetBlipName(blip) end) -- Display markers Citizen.CreateThread(function() - while true do + while true do - Citizen.Wait(10) + Citizen.Wait(10) - local coords = GetEntityCoords(GetPlayerPed(-1)) + local coords = GetEntityCoords(GetPlayerPed(-1)) - for k,v in pairs(Config.Zones) do - if(v.Type ~= -1 and GetDistanceBetweenCoords(coords, v.Pos.x, v.Pos.y, v.Pos.z, true) < Config.DrawDistance) then - DrawMarker(v.Type, v.Pos.x, v.Pos.y, v.Pos.z, 0.0, 0.0, 0.0, 0, 0.0, 0.0, v.Size.x, v.Size.y, v.Size.z, v.Color.r, v.Color.g, v.Color.b, 100, false, true, 2, false, false, false, false) - end - end + for k,v in pairs(Config.Zones) do + if(v.Type ~= -1 and GetDistanceBetweenCoords(coords, v.Pos.x, v.Pos.y, v.Pos.z, true) < Config.DrawDistance) then + DrawMarker(v.Type, v.Pos.x, v.Pos.y, v.Pos.z, 0.0, 0.0, 0.0, 0, 0.0, 0.0, v.Size.x, v.Size.y, v.Size.z, v.Color.r, v.Color.g, v.Color.b, 100, false, true, 2, false, false, false, false) + end + end - end + end end) -- Enter / Exit marker events Citizen.CreateThread(function() - while true do + while true do - Citizen.Wait(10) + Citizen.Wait(10) - local coords = GetEntityCoords(GetPlayerPed(-1)) - local isInMarker = false - local currentZone = nil + local coords = GetEntityCoords(GetPlayerPed(-1)) + local isInMarker = false + local currentZone = nil - for k,v in pairs(Config.Zones) do - if(GetDistanceBetweenCoords(coords, v.Pos.x, v.Pos.y, v.Pos.z, true) < v.Size.x) then - isInMarker = true - currentZone = k - end - end + for k,v in pairs(Config.Zones) do + if(GetDistanceBetweenCoords(coords, v.Pos.x, v.Pos.y, v.Pos.z, true) < v.Size.x) then + isInMarker = true + currentZone = k + end + end - if (isInMarker and not HasAlreadyEnteredMarker) or (isInMarker and LastZone ~= currentZone) then - HasAlreadyEnteredMarker = true - LastZone = currentZone - TriggerEvent('esx_dmvschool:hasEnteredMarker', currentZone) - end + if (isInMarker and not HasAlreadyEnteredMarker) or (isInMarker and LastZone ~= currentZone) then + HasAlreadyEnteredMarker = true + LastZone = currentZone + TriggerEvent('esx_dmvschool:hasEnteredMarker', currentZone) + end - if not isInMarker and HasAlreadyEnteredMarker then - HasAlreadyEnteredMarker = false - TriggerEvent('esx_dmvschool:hasExitedMarker', LastZone) - end - - end + if not isInMarker and HasAlreadyEnteredMarker then + HasAlreadyEnteredMarker = false + TriggerEvent('esx_dmvschool:hasExitedMarker', LastZone) + end + end end) -- Block UI Citizen.CreateThread(function() - while true do + while true do + Citizen.Wait(1) - Citizen.Wait(10) + if CurrentTest == 'theory' then + local playerPed = GetPlayerPed(-1) - if CurrentTest == 'theory' then - - local playerPed = GetPlayerPed(-1) - - DisableControlAction(0, 1, true) -- LookLeftRight - DisableControlAction(0, 2, true) -- LookUpDown - DisablePlayerFiring(playerPed, true) -- Disable weapon firing - DisableControlAction(0, 142, true) -- MeleeAttackAlternate - DisableControlAction(0, 106, true) -- VehicleMouseControlOverride - - end - - end + DisableControlAction(0, 1, true) -- LookLeftRight + DisableControlAction(0, 2, true) -- LookUpDown + DisablePlayerFiring(playerPed, true) -- Disable weapon firing + DisableControlAction(0, 142, true) -- MeleeAttackAlternate + DisableControlAction(0, 106, true) -- VehicleMouseControlOverride + else + Citizen.Wait(2000) + end + end end) -- Key Controls Citizen.CreateThread(function() - while true do + while true do + Citizen.Wait(10) - Citizen.Wait(10) + if CurrentAction ~= nil then + SetTextComponentFormat('STRING') + AddTextComponentString(CurrentActionMsg) + DisplayHelpTextFromStringLabel(0, 0, 1, -1) - if CurrentAction ~= nil then + if IsControlJustReleased(0, Keys['E']) then + if CurrentAction == 'dmvschool_menu' then + OpenDMVSchoolMenu() + end - SetTextComponentFormat('STRING') - AddTextComponentString(CurrentActionMsg) - DisplayHelpTextFromStringLabel(0, 0, 1, -1) - - if IsControlJustReleased(0, Keys['E']) then - - if CurrentAction == 'dmvschool_menu' then - OpenDMVSchoolMenu() - end - - CurrentAction = nil - - end - - end - - end + CurrentAction = nil + end + end + end end) -- Drive test Citizen.CreateThread(function() - while true do + while true do - Citizen.Wait(10) + Citizen.Wait(10) - if CurrentTest == 'drive' then + if CurrentTest == 'drive' then + local playerPed = GetPlayerPed(-1) + local coords = GetEntityCoords(playerPed) + local nextCheckPoint = CurrentCheckPoint + 1 - local playerPed = GetPlayerPed(-1) - local coords = GetEntityCoords(playerPed) - local nextCheckPoint = CurrentCheckPoint + 1 + if Config.CheckPoints[nextCheckPoint] == nil then + if DoesBlipExist(CurrentBlip) then + RemoveBlip(CurrentBlip) + end - if Config.CheckPoints[nextCheckPoint] == nil then - if DoesBlipExist(CurrentBlip) then - RemoveBlip(CurrentBlip) - end + CurrentTest = nil - CurrentTest = nil + ESX.ShowNotification(_U('driving_test_complete')) - ESX.ShowNotification(_U('driving_test_complete')) + if DriveErrors < Config.MaxErrors then + StopDriveTest(true) + else + StopDriveTest(false) + end + else - if DriveErrors < Config.MaxErrors then - StopDriveTest(true) - else - StopDriveTest(false) - end - else + if CurrentCheckPoint ~= LastCheckPoint then - if CurrentCheckPoint ~= LastCheckPoint then + if DoesBlipExist(CurrentBlip) then + RemoveBlip(CurrentBlip) + end - if DoesBlipExist(CurrentBlip) then - RemoveBlip(CurrentBlip) - end + CurrentBlip = AddBlipForCoord(Config.CheckPoints[nextCheckPoint].Pos.x, Config.CheckPoints[nextCheckPoint].Pos.y, Config.CheckPoints[nextCheckPoint].Pos.z) + SetBlipRoute(CurrentBlip, 1) - CurrentBlip = AddBlipForCoord(Config.CheckPoints[nextCheckPoint].Pos.x, Config.CheckPoints[nextCheckPoint].Pos.y, Config.CheckPoints[nextCheckPoint].Pos.z) - SetBlipRoute(CurrentBlip, 1) + LastCheckPoint = CurrentCheckPoint + end - LastCheckPoint = CurrentCheckPoint + local distance = GetDistanceBetweenCoords(coords, Config.CheckPoints[nextCheckPoint].Pos.x, Config.CheckPoints[nextCheckPoint].Pos.y, Config.CheckPoints[nextCheckPoint].Pos.z, true) - end + if distance <= 100.0 then + DrawMarker(1, Config.CheckPoints[nextCheckPoint].Pos.x, Config.CheckPoints[nextCheckPoint].Pos.y, Config.CheckPoints[nextCheckPoint].Pos.z, 0.0, 0.0, 0.0, 0, 0.0, 0.0, 1.5, 1.5, 1.5, 102, 204, 102, 100, false, true, 2, false, false, false, false) + end - local distance = GetDistanceBetweenCoords(coords, Config.CheckPoints[nextCheckPoint].Pos.x, Config.CheckPoints[nextCheckPoint].Pos.y, Config.CheckPoints[nextCheckPoint].Pos.z, true) - - if distance <= 100.0 then - DrawMarker(1, Config.CheckPoints[nextCheckPoint].Pos.x, Config.CheckPoints[nextCheckPoint].Pos.y, Config.CheckPoints[nextCheckPoint].Pos.z, 0.0, 0.0, 0.0, 0, 0.0, 0.0, 1.5, 1.5, 1.5, 102, 204, 102, 100, false, true, 2, false, false, false, false) - end - - if distance <= 3.0 then - Config.CheckPoints[nextCheckPoint].Action(playerPed, CurrentVehicle, SetCurrentZoneType) - CurrentCheckPoint = CurrentCheckPoint + 1 - end - - end - - end - - end + if distance <= 3.0 then + Config.CheckPoints[nextCheckPoint].Action(playerPed, CurrentVehicle, SetCurrentZoneType) + CurrentCheckPoint = CurrentCheckPoint + 1 + end + end + end + end end) -- Speed / Damage control Citizen.CreateThread(function() - while true do + while true do + Citizen.Wait(10) - Citizen.Wait(10) + if CurrentTest == 'drive' then - if CurrentTest == 'drive' then + local playerPed = GetPlayerPed(-1) - local playerPed = GetPlayerPed(-1) + if IsPedInAnyVehicle(playerPed, false) then - if IsPedInAnyVehicle(playerPed, false) then + local vehicle = GetVehiclePedIsIn(playerPed, false) + local speed = GetEntitySpeed(vehicle) * Config.SpeedMultiplier + local tooMuchSpeed = false - local vehicle = GetVehiclePedIsIn(playerPed, false) - local speed = GetEntitySpeed(vehicle) * Config.SpeedMultiplier - local tooMuchSpeed = false + for k,v in pairs(Config.SpeedLimits) do + if CurrentZoneType == k and speed > v then + tooMuchSpeed = true - for k,v in pairs(Config.SpeedLimits) do - if CurrentZoneType == k and speed > v then + if not IsAboveSpeedLimit then + DriveErrors = DriveErrors + 1 + IsAboveSpeedLimit = true - tooMuchSpeed = true + ESX.ShowNotification(_U('driving_too_fast', v)) + ESX.ShowNotification(_U('errors', DriveErrors, Config.MaxErrors)) + end + end + end - if not IsAboveSpeedLimit then + if not tooMuchSpeed then + IsAboveSpeedLimit = false + end - DriveErrors = DriveErrors + 1 - IsAboveSpeedLimit = true + local health = GetEntityHealth(vehicle) - ESX.ShowNotification(_U('driving_too_fast', v)) - ESX.ShowNotification(_U('errors', DriveErrors, Config.MaxErrors)) + if health < LastVehicleHealth then - end + DriveErrors = DriveErrors + 1 - end - end + ESX.ShowNotification(_U('you_damaged_veh')) + ESX.ShowNotification(_U('errors', DriveErrors, Config.MaxErrors)) - if not tooMuchSpeed then - IsAboveSpeedLimit = false - end - - local health = GetEntityHealth(vehicle) - - if health < LastVehicleHealth then - - DriveErrors = DriveErrors + 1 - - ESX.ShowNotification(_U('you_damaged_veh')) - ESX.ShowNotification(_U('errors', DriveErrors, Config.MaxErrors)) - LastVehicleHealth = health - end - - end - - end - - end - -end) + -- avoid stacking faults + Citizen.Wait(1000) + LastVehicleHealth = health + end + end + end + end +end) \ No newline at end of file From 49a3bc143e960bd1e310ec49953807b22cbd48e5 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Sun, 1 Jul 2018 13:19:35 +0200 Subject: [PATCH 11/36] Manual pr --- __resource.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/__resource.lua b/__resource.lua index 56b148ab..6dc996ec 100644 --- a/__resource.lua +++ b/__resource.lua @@ -6,6 +6,7 @@ version '1.0.4' server_scripts { '@es_extended/locale.lua', + 'locales/br.lua', 'locales/fi.lua', 'locales/fr.lua', 'locales/en.lua', @@ -15,6 +16,7 @@ server_scripts { client_scripts { '@es_extended/locale.lua', + 'locales/br.lua', 'locales/fi.lua', 'locales/fr.lua', 'locales/en.lua', From e60017abd2ab39673a6b67af4e3b97b2a47f3a78 Mon Sep 17 00:00:00 2001 From: MajorMarcin Date: Mon, 16 Jul 2018 10:58:47 +0200 Subject: [PATCH 12/36] add pl lang --- __resource.lua | 2 + html/questions_pl.js | 71 +++++++++++++++++++++++++++++++ html/ui_pl.html | 99 ++++++++++++++++++++++++++++++++++++++++++++ locales/pl.lua | 27 ++++++++++++ 4 files changed, 199 insertions(+) create mode 100644 html/questions_pl.js create mode 100644 html/ui_pl.html create mode 100644 locales/pl.lua diff --git a/__resource.lua b/__resource.lua index 6dc996ec..8672b937 100644 --- a/__resource.lua +++ b/__resource.lua @@ -10,6 +10,7 @@ server_scripts { 'locales/fi.lua', 'locales/fr.lua', 'locales/en.lua', + 'locales/pl.lua', 'config.lua', 'server/main.lua' } @@ -20,6 +21,7 @@ client_scripts { 'locales/fi.lua', 'locales/fr.lua', 'locales/en.lua', + 'locales/pl.lua', 'config.lua', 'client/main.lua' } diff --git a/html/questions_pl.js b/html/questions_pl.js new file mode 100644 index 00000000..9fba7dcc --- /dev/null +++ b/html/questions_pl.js @@ -0,0 +1,71 @@ +var tableauQuestion = [ + { question : "Jeśli masz 80 km/h, a zbliżasz się do terenu zabudowanego, musisz:", + propositionA : "Przyspieszyć", + propositionB : "Zahamować po czym jechać 50 km/h", + propositionC : "Zwolnić", + propositionD : "Zachować prędkość", + reponse : "C"}, + + { question : "Jeśli skręcasz w prawo na światłach bezkolizyjnych, ale widzisz przejście dla pieszych, co robisz:", + propositionA : "Przepuszczam pieszego", + propositionB : "Sprawdzam, czy w pobliżu nie ma innych pojazdów", + propositionC : "Zachowuje szczególną ostrożność i przejeżdżam", + propositionD : "Strzelam do pieszego i jadę dalej", + reponse : "C"}, + + { question : "Bez wcześniejszego wskazania prędkość w obszarze zabudowanym wynosi: __ km/h", + propositionA : "40", + propositionB : "50", + propositionC : "60", + propositionD : "70", + reponse : "B"}, + + { question : "Przed każdą zmianą pasa ruchu należy:", + propositionA : "Spojżeć w lusterka", + propositionB : "Sprawdź swoje martwe pole", + propositionC : "Zasygnalizuj swoje zamiary", + propositionD : "Wszystkie powyższe", + reponse : "D"}, + + { question : "Jaki poziom alkoholu we krwi NIE jest klasyfikowany jako jazda po pijanemu?", + propositionA : "0.02%", + propositionB : "0.19%", + propositionC : "0.05%", + propositionD : "0.04%", + reponse : "A"}, + + { question : "Kiedy możesz kontynuować jazdę na światłach?", + propositionA : "Kiedy zaświeci się zielone", + propositionB : "Kiedy nie ma nikogo na skrzyżowaniu", + propositionC : "Kiedy zaświeci się żółte", + propositionD : "Kiedy jest zielony lub czerwony ale skręcasz w prawo", + reponse : "A"}, + + { question : "Przewożąc ładunek gabarytowy możesz poruszać się tylko:", + propositionA : "Drogami do tego przeznaczonymi", + propositionB : "Nocami", + propositionC : "Drogami ekspresowymi", + propositionD : "Skrzyżowaniami o ruchu okrężnym", + reponse : "B"}, + + { question : "Posiadając prawo jazdy kategorii B możesz prowadzić :", + propositionA : "Pojazd samochodowy o dopuszczalnej masie całkowitej nieprzekraczającej 3.5 t, z wyjątkiem autobusu i motocykla", + propositionB : "Zespołem pojazdów złożonym z pojazdu, o którym mowa wyżej, oraz z przyczepy lekkiej", + propositionC : "Zespołem pojazdów złożonym z pojazdu, o którym mowa wyżej, oraz z przyczepy innej niż lekka, o ile łączna dopuszczalna masa całkowita zespołu tych pojazdów nie przekracza 4250 kg", + propositionD : "Wszystkie powyższe", + reponse : "D"}, + + { question : "Jedziesz autostradą, która wskazuje maksymalną prędkość 120 km/h. Większość aut jedzie z prędkością 140km/h, więc nie powinieneś jechać szybciej niż:", + propositionA : "120 km/h", + propositionB : "130 km/h", + propositionC : "140 km/h", + propositionD : "150 km/h", + reponse : "A"}, + + { question : "Wyprzedzając inne pojazdy należy:", + propositionA : "Zwolnić", + propositionB : "Trąbić na wyprzedzany pojazd", + propositionC : "Oglądać wyprzedzany pojazd", + propositionD : "Zwiększ prędkość", + reponse : "D"}, +] diff --git a/html/ui_pl.html b/html/ui_pl.html new file mode 100644 index 00000000..ad41217f --- /dev/null +++ b/html/ui_pl.html @@ -0,0 +1,99 @@ + + + + + + +
+
+ +
+

Szkoła Jazdy

+
+ +
+
+ +

Witaj w szkole jazdy.

+
Wszyscy mieszkańcy naszej wyspy muszą zdać egzamin zanim zaczną jeździć po ulicach.
Nie spiesz się, odpowiadaj zgodnie z polskimi przepisami i nie odpowiadaj losowo.

+ Egzamin teoretyczny
+ - Test teoretyczny kosztuje 200 $, kwota uiszczana za każde podejście.
+ - Jeśli nie zdasz za pierwszym razem możesz przystąpić ponownie
+ - Nie obawiaj się, szkoła jazdy akceptuje kredyt, ale uważaj, aby nie zadłużać się za bardzo.
+ - Jeśli nie zaliczysz egzaminu teoretycznego, nie możesz przystąpić do egzaminu praktycznego.

+ Egzamin praktycznyt
+ - Egzamin praktyczny kosztuje 500 $, tak jak w przypadku praktyki kwota uiszczana jest za każde podejście.
+ - Zachowaj czujność podczas jazdy i unikaj wypadków!

+
+
+ Start +
+
+

Postęp

+ +
+
+ +
+
+

+

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+

Postęp

+ +
+
+ +
+
+

Gratulacje!



Dobrze się spisałeś podczas egzaminu.

Możesz zamknąć to okno i przejść do egzaminu praktycznego.
+
+
+ Zamknij +
+
+

Postęp

+ +
+
+
+
+

Egzamin niezaliczony



Nie jesteś gotowy na ten test, spróbuj ponownie później ...

+
+
+ Zamknij +
+
+

Postęp

+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/locales/pl.lua b/locales/pl.lua new file mode 100644 index 00000000..8195f986 --- /dev/null +++ b/locales/pl.lua @@ -0,0 +1,27 @@ +Locales['pl'] = { + ['you_paid'] = 'zapłaciłes ~g~$%s~s~ dla szkoły jazdy.', + ['go_next_point'] = 'udaj się do nastepnego punktu!', + ['in_town_speed'] = 'wjeżdżasz do miasta, zachowaj ostrożność! Ograniczenie prędkości: ~y~', + ['next_point_speed'] = 'udaj się do nastepnego punktu! Ograniczenie prędkości: ~y~', + ['stop_for_ped'] = '~r~Stop~s~ przejście ~y~dla pieszych', + ['good_lets_cont'] = '~g~Świetnie~s~, kontynuuj.', + ['stop_look_left'] = '~r~Stop~s~ spójrz w ~y~lewo~s~. Ograniczenie prędkości:~y~ ', + ['good_turn_right'] = '~g~Świetnie~s~, skręć w prawo i podążaj za linią', + ['watch_traffic_lightson'] = 'obserwuj ruch uliczny i ~y~włącz światła~s~!', + ['stop_for_passing'] = '~r~Stop~s~ przepuść przejeżdźające pojazdy!', + ['hway_time'] = 'czas na autostradę! Ograniczenie prędkości:~y~ ', + ['gratz_stay_alert'] = 'jestem pod wrażeniem, ale nie zapomnij się zatrzymać ~r~alert~s~ podczas jazdy!', + ['passed_test'] = '~g~Zdałeś~s~ egzamin, gratulacje!', + ['failed_test'] = '~r~Oblałeś~s~ egzamin, powodzenia następnym razem!', + ['theory_test'] = 'ezgamin Teoretyczny', + ['road_test_car'] = 'egzamin praktyczny kat. B', + ['road_test_bike'] = 'egzamin praktyczny kat. A', + ['road_test_truck'] = 'egzamin praktyczny kat. C', + ['driving_school'] = 'szkoła jazdy', + ['press_open_menu'] = 'wciśnij ~INPUT_CONTEXT~ by otworzyć menu', + ['driving_school_blip'] = 'ośrodek egzaminacyjny', + ['driving_test_complete'] = 'test praktyczny zakończony', + ['driving_too_fast'] = '~r~Przekroczenie prędkości! ,~s~ limit prędkości to: ~y~%s~s~ km/h!', + ['errors'] = 'błędy: ~r~%s~s~/%s', + ['you_damaged_veh'] = 'uszkodziłeś auto', +} From 72f1ff5aafafcdc053806363030ecad1381236be Mon Sep 17 00:00:00 2001 From: nearbyplayer Date: Fri, 10 Aug 2018 00:53:23 -0400 Subject: [PATCH 13/36] Repo Update --- .editorconfig | 6 +- LICENSE | 674 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 677 insertions(+), 3 deletions(-) create mode 100644 LICENSE diff --git a/.editorconfig b/.editorconfig index 41c2aaf2..9b425256 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,9 +1,9 @@ root = true [*] -indent_size = 2 -indent_style = space -end_of_line = lf +indent_size = 4 +indent_style = tab +end_of_line = crlf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..0f4f5d61 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + fxserver-async + Copyright (C) 2015 Jérémie N'gadi + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + fxserver-async Copyright (C) 2015 Jérémie N'gadi + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file From 0bbeb245a90c371dd940130b2e1e0b4310a6a50b Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Fri, 24 Aug 2018 18:10:56 +0200 Subject: [PATCH 14/36] Added Swedish locale, proper locale formatting, file formatting --- __resource.lua | 4 +- client/main.lua | 36 +++--- config.lua | 285 +++++++++++++++++++++---------------------- html/questions.js | 158 +++++++++++++----------- html/questions_en.js | 140 ++++++++++++--------- html/questions_fi.js | 158 +++++++++++++----------- html/questions_pl.js | 140 ++++++++++++--------- html/scripts.js | 161 ++++++++++++------------ html/ui.html | 78 +++++++----- html/ui_en.html | 201 ++++++++++++++++-------------- html/ui_fi.html | 204 +++++++++++++++++-------------- html/ui_pl.html | 203 ++++++++++++++++-------------- locales/br.lua | 10 +- locales/en.lua | 10 +- locales/fi.lua | 24 ++-- locales/fr.lua | 18 ++- locales/pl.lua | 8 +- locales/sv.lua | 27 ++++ 18 files changed, 1027 insertions(+), 838 deletions(-) create mode 100644 locales/sv.lua diff --git a/__resource.lua b/__resource.lua index 8672b937..6064ccb7 100644 --- a/__resource.lua +++ b/__resource.lua @@ -2,7 +2,7 @@ resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' description 'ESX DMV School' -version '1.0.4' +version '1.0.5' server_scripts { '@es_extended/locale.lua', @@ -11,6 +11,7 @@ server_scripts { 'locales/fr.lua', 'locales/en.lua', 'locales/pl.lua', + 'locales/sv.lua', 'config.lua', 'server/main.lua' } @@ -22,6 +23,7 @@ client_scripts { 'locales/fr.lua', 'locales/en.lua', 'locales/pl.lua', + 'locales/sv.lua', 'config.lua', 'client/main.lua' } diff --git a/client/main.lua b/client/main.lua index 3acc8be9..ca443cc4 100644 --- a/client/main.lua +++ b/client/main.lua @@ -72,7 +72,7 @@ function StopTheoryTest(success) end function StartDriveTest(type) - ESX.Game.SpawnVehicle(Config.VehicleModels[type], Config.Zones.VehicleSpawnPoint.Pos, 317.0, function(vehicle) + ESX.Game.SpawnVehicle(Config.VehicleModels[type], Config.Zones.VehicleSpawnPoint.Pos, Config.Zones.VehicleSpawnPoint.Pos.h, function(vehicle) CurrentTest = 'drive' CurrentTestType = type CurrentCheckPoint = 0 @@ -83,7 +83,7 @@ function StartDriveTest(type) CurrentVehicle = vehicle LastVehicleHealth = GetEntityHealth(vehicle) - local playerPed = GetPlayerPed(-1) + local playerPed = PlayerPedId() TaskWarpPedIntoVehicle(playerPed, vehicle, -1) end) @@ -219,7 +219,7 @@ Citizen.CreateThread(function() Citizen.Wait(10) - local coords = GetEntityCoords(GetPlayerPed(-1)) + local coords = GetEntityCoords(PlayerPedId()) for k,v in pairs(Config.Zones) do if(v.Type ~= -1 and GetDistanceBetweenCoords(coords, v.Pos.x, v.Pos.y, v.Pos.z, true) < Config.DrawDistance) then @@ -236,7 +236,7 @@ Citizen.CreateThread(function() Citizen.Wait(10) - local coords = GetEntityCoords(GetPlayerPed(-1)) + local coords = GetEntityCoords(PlayerPedId()) local isInMarker = false local currentZone = nil @@ -266,7 +266,7 @@ Citizen.CreateThread(function() Citizen.Wait(1) if CurrentTest == 'theory' then - local playerPed = GetPlayerPed(-1) + local playerPed = PlayerPedId() DisableControlAction(0, 1, true) -- LookLeftRight DisableControlAction(0, 2, true) -- LookUpDown @@ -274,7 +274,7 @@ Citizen.CreateThread(function() DisableControlAction(0, 142, true) -- MeleeAttackAlternate DisableControlAction(0, 106, true) -- VehicleMouseControlOverride else - Citizen.Wait(2000) + Citizen.Wait(500) end end end) @@ -285,9 +285,8 @@ Citizen.CreateThread(function() Citizen.Wait(10) if CurrentAction ~= nil then - SetTextComponentFormat('STRING') - AddTextComponentString(CurrentActionMsg) - DisplayHelpTextFromStringLabel(0, 0, 1, -1) + + ESX.ShowHelpNotification(CurrentActionMsg) if IsControlJustReleased(0, Keys['E']) then if CurrentAction == 'dmvschool_menu' then @@ -296,6 +295,8 @@ Citizen.CreateThread(function() CurrentAction = nil end + else + Citizen.Wait(500) end end end) @@ -307,7 +308,7 @@ Citizen.CreateThread(function() Citizen.Wait(10) if CurrentTest == 'drive' then - local playerPed = GetPlayerPed(-1) + local playerPed = PlayerPedId() local coords = GetEntityCoords(playerPed) local nextCheckPoint = CurrentCheckPoint + 1 @@ -350,6 +351,9 @@ Citizen.CreateThread(function() CurrentCheckPoint = CurrentCheckPoint + 1 end end + else + -- not currently taking driver test + Citizen.Wait(500) end end end) @@ -361,11 +365,11 @@ Citizen.CreateThread(function() if CurrentTest == 'drive' then - local playerPed = GetPlayerPed(-1) + local playerPed = PlayerPedId() - if IsPedInAnyVehicle(playerPed, false) then + if IsPedInAnyVehicle(playerPed, false) then - local vehicle = GetVehiclePedIsIn(playerPed, false) + local vehicle = GetVehiclePedIsIn(playerPed, false) local speed = GetEntitySpeed(vehicle) * Config.SpeedMultiplier local tooMuchSpeed = false @@ -388,7 +392,6 @@ Citizen.CreateThread(function() end local health = GetEntityHealth(vehicle) - if health < LastVehicleHealth then DriveErrors = DriveErrors + 1 @@ -397,10 +400,13 @@ Citizen.CreateThread(function() ESX.ShowNotification(_U('errors', DriveErrors, Config.MaxErrors)) -- avoid stacking faults - Citizen.Wait(1000) LastVehicleHealth = health + Citizen.Wait(1500) end end + else + -- not currently taking driver test + Citizen.Wait(500) end end end) \ No newline at end of file diff --git a/config.lua b/config.lua index aa8eed1a..d08b91db 100644 --- a/config.lua +++ b/config.lua @@ -5,184 +5,181 @@ Config.SpeedMultiplier = 3.6 Config.Locale = 'fr' Config.Prices = { - dmv = 200, - drive = 500, - drive_bike = 500, - drive_truck = 500 + dmv = 500, + drive = 2500, + drive_bike = 3000, + drive_truck = 5000 } Config.VehicleModels = { - drive = 'blista', - drive_bike = 'sanchez', - drive_truck = 'mule3' + drive = 'blista', + drive_bike = 'sanchez', + drive_truck = 'mule3' } Config.SpeedLimits = { - residence = 50, - town = 80, - freeway = 120 + residence = 50, + town = 80, + freeway = 120 } Config.Zones = { - DMVSchool = { - Pos = {x = 239.471, y = -1380.960, z = 32.741}, - Size = {x = 1.5, y = 1.5, z = 1.0}, - Color = {r = 204, g = 204, b = 0}, - Type = 1 - }, + DMVSchool = { + Pos = {x = 239.471, y = -1380.960, z = 32.741}, + Size = {x = 1.5, y = 1.5, z = 1.0}, + Color = {r = 204, g = 204, b = 0}, + Type = 1 + }, - VehicleSpawnPoint = { - Pos = {x = 249.409, y = -1407.230, z = 30.4094}, - Size = {x = 1.5, y = 1.5, z = 1.0}, - Color = {r = 204, g = 204, b = 0}, - Type = -1 - }, + VehicleSpawnPoint = { + Pos = {x = 249.409, y = -1407.230, z = 30.4094, h = 317.0}, + Size = {x = 1.5, y = 1.5, z = 1.0}, + Color = {r = 204, g = 204, b = 0}, + Type = -1 + } } Config.CheckPoints = { - { - Pos = {x = 255.139, y = -1400.731, z = 29.537}, - Action = function(playerPed, vehicle, setCurrentZoneType) - DrawMissionText(_U('next_point_speed') .. Config.SpeedLimits['residence'] .. 'km/h', 5000) - end - }, + { + Pos = {x = 255.139, y = -1400.731, z = 29.537}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText(_U('next_point_speed', Config.SpeedLimits['residence']), 5000) + end + }, - { - Pos = {x = 271.874, y = -1370.574, z = 30.932}, - Action = function(playerPed, vehicle, setCurrentZoneType) - DrawMissionText(_U('go_next_point'), 5000) - end - }, + { + Pos = {x = 271.874, y = -1370.574, z = 30.932}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText(_U('go_next_point'), 5000) + end + }, - { - Pos = {x = 234.907, y = -1345.385, z = 29.542}, - Action = function(playerPed, vehicle, setCurrentZoneType) - Citizen.CreateThread(function() - DrawMissionText(_U('stop_for_ped'), 5000) - PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) - FreezeEntityPosition(vehicle, true) - Citizen.Wait(4000) - FreezeEntityPosition(vehicle, false) - DrawMissionText(_U('good_lets_cont'), 5000) + { + Pos = {x = 234.907, y = -1345.385, z = 29.542}, + Action = function(playerPed, vehicle, setCurrentZoneType) + Citizen.CreateThread(function() + DrawMissionText(_U('stop_for_ped'), 5000) + PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) + FreezeEntityPosition(vehicle, true) + Citizen.Wait(4000) - end) - end - }, + FreezeEntityPosition(vehicle, false) + DrawMissionText(_U('good_lets_cont'), 5000) + end) + end + }, - { - Pos = {x = 217.821, y = -1410.520, z = 28.292}, - Action = function(playerPed, vehicle, setCurrentZoneType) + { + Pos = {x = 217.821, y = -1410.520, z = 28.292}, + Action = function(playerPed, vehicle, setCurrentZoneType) + setCurrentZoneType('town') - setCurrentZoneType('town') + Citizen.CreateThread(function() + DrawMissionText(_U('stop_look_left', Config.SpeedLimits['town']), 5000) + PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) + FreezeEntityPosition(vehicle, true) + Citizen.Wait(6000) - Citizen.CreateThread(function() - DrawMissionText(_U('stop_look_left') .. Config.SpeedLimits['town'] .. 'km/h', 5000) - PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) - FreezeEntityPosition(vehicle, true) - Citizen.Wait(6000) - FreezeEntityPosition(vehicle, false) - DrawMissionText(_U('good_turn_right'), 5000) - end) - end - }, + FreezeEntityPosition(vehicle, false) + DrawMissionText(_U('good_turn_right'), 5000) + end) + end + }, - { - Pos = {x = 178.550, y = -1401.755, z = 27.725}, - Action = function(playerPed, vehicle, setCurrentZoneType) - DrawMissionText(_U('watch_traffic_lightson'), 5000) - end - }, + { + Pos = {x = 178.550, y = -1401.755, z = 27.725}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText(_U('watch_traffic_lightson'), 5000) + end + }, - { - Pos = {x = 113.160, y = -1365.276, z = 27.725}, - Action = function(playerPed, vehicle, setCurrentZoneType) - DrawMissionText(_U('go_next_point'), 5000) - end - }, + { + Pos = {x = 113.160, y = -1365.276, z = 27.725}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText(_U('go_next_point'), 5000) + end + }, - { - Pos = {x = -73.542, y = -1364.335, z = 27.789}, - Action = function(playerPed, vehicle, setCurrentZoneType) - DrawMissionText(_U('stop_for_passing'), 5000) - PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) - FreezeEntityPosition(vehicle, true) - Citizen.Wait(6000) - FreezeEntityPosition(vehicle, false) - end - }, + { + Pos = {x = -73.542, y = -1364.335, z = 27.789}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText(_U('stop_for_passing'), 5000) + PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) + FreezeEntityPosition(vehicle, true) + Citizen.Wait(6000) + FreezeEntityPosition(vehicle, false) + end + }, - { - Pos = {x = -355.143, y = -1420.282, z = 27.868}, - Action = function(playerPed, vehicle, setCurrentZoneType) - DrawMissionText(_U('go_next_point'), 5000) - end - }, + { + Pos = {x = -355.143, y = -1420.282, z = 27.868}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText(_U('go_next_point'), 5000) + end + }, - { - Pos = {x = -439.148, y = -1417.100, z = 27.704}, - Action = function(playerPed, vehicle, setCurrentZoneType) - DrawMissionText(_U('go_next_point'), 5000) - end - }, + { + Pos = {x = -439.148, y = -1417.100, z = 27.704}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText(_U('go_next_point'), 5000) + end + }, - { - Pos = {x = -453.790, y = -1444.726, z = 27.665}, - Action = function(playerPed, vehicle, setCurrentZoneType) + { + Pos = {x = -453.790, y = -1444.726, z = 27.665}, + Action = function(playerPed, vehicle, setCurrentZoneType) + setCurrentZoneType('freeway') - setCurrentZoneType('freeway') + DrawMissionText(_U('hway_time', Config.SpeedLimits['freeway']), 5000) + PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) + end + }, - DrawMissionText(_U('hway_time') .. Config.SpeedLimits['freeway'] .. 'km/h', 5000) - PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) - end - }, + { + Pos = {x = -463.237, y = -1592.178, z = 37.519}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText(_U('go_next_point'), 5000) + end + }, - { - Pos = {x = -463.237, y = -1592.178, z = 37.519}, - Action = function(playerPed, vehicle, setCurrentZoneType) - DrawMissionText(_U('go_next_point'), 5000) - end - }, + { + Pos = {x = -900.647, y = -1986.28, z = 26.109}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText(_U('go_next_point'), 5000) + end + }, - { - Pos = {x = -900.647, y = -1986.28, z = 26.109}, - Action = function(playerPed, vehicle, setCurrentZoneType) - DrawMissionText(_U('go_next_point'), 5000) - end - }, + { + Pos = {x = 1225.759, y = -1948.792, z = 38.718}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText(_U('go_next_point'), 5000) + end + }, - { - Pos = {x = 1225.759, y = -1948.792, z = 38.718}, - Action = function(playerPed, vehicle, setCurrentZoneType) - DrawMissionText(_U('go_next_point'), 5000) - end - }, + { + Pos = {x = 1225.759, y = -1948.792, z = 38.718}, + Action = function(playerPed, vehicle, setCurrentZoneType) + setCurrentZoneType('town') + DrawMissionText(_U('in_town_speed', Config.SpeedLimits['town']), 5000) + end + }, - { - Pos = {x = 1225.759, y = -1948.792, z = 38.718}, - Action = function(playerPed, vehicle, setCurrentZoneType) + { + Pos = {x = 1163.603, y = -1841.771, z = 35.679}, + Action = function(playerPed, vehicle, setCurrentZoneType) + DrawMissionText(_U('gratz_stay_alert'), 5000) + PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) + end + }, - setCurrentZoneType('town') - - DrawMissionText(_U('in_town_speed') .. Config.SpeedLimits['town'] .. 'km/h', 5000) - end - }, - - { - Pos = {x = 1163.603, y = -1841.771, z = 35.679}, - Action = function(playerPed, vehicle, setCurrentZoneType) - DrawMissionText(_U('gratz_stay_alert'), 5000) - PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) - end - }, - - { - Pos = {x = 235.283, y = -1398.329, z = 28.921}, - Action = function(playerPed, vehicle, setCurrentZoneType) - ESX.Game.DeleteVehicle(vehicle) - end - }, + { + Pos = {x = 235.283, y = -1398.329, z = 28.921}, + Action = function(playerPed, vehicle, setCurrentZoneType) + ESX.Game.DeleteVehicle(vehicle) + end + } } diff --git a/html/questions.js b/html/questions.js index 2c1ae9cb..2e1c9421 100644 --- a/html/questions.js +++ b/html/questions.js @@ -1,71 +1,91 @@ var tableauQuestion = [ - { question : "Si vous conduisez à 80km/h, que vous approchez d'un lieu de résidence, cela veut dire que :", - propositionA : "Vous devez accélérer", - propositionB : "Vous pouvez garder votre vitesse, si vous ne croisez pas d'autres véhicules", - propositionC : "Vous devez ralentir", - propositionD : "Vous pouvez garder votre vitesse", - reponse : "C"}, - - { question : "Vous vous apprétez à tourner à droite au feu vert, mais vous voyez un piéton qui traverse :", - propositionA : "Vous passez avant le piéton", - propositionB : "Vous vérifiez qu'il n'y a pas d'autre véhicule et vous passez", - propositionC : "Vous attendez que le piéton est terminé", - propositionD : "Vous shoutez le piéton pour passer", - reponse : "C"}, - - { question : "Sans aucune indication : La vitesse dans une zone résidentielle est de : __ km/h", - propositionA : "50", - propositionB : "55", - propositionC : "65", - propositionD : "70", - reponse : "A"}, - - { question : "Avant chaque changement de file vous devez :", - propositionA : "Vérifiez vos rétroviseurs", - propositionB : "Vérifiez vos angles morts", - propositionC : "Signalez vos intentions", - propositionD : "Tout cela", - reponse : "D"}, - - { question : "What blood alcohol level is classified as driving while intoxicated?", - propositionA : "0.05%", - propositionB : "0.18%", - propositionC : "0.08%", - propositionD : "0.06%", - reponse : "C"}, - - { question : "A quel moment vous pouvez passer aux feux ?", - propositionA : "Quand il est vert", - propositionB : "Quand il n'y a personne sur l'intersection", - propositionC : "Vous êtes dans une zone d'école", - propositionD : "Quand il est vert et/ou rouge et que je tourne à droite", - reponse : "D"}, - - { question : "Un piéton est au feu rouge pour les piétons", - propositionA : "Vous le laissez passer", - propositionB : "Vous observez avant de continuer", - propositionC : "Vous lui faite un signe de la main", - propositionD : "Vous continuez votre chemin car votre feu est vert", - reponse : "D"}, - - { question : "Qu'est ce qui est permit quand vous dépassez un autre véhicule", - propositionA : "Le suivre de près pour le doubler plus vite", - propositionB : "Le doubler en quittant la route", - propositionC : "Conduire sur la route opposé pour le dépasser", - propositionD : "Dépasser la vitesse limite", - reponse : "C"}, - - { question : "Vous conduisez sur une rocade qui indique une vitesse maximum de 110 km/h. La plupart du traffic roule à 120 km/h, alors vous ne devriez pas conduire plus vite que :", - propositionA : "80 kmh", - propositionB : "40 kmh", - propositionC : "50 kmh", - propositionD : "110 kmh", - reponse : "D"}, - - { question : "Quand vous êtes dépassé par un autre véhicule il est important de ne PAS :", - propositionA : "Ralentir", - propositionB : "Vérifiez vos rétroviseurs", - propositionC : "Regarder les autres conducteurs", - propositionD : "Augmenter votre vitesse", - reponse : "D"}, + { + question: "Si vous conduisez à 80km/h, que vous approchez d'un lieu de résidence, cela veut dire que :", + propositionA: "Vous devez accélérer", + propositionB: "Vous pouvez garder votre vitesse, si vous ne croisez pas d'autres véhicules", + propositionC: "Vous devez ralentir", + propositionD: "Vous pouvez garder votre vitesse", + reponse: "C" + }, + + { + question: "Vous vous apprétez à tourner à droite au feu vert, mais vous voyez un piéton qui traverse :", + propositionA: "Vous passez avant le piéton", + propositionB: "Vous vérifiez qu'il n'y a pas d'autre véhicule et vous passez", + propositionC: "Vous attendez que le piéton est terminé", + propositionD: "Vous shoutez le piéton pour passer", + reponse: "C" + }, + + { + question: "Sans aucune indication : La vitesse dans une zone résidentielle est de : __ km/h", + propositionA: "50", + propositionB: "55", + propositionC: "65", + propositionD: "70", + reponse: "A" + }, + + { + question: "Avant chaque changement de file vous devez :", + propositionA: "Vérifiez vos rétroviseurs", + propositionB: "Vérifiez vos angles morts", + propositionC: "Signalez vos intentions", + propositionD: "Tout cela", + reponse: "D" + }, + + { + question: "What blood alcohol level is classified as driving while intoxicated?", + propositionA: "0.05%", + propositionB: "0.18%", + propositionC: "0.08%", + propositionD: "0.06%", + reponse: "C" + }, + + { + question: "A quel moment vous pouvez passer aux feux ?", + propositionA: "Quand il est vert", + propositionB: "Quand il n'y a personne sur l'intersection", + propositionC: "Vous êtes dans une zone d'école", + propositionD: "Quand il est vert et/ou rouge et que je tourne à droite", + reponse: "D" + }, + + { + question: "Un piéton est au feu rouge pour les piétons", + propositionA: "Vous le laissez passer", + propositionB: "Vous observez avant de continuer", + propositionC: "Vous lui faite un signe de la main", + propositionD: "Vous continuez votre chemin car votre feu est vert", + reponse: "D" + }, + + { + question: "Qu'est ce qui est permit quand vous dépassez un autre véhicule", + propositionA: "Le suivre de près pour le doubler plus vite", + propositionB: "Le doubler en quittant la route", + propositionC: "Conduire sur la route opposé pour le dépasser", + propositionD: "Dépasser la vitesse limite", + reponse: "C" + }, + + { + question: "Vous conduisez sur une rocade qui indique une vitesse maximum de 110 km/h. La plupart du traffic roule à 120 km/h, alors vous ne devriez pas conduire plus vite que :", + propositionA: "80 kmh", + propositionB: "40 kmh", + propositionC: "50 kmh", + propositionD: "110 kmh", + reponse: "D" + }, + + { + question: "Quand vous êtes dépassé par un autre véhicule il est important de ne PAS :", + propositionA: "Ralentir", + propositionB: "Vérifiez vos rétroviseurs", + propositionC: "Regarder les autres conducteurs", + propositionD: "Augmenter votre vitesse", + reponse: "D" + }, ] diff --git a/html/questions_en.js b/html/questions_en.js index 01e95a07..0cc0d572 100644 --- a/html/questions_en.js +++ b/html/questions_en.js @@ -1,71 +1,91 @@ var tableauQuestion = [ - { question : "If you're going 65 mph, and you're approaching a residential area you must:", - propositionA : "You accelerate", - propositionB : "You keep your speed, if you do not pass other vehicles", - propositionC : "You slow down", - propositionD : "You keep your speed", - reponse : "C"}, + { + question: "If you're going 80 km/h, and you're approaching a residential area you must:", + propositionA: "You accelerate", + propositionB: "You keep your speed, if you do not pass other vehicles", + propositionC: "You slow down", + propositionD: "You keep your speed", + reponse: "C" + }, - { question : "If you're turning right at a traffic light, but see a pedestrian crossing what do you do:", - propositionA : "You pass the pedestrian", - propositionB : "You check that there is no other vehicles around", - propositionC : "You wait until the pedestrian has crossed", - propositionD : "You shoot the pedestrian and continue to drive", - reponse : "C"}, + { + question: "If you're turning right at a traffic light, but see a pedestrian crossing what do you do:", + propositionA: "You pass the pedestrian", + propositionB: "You check that there is no other vehicles around", + propositionC: "You wait until the pedestrian has crossed", + propositionD: "You shoot the pedestrian and continue to drive", + reponse: "C" + }, - { question : "Without any prior indication, the speed in a residential area is: __ mph", - propositionA : "30", - propositionB : "35", - propositionC : "40", - propositionD : "45", - reponse : "A"}, + { + question: "Without any prior indication, the speed in a residential area is: __ km/h", + propositionA: "30 km/h", + propositionB: "50 km/h", + propositionC: "40 km/h", + propositionD: "60 km/h", + reponse: "B" + }, - { question : "Before every lane change you must:", - propositionA : "Check your mirrors", - propositionB : "Check your blind spots", - propositionC : "Signal your intentions", - propositionD : "All of the above", - reponse : "D"}, + { + question: "Before every lane change you must:", + propositionA: "Check your mirrors", + propositionB: "Check your blind spots", + propositionC: "Signal your intentions", + propositionD: "All of the above", + reponse: "D" + }, - { question : "What blood alcohol level is classified as driving while intoxicated?", - propositionA : "0.05%", - propositionB : "0.18%", - propositionC : "0.08%", - propositionD : "0.06%", - reponse : "C"}, + { + question: "What blood alcohol level is classified as driving while intoxicated?", + propositionA: "0.05%", + propositionB: "0.18%", + propositionC: "0.08%", + propositionD: "0.06%", + reponse: "C" + }, - { question : "When can you continue to drive at a traffic light?", - propositionA : "When it is green", - propositionB : "When there is nobody in the intersection", - propositionC : "You are in a school zone", - propositionD : "When it is green and / or red and you're turning right", - reponse : "D"}, + { + question: "When can you continue to drive at a traffic light?", + propositionA: "When it is green", + propositionB: "When there is nobody in the intersection", + propositionC: "You are in a school zone", + propositionD: "When it is green and / or red and you're turning right", + reponse: "D" + }, - { question : "A pedestrian has a do not cross signal, what do you do?", - propositionA : "You let them pass", - propositionB : "You observe before continuing", - propositionC : "You wave to tell them to cross", - propositionD : "You continue because your traffic light is green", - reponse : "D"}, + { + question: "A pedestrian has a do not cross signal, what do you do?", + propositionA: "You let them pass", + propositionB: "You observe before continuing", + propositionC: "You wave to tell them to cross", + propositionD: "You continue because your traffic light is green", + reponse: "D" + }, - { question : "What is allowed when passing another vehicle", - propositionA : "You follow it closely to pass it faster", - propositionB : "You pass it without leaving the roadway", - propositionC : "You drive on the opposite side of the road to pass", - propositionD : "You exceed the speed limit to pass them", - reponse : "C"}, + { + question: "What is allowed when passing another vehicle", + propositionA: "You follow it closely to pass it faster", + propositionB: "You pass it without leaving the roadway", + propositionC: "You drive on the opposite side of the road to pass", + propositionD: "You exceed the speed limit to pass them", + reponse: "C" + }, - { question : "You are driving on a highway which indicates a maximum speed of 70 mph. Most traffic drives at 75 mph, so you should not drive faster than:", - propositionA : "50 mph", - propositionB : "25 mph", - propositionC : "30 mph", - propositionD : "70 mph", - reponse : "D"}, + { + question: "You are driving on a highway which indicates a maximum speed of 120 km/h. But most trafficers drive at 125 km/h, so you should not drive faster than:", + propositionA: "120 km/h", + propositionB: "125 km/h", + propositionC: "130 km/h", + propositionD: "110 km/h", + reponse: "A" + }, - { question : "When you are overtaken by another vehicle it is important NOT to:", - propositionA : "Slow Down", - propositionB : "Check your mirrors", - propositionC : "Watch other drivers", - propositionD : "Increase your speed", - reponse : "D"}, + { + question: "When you are overtaken by another vehicle it is important NOT to:", + propositionA: "Slow Down", + propositionB: "Check your mirrors", + propositionC: "Watch other drivers", + propositionD: "Increase your speed", + reponse: "D" + }, ] diff --git a/html/questions_fi.js b/html/questions_fi.js index eda062cd..58aa65f6 100644 --- a/html/questions_fi.js +++ b/html/questions_fi.js @@ -1,71 +1,91 @@ var tableauQuestion = [ - { question : "Jos ajat 80km/h ja vastaan on tulossa asutus alue mitä teet ?", - propositionA : "Painat kaasua että pääset mahollisimman nopeaa pois", - propositionB : "Voit ajaa samaa vauhtia jos alueella ei ole muita autoja", - propositionC : "Sinun pitää hidastaa", - propositionD : "Voit jatkaa samaan malliin", - reponse : "C"}, - - { question : "Kun olet kääntymässä vasemmalle vihreistä valoista, näet jalankulkian jalkakäytävällä. Kummalla on lupa mennä ensin.", - propositionA : "Jalankulkijalla koska he voivat mennä tien yli millä valoilla tahansa", - propositionB : "Sinulla koska valo oli vihreä", - propositionC : "Jalankulkijalla, koska hänellä palaa vihreä valo", - propositionD : "Sinulla koska ajoneuvolla on aina oikeus ensin", - reponse : "C"}, - - { question : "Muualla ilmoittamatta, sallittu nopeus asutusalueella on ____ kmh.", - propositionA : "50", - propositionB : "55", - propositionC : "65", - propositionD : "70", - reponse : "A"}, - - { question : "Ennen jokaista kaistan vaihtoa, sinun pitäisi?", - propositionA : "Katsoa peilit", - propositionB : "Katsoa kuolleet kulmat", - propositionC : "Näyttää vilkuilla mitä aijot tehdä", - propositionD : "Kaikki yllä mainitut", - reponse : "D"}, - - { question : "Minkä veren alkoholipitoisuus luokitellaan päihtyneeksi?", - propositionA : "0.2 promillea", - propositionB : "0.8 promillea", - propositionC : "0.5 promillea", - propositionD : "0.4 promillea", - reponse : "C"}, - - { question : "Sinun on vedettävä sivuun ja pysähtyä, kunnes hälyytysajoneuvo on ajanut ohi sireenit päällä, ellei:", - propositionA : "Sinulla ole kiirre", - propositionB : "Jos hälyytysajoneuvolla on toisella kaistalla tilaa", - propositionC : "Olet koulunalueella", - propositionD : "Olet risteyksessä", - reponse : "D"}, - - { question : "Täytyykö poliisin vilkkuviin valoihin pysähtyä jos ne seuraavat sinua?", - propositionA : "Ei, jos poliisilla ei ole sireenejä päällä", - propositionB : "Kyllä", - propositionC : "Riippuu tilanteesta", - propositionD : "Ei", - reponse : "B"}, - - { question : "Mikä seuraavista on sallittua kun aloitat ohittaan ajoneuvoa?", - propositionA : "Ajaminen lähellä ennen ohitusta", - propositionB : "Koitat ajaa katukivetyksen kautta", - propositionC : "Ajaminen vastakkaisella kaistalla", - propositionD : "Nopeusrajoituksen ylittäminen", - reponse : "A"}, - - { question : "Ajat moottoritiellä, jonka nopeus on 120 km/h. Suurinosa liikenteestä ajaa 130km/h, joten sinun ei pitäisi ajaa nopeampaa kuin", - propositionA : "80 kmh", - propositionB : "40 kmh", - propositionC : "50 kmh", - propositionD : "120 kmh", - reponse : "D"}, - - { question : "Kun sinut ohittaa toinen ajoneuvo, mitä sinun EI pitäisi tehdä?", - propositionA : "Hiljentää", - propositionB : "Tarkistaa peilit", - propositionC : "Katsot toista kuskia", - propositionD : "Kiihdyttää", - reponse : "D"}, + { + question: "Jos ajat 80km/h ja vastaan on tulossa asutus alue mitä teet ?", + propositionA: "Painat kaasua että pääset mahollisimman nopeaa pois", + propositionB: "Voit ajaa samaa vauhtia jos alueella ei ole muita autoja", + propositionC: "Sinun pitää hidastaa", + propositionD: "Voit jatkaa samaan malliin", + reponse: "C" + }, + + { + question: "Kun olet kääntymässä vasemmalle vihreistä valoista, näet jalankulkian jalkakäytävällä. Kummalla on lupa mennä ensin.", + propositionA: "Jalankulkijalla koska he voivat mennä tien yli millä valoilla tahansa", + propositionB: "Sinulla koska valo oli vihreä", + propositionC: "Jalankulkijalla, koska hänellä palaa vihreä valo", + propositionD: "Sinulla koska ajoneuvolla on aina oikeus ensin", + reponse: "C" + }, + + { + question: "Muualla ilmoittamatta, sallittu nopeus asutusalueella on ____ km/h.", + propositionA: "50", + propositionB: "55", + propositionC: "65", + propositionD: "70", + reponse: "A" + }, + + { + question: "Ennen jokaista kaistan vaihtoa, sinun pitäisi?", + propositionA: "Katsoa peilit", + propositionB: "Katsoa kuolleet kulmat", + propositionC: "Näyttää vilkuilla mitä aijot tehdä", + propositionD: "Kaikki yllä mainitut", + reponse: "D" + }, + + { + question: "Minkä veren alkoholipitoisuus luokitellaan päihtyneeksi?", + propositionA: "0.2 promillea", + propositionB: "0.8 promillea", + propositionC: "0.5 promillea", + propositionD: "0.4 promillea", + reponse: "C" + }, + + { + question: "Sinun on vedettävä sivuun ja pysähtyä, kunnes hälyytysajoneuvo on ajanut ohi sireenit päällä, ellei:", + propositionA: "Sinulla ole kiirre", + propositionB: "Jos hälyytysajoneuvolla on toisella kaistalla tilaa", + propositionC: "Olet koulunalueella", + propositionD: "Olet risteyksessä", + reponse: "D" + }, + + { + question: "Täytyykö poliisin vilkkuviin valoihin pysähtyä jos ne seuraavat sinua?", + propositionA: "Ei, jos poliisilla ei ole sireenejä päällä", + propositionB: "Kyllä", + propositionC: "Riippuu tilanteesta", + propositionD: "Ei", + reponse: "B" + }, + + { + question: "Mikä seuraavista on sallittua kun aloitat ohittaan ajoneuvoa?", + propositionA: "Ajaminen lähellä ennen ohitusta", + propositionB: "Koitat ajaa katukivetyksen kautta", + propositionC: "Ajaminen vastakkaisella kaistalla", + propositionD: "Nopeusrajoituksen ylittäminen", + reponse: "A" + }, + + { + question: "Ajat moottoritiellä, jonka nopeus on 120 km/h. Suurinosa liikenteestä ajaa 130km/h, joten sinun ei pitäisi ajaa nopeampaa kuin", + propositionA: "80 kmh", + propositionB: "40 kmh", + propositionC: "50 kmh", + propositionD: "120 kmh", + reponse: "D" + }, + + { + question: "Kun sinut ohittaa toinen ajoneuvo, mitä sinun EI pitäisi tehdä?", + propositionA: "Hiljentää", + propositionB: "Tarkistaa peilit", + propositionC: "Katsot toista kuskia", + propositionD: "Kiihdyttää", + reponse: "D" + }, ] diff --git a/html/questions_pl.js b/html/questions_pl.js index 9fba7dcc..cfbf8e03 100644 --- a/html/questions_pl.js +++ b/html/questions_pl.js @@ -1,71 +1,91 @@ var tableauQuestion = [ - { question : "Jeśli masz 80 km/h, a zbliżasz się do terenu zabudowanego, musisz:", - propositionA : "Przyspieszyć", - propositionB : "Zahamować po czym jechać 50 km/h", - propositionC : "Zwolnić", - propositionD : "Zachować prędkość", - reponse : "C"}, + { + question: "Jeśli masz 80 km/h, a zbliżasz się do terenu zabudowanego, musisz:", + propositionA: "Przyspieszyć", + propositionB: "Zahamować po czym jechać 50 km/h", + propositionC: "Zwolnić", + propositionD: "Zachować prędkość", + reponse: "C" + }, - { question : "Jeśli skręcasz w prawo na światłach bezkolizyjnych, ale widzisz przejście dla pieszych, co robisz:", - propositionA : "Przepuszczam pieszego", - propositionB : "Sprawdzam, czy w pobliżu nie ma innych pojazdów", - propositionC : "Zachowuje szczególną ostrożność i przejeżdżam", - propositionD : "Strzelam do pieszego i jadę dalej", - reponse : "C"}, + { + question: "Jeśli skręcasz w prawo na światłach bezkolizyjnych, ale widzisz przejście dla pieszych, co robisz:", + propositionA: "Przepuszczam pieszego", + propositionB: "Sprawdzam, czy w pobliżu nie ma innych pojazdów", + propositionC: "Zachowuje szczególną ostrożność i przejeżdżam", + propositionD: "Strzelam do pieszego i jadę dalej", + reponse: "C" + }, - { question : "Bez wcześniejszego wskazania prędkość w obszarze zabudowanym wynosi: __ km/h", - propositionA : "40", - propositionB : "50", - propositionC : "60", - propositionD : "70", - reponse : "B"}, + { + question: "Bez wcześniejszego wskazania prędkość w obszarze zabudowanym wynosi: __ km/h", + propositionA: "40", + propositionB: "50", + propositionC: "60", + propositionD: "70", + reponse: "B" + }, - { question : "Przed każdą zmianą pasa ruchu należy:", - propositionA : "Spojżeć w lusterka", - propositionB : "Sprawdź swoje martwe pole", - propositionC : "Zasygnalizuj swoje zamiary", - propositionD : "Wszystkie powyższe", - reponse : "D"}, + { + question: "Przed każdą zmianą pasa ruchu należy:", + propositionA: "Spojżeć w lusterka", + propositionB: "Sprawdź swoje martwe pole", + propositionC: "Zasygnalizuj swoje zamiary", + propositionD: "Wszystkie powyższe", + reponse: "D" + }, - { question : "Jaki poziom alkoholu we krwi NIE jest klasyfikowany jako jazda po pijanemu?", - propositionA : "0.02%", - propositionB : "0.19%", - propositionC : "0.05%", - propositionD : "0.04%", - reponse : "A"}, + { + question: "Jaki poziom alkoholu we krwi NIE jest klasyfikowany jako jazda po pijanemu?", + propositionA: "0.02%", + propositionB: "0.19%", + propositionC: "0.05%", + propositionD: "0.04%", + reponse: "A" + }, - { question : "Kiedy możesz kontynuować jazdę na światłach?", - propositionA : "Kiedy zaświeci się zielone", - propositionB : "Kiedy nie ma nikogo na skrzyżowaniu", - propositionC : "Kiedy zaświeci się żółte", - propositionD : "Kiedy jest zielony lub czerwony ale skręcasz w prawo", - reponse : "A"}, + { + question: "Kiedy możesz kontynuować jazdę na światłach?", + propositionA: "Kiedy zaświeci się zielone", + propositionB: "Kiedy nie ma nikogo na skrzyżowaniu", + propositionC: "Kiedy zaświeci się żółte", + propositionD: "Kiedy jest zielony lub czerwony ale skręcasz w prawo", + reponse: "A" + }, - { question : "Przewożąc ładunek gabarytowy możesz poruszać się tylko:", - propositionA : "Drogami do tego przeznaczonymi", - propositionB : "Nocami", - propositionC : "Drogami ekspresowymi", - propositionD : "Skrzyżowaniami o ruchu okrężnym", - reponse : "B"}, + { + question: "Przewożąc ładunek gabarytowy możesz poruszać się tylko:", + propositionA: "Drogami do tego przeznaczonymi", + propositionB: "Nocami", + propositionC: "Drogami ekspresowymi", + propositionD: "Skrzyżowaniami o ruchu okrężnym", + reponse: "B" + }, - { question : "Posiadając prawo jazdy kategorii B możesz prowadzić :", - propositionA : "Pojazd samochodowy o dopuszczalnej masie całkowitej nieprzekraczającej 3.5 t, z wyjątkiem autobusu i motocykla", - propositionB : "Zespołem pojazdów złożonym z pojazdu, o którym mowa wyżej, oraz z przyczepy lekkiej", - propositionC : "Zespołem pojazdów złożonym z pojazdu, o którym mowa wyżej, oraz z przyczepy innej niż lekka, o ile łączna dopuszczalna masa całkowita zespołu tych pojazdów nie przekracza 4250 kg", - propositionD : "Wszystkie powyższe", - reponse : "D"}, + { + question: "Posiadając prawo jazdy kategorii B możesz prowadzić :", + propositionA: "Pojazd samochodowy o dopuszczalnej masie całkowitej nieprzekraczającej 3.5 t, z wyjątkiem autobusu i motocykla", + propositionB: "Zespołem pojazdów złożonym z pojazdu, o którym mowa wyżej, oraz z przyczepy lekkiej", + propositionC: "Zespołem pojazdów złożonym z pojazdu, o którym mowa wyżej, oraz z przyczepy innej niż lekka, o ile łączna dopuszczalna masa całkowita zespołu tych pojazdów nie przekracza 4250 kg", + propositionD: "Wszystkie powyższe", + reponse: "D" + }, - { question : "Jedziesz autostradą, która wskazuje maksymalną prędkość 120 km/h. Większość aut jedzie z prędkością 140km/h, więc nie powinieneś jechać szybciej niż:", - propositionA : "120 km/h", - propositionB : "130 km/h", - propositionC : "140 km/h", - propositionD : "150 km/h", - reponse : "A"}, + { + question: "Jedziesz autostradą, która wskazuje maksymalną prędkość 120 km/h. Większość aut jedzie z prędkością 140km/h, więc nie powinieneś jechać szybciej niż:", + propositionA: "120 km/h", + propositionB: "130 km/h", + propositionC: "140 km/h", + propositionD: "150 km/h", + reponse: "A" + }, - { question : "Wyprzedzając inne pojazdy należy:", - propositionA : "Zwolnić", - propositionB : "Trąbić na wyprzedzany pojazd", - propositionC : "Oglądać wyprzedzany pojazd", - propositionD : "Zwiększ prędkość", - reponse : "D"}, + { + question: "Wyprzedzając inne pojazdy należy:", + propositionA: "Zwolnić", + propositionB: "Trąbić na wyprzedzany pojazd", + propositionC: "Oglądać wyprzedzany pojazd", + propositionD: "Zwiększ prędkość", + reponse: "D" + }, ] diff --git a/html/scripts.js b/html/scripts.js index e68ea08f..5f78d4e2 100644 --- a/html/scripts.js +++ b/html/scripts.js @@ -9,119 +9,124 @@ var nbPossibleQuestions = 10; // number of questions in database questions.js var lastClick = 0; function getRandomQuestion() { - var random = Math.floor(Math.random() * nbPossibleQuestions) + var random = Math.floor(Math.random() * nbPossibleQuestions) - while (true) { - if (questionUsed.indexOf(random) === -1) { - break - } + while (true) { + if (questionUsed.indexOf(random) === -1) { + break + } - random = Math.floor(Math.random() * nbPossibleQuestions) - } + random = Math.floor(Math.random() * nbPossibleQuestions) + } - questionUsed.push(random) + questionUsed.push(random) - return random + return random } // Partial Functions function closeMain() { - $(".home").css("display", "none"); + $(".home").css("display", "none"); } function openMain() { - $(".home").css("display", "block"); + $(".home").css("display", "block"); } function closeAll() { - $(".body").css("display", "none"); + $(".body").css("display", "none"); } function openQuestionnaire() { - $(".questionnaire-container").css("display", "block"); - var randomQuestion = getRandomQuestion(); - $("#questionNumero").html("Question: " + questionNumber); - $("#question").html(tableauQuestion[randomQuestion].question); - $(".answerA").html(tableauQuestion[randomQuestion].propositionA); - $(".answerB").html(tableauQuestion[randomQuestion].propositionB); - $(".answerC").html(tableauQuestion[randomQuestion].propositionC); - $(".answerD").html(tableauQuestion[randomQuestion].propositionD); - $('input[name=question]').attr('checked',false); - goodAnswer.push(tableauQuestion[randomQuestion].reponse); - $(".questionnaire-container .progression").val(questionNumber-1); + $(".questionnaire-container").css("display", "block"); + var randomQuestion = getRandomQuestion(); + + $("#questionNumero").html("Question: " + questionNumber); + $("#question").html(tableauQuestion[randomQuestion].question); + $(".answerA").html(tableauQuestion[randomQuestion].propositionA); + $(".answerB").html(tableauQuestion[randomQuestion].propositionB); + $(".answerC").html(tableauQuestion[randomQuestion].propositionC); + $(".answerD").html(tableauQuestion[randomQuestion].propositionD); + $('input[name=question]').attr('checked', false); + + goodAnswer.push(tableauQuestion[randomQuestion].reponse); + $(".questionnaire-container .progression").val(questionNumber - 1); } function openResultGood() { - $(".resultGood").css("display", "block"); + $(".resultGood").css("display", "block"); } function openResultBad() { - $(".resultBad").css("display", "block"); + $(".resultBad").css("display", "block"); } function openContainer() { - $(".question-container").css("display", "block"); + $(".question-container").css("display", "block"); } function closeContainer() { - $(".question-container").css("display", "none"); + $(".question-container").css("display", "none"); } // Listen for NUI Events -window.addEventListener('message', function(event){ +window.addEventListener('message', function (event) { - var item = event.data; - // Open & Close main gang window - if(item.openQuestion == true) { - openContainer(); - openMain(); - } - if(item.openQuestion == false) { - closeContainer(); - closeMain(); - } - // Open sub-windows / partials - if(item.openSection == "question") { - closeAll(); - openQuestionnaire(); - } + var item = event.data; + + // Open & Close main window + if (item.openQuestion == true) { + openContainer(); + openMain(); + } + + if (item.openQuestion == false) { + closeContainer(); + closeMain(); + } + + // Open sub-windows / partials + if (item.openSection == "question") { + closeAll(); + openQuestionnaire(); + } }); // Handle Button Presses -$(".btnQuestion").click(function(){ - $.post('http://esx_dmvschool/question', JSON.stringify({})); -}); -$(".btnClose").click(function(){ - $.post('http://esx_dmvschool/close', JSON.stringify({})); -}); -$(".btnKick").click(function(){ - $.post('http://esx_dmvschool/kick', JSON.stringify({})); +$(".btnQuestion").click(function () { + $.post('http://esx_dmvschool/question', JSON.stringify({})); }); +$(".btnClose").click(function () { + $.post('http://esx_dmvschool/close', JSON.stringify({})); +}); + +$(".btnKick").click(function () { + $.post('http://esx_dmvschool/kick', JSON.stringify({})); +}); // Handle Form Submits -$("#question-form").submit(function(e) { +$("#question-form").submit(function (e) { - e.preventDefault(); + e.preventDefault(); - if(questionNumber!=nbQuestionToAnswer){ - //question 1 to 9 : pushing answer in array - closeAll(); - userAnswer.push($('input[name="question"]:checked').val()); - questionNumber++; - openQuestionnaire(); - } - else { - // question 10 : comparing arrays and sending number of good answers - userAnswer.push($('input[name="question"]:checked').val()); - var nbGoodAnswer = 0; - for (i = 0; i < nbQuestionToAnswer; i++) { - if (userAnswer[i] == goodAnswer[i]) { - nbGoodAnswer++; - } - } - closeAll(); - if(nbGoodAnswer >= nbAnswerNeeded) { - openResultGood(); - } - else{ - openResultBad(); - } - } + if (questionNumber != nbQuestionToAnswer) { + //question 1 to 9 : pushing answer in array + closeAll(); + userAnswer.push($('input[name="question"]:checked').val()); + questionNumber++; + openQuestionnaire(); + } else { + // question 10 : comparing arrays and sending number of good answers + userAnswer.push($('input[name="question"]:checked').val()); + var nbGoodAnswer = 0; + for (i = 0; i < nbQuestionToAnswer; i++) { + if (userAnswer[i] == goodAnswer[i]) { + nbGoodAnswer++; + } + } - return false; + closeAll(); + if (nbGoodAnswer >= nbAnswerNeeded) { + openResultGood(); + } else { + openResultBad(); + } + } + + return false; }); diff --git a/html/ui.html b/html/ui.html index e0f8dcd0..59ffe301 100644 --- a/html/ui.html +++ b/html/ui.html @@ -13,23 +13,34 @@
- -

Bienvenu à votre Auto-école

-
Tous les citoyens de Los Santos doivent réussir leur examen de code avant de pouvoir conduire.
Prenez votre temps, répondez avec du bon sens, ne répondez pas au hasard.

- Examen de Code
- - L'examen de code coute 200$, cela n'est pas remboursé si vous échouez.
- - N'ayez pas peur, l'auto-école accepte les crédits, mais faite attention à ne pas vous endetter
- - Si vous loupez votre test une première fois, vous ne pouvez pas le repasser de suite, vous devrez le retenter un autre jour.

- Examen de Conduite
- - L'examen de Conduite coute 500$, comme pour l'examen de code, ce paiement ne vous sera pas remboursé si vous échoué.
- - La chose principale pour votre permis c'est de faire attention à ce qui vous entoure et surtout éviter les accidents !

+ +
+ +
+

Bienvenu à votre Auto-école

+
+
Tous les citoyens de Los Santos doivent réussir leur examen de code avant de pouvoir conduire. +
Prenez votre temps, répondez avec du bon sens, ne répondez pas au hasard. +
+
+
+ Examen de Code +
- L'examen de code coute 200$, cela n'est pas remboursé si vous échouez. +
- N'ayez pas peur, l'auto-école accepte les crédits, mais faite attention à ne pas vous endetter +
- Si vous loupez votre test une première fois, vous ne pouvez pas le repasser de suite, vous devrez le retenter un + autre jour. +
+
Examen de Conduite +
- L'examen de Conduite coute 500$, comme pour l'examen de code, ce paiement ne vous sera pas remboursé si vous échoué. +
- La chose principale pour votre permis c'est de faire attention à ce qui vous entoure et surtout éviter les accidents + !

-
+

Progrès

- +
@@ -49,42 +60,53 @@
-
+
- - + + -
+

Progrès

- +
- +
-

Bon travail !



Vous avez bien travaillé durant l'examen!

Vous pouvez maintenant fermer cette fenètre et passer à l'examen.
+
+

Bon travail !

+
+
Vous avez bien travaillé durant l'examen! +
+
Vous pouvez maintenant fermer cette fenètre et passer à l'examen.
-
+

Progrès

- +
-

Vous avez échoué



Vous n'êtes pas prêt pour ce test, essayez une nouvelle fois, plus tard...

+
+

Vous avez échoué

+
+
Vous n'êtes pas prêt pour ce test, essayez une nouvelle fois, plus tard... +
+
+
-
+

Progrès

- +
@@ -94,5 +116,5 @@ - + \ No newline at end of file diff --git a/html/ui_en.html b/html/ui_en.html index 4b4adfa6..322a6b60 100644 --- a/html/ui_en.html +++ b/html/ui_en.html @@ -1,98 +1,117 @@ - - + + -
-
- -
-

Driving School

-
- -
-
- -

Welcome to Driving School

-
All citizens of Los Santos must pass their exam before they can drive.
Take your time, answer with common sense, and do not answer randomly.

- Theory Test
- - The Theory Test costs $200, this is not refunded if you fail the test.
- - Don't be afraid, the driving school accepts credit, but be careful not to get into debt.
- - If you fail your test the first time, you can't retake it immediately, you'll have to take it at a later date.

- Driving Test
- - The Driving Test costs $500, just like the theory test, this payment will not be refunded if you fail.
- - Make sure you stay alert whilst driving, and avoid accidents!

-
-
- Start -
-
-

Progress

- -
-
- -
-
-

-

-
-
- - -
-
- - -
-
- - -
-
- - -
- -
-
-
-

Progress

- -
-
- -
-
-

Good work!



You did well during the examination.

You can close this window, and go take your road test(s).
-
-
- Close -
-
-

Progress

- -
-
-
-
-

You failed



You weren't ready for this test, try again later...

-
-
- Close -
-
-

Progress

- -
-
-
-
+
+
+ +
+

Driving School

+
+ +
+
+ +
+ +
+

Welcome to Driving School

+
+
All citizens of Los Santos must pass their exam before they can drive. +
Take your time, answer with common sense, and do not answer randomly. +
+
Theory Test +
- The Theory Test costs $200, this is not refunded if you fail the test. +
- Don't be afraid, the driving school accepts credit, but be careful not to get into debt. +
- If you fail your test the first time, you can't retake it immediately, you'll have to take it at a later date. +
+
Driving Test +
- The Driving Test costs $500, just like the theory test, this payment will not be refunded if you fail. +
- Make sure you stay alert whilst driving, and avoid accidents!

+
+
+
+ Start +
+
+

Progress

+ +
+
+ +
+
+

+

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+

Progress

+ +
+
+ +
+
+
+

Good work!

+
+
You did well during the examination. +
+
You can close this window, and go take your road test(s).
+
+
+ Close +
+
+

Progress

+ +
+
+
+
+
+

You failed

+
+
You weren't ready for this test, try again later... +
+
+
+
+
+ Close +
+
+

Progress

+ +
+
+
+
- - - - + + + + \ No newline at end of file diff --git a/html/ui_fi.html b/html/ui_fi.html index a47d4b74..117f33ca 100644 --- a/html/ui_fi.html +++ b/html/ui_fi.html @@ -1,98 +1,118 @@ - - + + -
-
- -
-

Autokoulu

-
- -
-
- -

Tervetuloa autokouluun

-
Vaadimme kaikilta kansalaisilta että pääset läpi teoriaoppitestin ennen kuin voit saada voimassa olevan ajokortin.
Varaa aikaa ja vastaa maalaisjärjellä, älä yritä vastata tuurilla.

- Teoriakoe
- - Teoriakoe maksaa 200 € ja siitä ei voi saada rahoja takaisin jos epäonnistut
- - Älä huoli, Autokoulu antaa maksaa luotolla, mutta älä ota liian paljon luottoa
- - Jos epäonnistut testissä, et voi ottaa sitä heti uudelleen, palaa takaisin toisella kertaa yrittään uudelleen.

- Inssi
- - Ajokortti vaihtoehtoja on useita ja hinnat vaihtelee niitten mukaan.
- - Inssin päätavote on kiinittää huomiota yksityiskohtiin, ympäristöön ja liikenteeseen. Älä myöskään kolaroi!

-
-
- Aloitus -
-
-

Edistyminen

- -
-
- -
-
-

-

-
-
- - -
-
- - -
-
- - -
-
- - -
- -
-
-
-

Edistyminen

- -
-
- -
-
-

Hienoa !



Sinulla meni testi aika hyvin!

Voit sulkea tämän ikkunan nyt ja jatkaa inssikokeeseen.
-
-
- Sulje -
-
-

Edistyminen

- -
-
-
-
-

Epäonnistuit



Et ole vielä valmis aloittaa suorittaa mitään ajokorttia, kokeile toisella kertaa.

-
-
- Sulje -
-
-

Edistyminen

- -
-
-
-
+
+
+ +
+

Autokoulu

+
+ +
+
+ +
+ +
+

Tervetuloa autokouluun

+
+
Vaadimme kaikilta kansalaisilta että pääset läpi teoriaoppitestin ennen kuin voit saada voimassa olevan ajokortin. +
Varaa aikaa ja vastaa maalaisjärjellä, älä yritä vastata tuurilla. +
+
+
+ Teoriakoe +
- Teoriakoe maksaa 200 € ja siitä ei voi saada rahoja takaisin jos epäonnistut +
- Älä huoli, Autokoulu antaa maksaa luotolla, mutta älä ota liian paljon luottoa +
- Jos epäonnistut testissä, et voi ottaa sitä heti uudelleen, palaa takaisin toisella kertaa yrittään uudelleen. +
+
Inssi +
- Ajokortti vaihtoehtoja on useita ja hinnat vaihtelee niitten mukaan. +
- Inssin päätavote on kiinittää huomiota yksityiskohtiin, ympäristöön ja liikenteeseen. Älä myöskään kolaroi!

+
+
+ Aloitus +
+
+

Edistyminen

+ +
+
+ +
+
+

+

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+

Edistyminen

+ +
+
+ +
+
+
+

Hienoa !

+
+
Sinulla meni testi aika hyvin! +
+
Voit sulkea tämän ikkunan nyt ja jatkaa inssikokeeseen.
+
+
+ Sulje +
+
+

Edistyminen

+ +
+
+
+
+
+

Epäonnistuit

+
+
Et ole vielä valmis aloittaa suorittaa mitään ajokorttia, kokeile toisella kertaa. +
+
+
+
+
+ Sulje +
+
+

Edistyminen

+ +
+
+
+
- - - - + + + + - + \ No newline at end of file diff --git a/html/ui_pl.html b/html/ui_pl.html index ad41217f..c7964f51 100644 --- a/html/ui_pl.html +++ b/html/ui_pl.html @@ -1,99 +1,118 @@ - - + + -
-
- -
-

Szkoła Jazdy

-
- -
-
- -

Witaj w szkole jazdy.

-
Wszyscy mieszkańcy naszej wyspy muszą zdać egzamin zanim zaczną jeździć po ulicach.
Nie spiesz się, odpowiadaj zgodnie z polskimi przepisami i nie odpowiadaj losowo.

- Egzamin teoretyczny
- - Test teoretyczny kosztuje 200 $, kwota uiszczana za każde podejście.
- - Jeśli nie zdasz za pierwszym razem możesz przystąpić ponownie
- - Nie obawiaj się, szkoła jazdy akceptuje kredyt, ale uważaj, aby nie zadłużać się za bardzo.
- - Jeśli nie zaliczysz egzaminu teoretycznego, nie możesz przystąpić do egzaminu praktycznego.

- Egzamin praktycznyt
- - Egzamin praktyczny kosztuje 500 $, tak jak w przypadku praktyki kwota uiszczana jest za każde podejście.
- - Zachowaj czujność podczas jazdy i unikaj wypadków!

-
-
- Start -
-
-

Postęp

- -
-
- -
-
-

-

-
-
- - -
-
- - -
-
- - -
-
- - -
- -
-
-
-

Postęp

- -
-
- -
-
-

Gratulacje!



Dobrze się spisałeś podczas egzaminu.

Możesz zamknąć to okno i przejść do egzaminu praktycznego.
-
-
- Zamknij -
-
-

Postęp

- -
-
-
-
-

Egzamin niezaliczony



Nie jesteś gotowy na ten test, spróbuj ponownie później ...

-
-
- Zamknij -
-
-

Postęp

- -
-
-
-
+
+
+ +
+

Szkoła Jazdy

+
+ +
+
+ +
+ +
+

Witaj w szkole jazdy.

+
+
Wszyscy mieszkańcy naszej wyspy muszą zdać egzamin zanim zaczną jeździć po ulicach. +
Nie spiesz się, odpowiadaj zgodnie z polskimi przepisami i nie odpowiadaj losowo. +
+
Egzamin teoretyczny +
- Test teoretyczny kosztuje 200 $, kwota uiszczana za każde podejście. +
- Jeśli nie zdasz za pierwszym razem możesz przystąpić ponownie +
- Nie obawiaj się, szkoła jazdy akceptuje kredyt, ale uważaj, aby nie zadłużać się za bardzo. +
- Jeśli nie zaliczysz egzaminu teoretycznego, nie możesz przystąpić do egzaminu praktycznego. +
+
Egzamin praktycznyt +
- Egzamin praktyczny kosztuje 500 $, tak jak w przypadku praktyki kwota uiszczana jest za każde podejście. +
- Zachowaj czujność podczas jazdy i unikaj wypadków!

+
+
+
+ Start +
+
+

Postęp

+ +
+
+ +
+
+

+

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+

Postęp

+ +
+
+ +
+
+
+

Gratulacje!

+
+
Dobrze się spisałeś podczas egzaminu. +
+
Możesz zamknąć to okno i przejść do egzaminu praktycznego.
+
+
+ Zamknij +
+
+

Postęp

+ +
+
+
+
+
+

Egzamin niezaliczony

+
+
Nie jesteś gotowy na ten test, spróbuj ponownie później ... +
+
+
+
+
+ Zamknij +
+
+

Postęp

+ +
+
+
+
- - - - + + + + \ No newline at end of file diff --git a/locales/br.lua b/locales/br.lua index 4358a08b..47f2fff4 100644 --- a/locales/br.lua +++ b/locales/br.lua @@ -1,16 +1,15 @@ Locales['br'] = { - ['you_paid'] = 'você pagou ~g~$%s~s~ para a auto escola', ['go_next_point'] = 'vá para o próximo ponto!', - ['in_town_speed'] = 'entrou na cidade, preste atenção à sua velocidade! Limite de velocidade: ~y~', - ['next_point_speed'] = 'vá para o próximo ponto! Limite de velocidade: ~y~', + ['in_town_speed'] = 'entrou na cidade, preste atenção à sua velocidade! Limite de velocidade: ~y~%s~s~ km/h', + ['next_point_speed'] = 'vá para o próximo ponto! Limite de velocidade: ~y~%s~s~ km/h', ['stop_for_ped'] = '~r~Pare~s~ para o pedestre atravessar o ~y~cruzando', ['good_lets_cont'] = '~g~Boa~s~, vamos continuar.', - ['stop_look_left'] = '~r~Pare~s~ and look ~y~left~s~. Speed Limit:~y~ ', + ['stop_look_left'] = '~r~Pare~s~ and look ~y~left~s~. Limite de velocidade: ~y~%s~s~ km/h', ['good_turn_right'] = '~g~Boa~s~, vire à direita e siga a em frente', ['watch_traffic_lightson'] = 'observe o trânsito e ~y~acenda suas luzes~s~!', ['stop_for_passing'] = '~r~Pare~s~ olher para um lado e para o outro e veja ser não tem veículos passando!', - ['hway_time'] = 'é hora de dirigir na auto-estrada! Limite de velocidade:~y~ ', + ['hway_time'] = 'é hora de dirigir na auto-estrada! Limite de velocidade: ~y~%s~s~ km/h', ['gratz_stay_alert'] = 'Estou impressionado, mas não se esqueça de ficar ~r~alerta~s~ enquanto dirigindo!', ['passed_test'] = 'você ~g~passou~s~ no teste, parabéns!', ['failed_test'] = 'você ~r~falhou~s~ no teste, melhor sorte da próxima vez!', @@ -25,5 +24,4 @@ Locales['br'] = { ['driving_too_fast'] = '~r~Você está dirigindo rápido demais~s~ o limite de velocidade atual é: ~y~%s~s~ km/h!', ['errors'] = 'erros: ~r~%s~s~/%s', ['you_damaged_veh'] = 'você danificou o veículo', - } diff --git a/locales/en.lua b/locales/en.lua index 7a22e717..6df3f17f 100644 --- a/locales/en.lua +++ b/locales/en.lua @@ -1,16 +1,15 @@ Locales['en'] = { - ['you_paid'] = 'you paid ~g~$%s~s~ to the DMV school', ['go_next_point'] = 'go to the next point!', - ['in_town_speed'] = 'entered town, pay attention to your speed! Speed Limit: ~y~', - ['next_point_speed'] = 'go to the next point! Speed Limit: ~y~', + ['in_town_speed'] = 'entered town, pay attention to your speed! Speed Limit: ~y~%s~s~ km/h', + ['next_point_speed'] = 'go to the next point! Speed Limit: ~y~%s~s~ km/h', ['stop_for_ped'] = '~r~Stop~s~ for the pedestrian ~y~crossing', ['good_lets_cont'] = '~g~Good~s~, continue.', - ['stop_look_left'] = '~r~Stop~s~ and look ~y~left~s~. Speed Limit:~y~ ', + ['stop_look_left'] = '~r~Stop~s~ and look ~y~left~s~. Speed Limit: ~y~%s~s~ km/h', ['good_turn_right'] = '~g~Good~s~, turn right and follow the line', ['watch_traffic_lightson'] = 'watch the traffic and ~y~turn on your lights~s~!', ['stop_for_passing'] = '~r~Stop~s~ for passing vehicles!', - ['hway_time'] = 'it\'s time to drive on the highway! Speed Limit:~y~ ', + ['hway_time'] = 'it\'s time to drive on the highway! Speed Limit: ~y~%s~s~ km/h', ['gratz_stay_alert'] = 'i\'m impressed, but don\'t forget to stay ~r~alert~s~ whilst driving!', ['passed_test'] = 'you ~g~passed~s~ the test, congratulations!', ['failed_test'] = 'you ~r~failed~s~ the test, better luck next time!', @@ -25,5 +24,4 @@ Locales['en'] = { ['driving_too_fast'] = '~r~You\'re driving too fast,~s~ the current speed limit is: ~y~%s~s~ km/h!', ['errors'] = 'mistakes: ~r~%s~s~/%s', ['you_damaged_veh'] = 'you damaged the vehicle', - } diff --git a/locales/fi.lua b/locales/fi.lua index 4d58dd5f..33745498 100644 --- a/locales/fi.lua +++ b/locales/fi.lua @@ -1,29 +1,27 @@ Locales['fi'] = { - - ['you_paid'] = 'sinä maksoit ~g~$', + ['you_paid'] = 'you paid ~g~$%s~s~ to the DMV school', ['go_next_point'] = 'mene seuraavaan pisteeseen.', - ['in_town_speed'] = 'saavuit kaupunkiin! Seuraa nopeuttasi Nopeusrajoitus: ~y~', - ['next_point_speed'] = 'mene seuraavaan pisteeseen Nopeusrajoitus: ~y~', + ['in_town_speed'] = 'saavuit kaupunkiin! Seuraa nopeuttasi Nopeusrajoitus: ~y~%s~s~ km/h', + ['next_point_speed'] = 'mene seuraavaan pisteeseen Nopeusrajoitus: ~y~%s~s~ km/h', ['stop_for_ped'] = '~r~Pysähdy~s~ katso tietä ~y~ylittäviä ~w~ jalankulikijoita', ['good_lets_cont'] = '~g~Hyvä~s~, jatkakaa.', - ['stop_look_left'] = '~r~Pysähdy~s~ ja katso ~y~vasemmalle~s~. Nopeusrajoitus:~y~ ', + ['stop_look_left'] = '~r~Pysähdy~s~ ja katso ~y~vasemmalle~s~. Nopeusrajoitus: ~y~%s~s~ km/h', ['good_turn_right'] = '~g~Hyvä~s~, käänny oikealle ja seuraa kaistaa', ['watch_traffic_lightson'] = 'seuraa liikennettä, ja ~y~käänny kun valot ovat vihreät~s~!', ['stop_for_passing'] = '~r~Pysähdy~s~ ohi menevien autojen vuoksi', - ['hway_time'] = 'on aika mennä moottoritielle. Nopeusrajoitus:~y~ ', + ['hway_time'] = 'on aika mennä moottoritielle. Nopeusrajoitus: ~y~%s~s~ km/h', ['gratz_stay_alert'] = 'onnitelut, ole ~r~tarkkana~s~ kun ajat!', ['passed_test'] = 'sinä ~g~läpäisit~s~ kokeen', ['failed_test'] = 'sinä ~r~epäonnistuit~s~ kokeessa', - ['theory_test'] = 'Teoriakoe $', - ['road_test_car'] = 'Ajokoe $', - ['road_test_bike'] = 'moottoripyörä ajokoe $', - ['road_test_truck'] = 'rekka ajokoe $', + ['theory_test'] = 'teoriakoe', + ['road_test_car'] = 'ajokoe', + ['road_test_bike'] = 'moottoripyörä ajokoe', + ['road_test_truck'] = 'rekka ajokoe', ['driving_school'] = 'Autokoulu', ['press_open_menu'] = 'paina ~INPUT_CONTEXT~ hankkiaksesi ajokortin', ['driving_school_blip'] = 'Autokoulu', ['driving_test_complete'] = 'ajokoe suoritettu', - ['driving_too_fast'] = '~r~Ajat liian nopeeta! Hidasta!~s~ Nopeusrajoitus:~y~ ', - ['errors'] = 'virheet: ~r~', + ['driving_too_fast'] = '~r~Ajat liian nopeeta! Hidasta!~s~ Nopeusrajoitus: ~y~%s~s~ km/h!', + ['errors'] = 'mistakes: ~r~%s~s~/%s', ['you_damaged_veh'] = 'sinä vahingoitit ajoneuvoa. Aja varovaisemmin...', - } diff --git a/locales/fr.lua b/locales/fr.lua index 6c34d87e..8668d3bb 100644 --- a/locales/fr.lua +++ b/locales/fr.lua @@ -1,16 +1,15 @@ Locales['fr'] = { - ['you_paid'] = 'vous avez payé ~g~$%s~s~', - ['go_next_point'] = 'allez vers le prochain passage !', - ['in_town_speed'] = 'entrée en ville, attention à votre vitesse ! Vitesse limite : ~y~', - ['next_point_speed'] = 'allez vers le prochain passage ! Vitesse limite : ~y~', + ['go_next_point'] = 'allez vers le prochain passage!', + ['in_town_speed'] = 'entrée en ville, attention à votre vitesse! Vitesse limite: ~y~%s~s~ km/h', + ['next_point_speed'] = 'allez vers le prochain passage! Vitesse limite: ~y~%s~s~ km/h', ['stop_for_ped'] = 'faite rapidement un ~r~stop~s~ pour le piéton qui ~y~traverse', ['good_lets_cont'] = '~g~Bien!~s~ continuons!', - ['stop_look_left'] = 'marquer rapidement un ~r~stop~s~ et regardez à votre ~y~gauche~s~. Vitesse limite : ~y~', + ['stop_look_left'] = 'marquer rapidement un ~r~stop~s~ et regardez à votre ~y~gauche~s~. Vitesse limite: ~y~%s~s~ km/h', ['good_turn_right'] = '~g~Bien!~s~ prenez à ~y~droite~s~ et suivez votre file', - ['watch_traffic_lightson'] = 'observez le traffic ~y~allumez vos feux~s~ !', - ['stop_for_passing'] = 'marquez le stop pour laisser passer les véhicules !', - ['hway_time'] = 'il est temps d\'aller sur la rocade ! Vitesse limite : ~y~', + ['watch_traffic_lightson'] = 'observez le traffic ~y~allumez vos feux~s~!', + ['stop_for_passing'] = 'marquez le stop pour laisser passer les véhicules!', + ['hway_time'] = 'il est temps d\'aller sur la rocade! Vitesse limite: ~y~%s~s~ km/h', ['gratz_stay_alert'] = 'bravo, restez vigiliant!', ['passed_test'] = 'vous avez ~g~réussi~s~ le test', ['failed_test'] = 'vous avez ~r~raté~s~ le test', @@ -23,7 +22,6 @@ Locales['fr'] = { ['driving_school_blip'] = 'auto-école', ['driving_test_complete'] = 'test de conduite terminé', ['driving_too_fast'] = 'vous roulez trop vite, vitesse limite: ~y~%s~s~ km/h!', - ['errors'] = 'erreurs : ~r~%s~s~/%s', + ['errors'] = 'erreurs: ~r~%s~s~/%s', ['you_damaged_veh'] = 'vous avez endommagé votre véhicule', - } diff --git a/locales/pl.lua b/locales/pl.lua index 8195f986..703fe405 100644 --- a/locales/pl.lua +++ b/locales/pl.lua @@ -1,15 +1,15 @@ Locales['pl'] = { ['you_paid'] = 'zapłaciłes ~g~$%s~s~ dla szkoły jazdy.', ['go_next_point'] = 'udaj się do nastepnego punktu!', - ['in_town_speed'] = 'wjeżdżasz do miasta, zachowaj ostrożność! Ograniczenie prędkości: ~y~', - ['next_point_speed'] = 'udaj się do nastepnego punktu! Ograniczenie prędkości: ~y~', + ['in_town_speed'] = 'wjeżdżasz do miasta, zachowaj ostrożność! Ograniczenie prędkości: ~y~%s~s~ km/h', + ['next_point_speed'] = 'udaj się do nastepnego punktu! Ograniczenie prędkości: ~y~%s~s~ km/h', ['stop_for_ped'] = '~r~Stop~s~ przejście ~y~dla pieszych', ['good_lets_cont'] = '~g~Świetnie~s~, kontynuuj.', - ['stop_look_left'] = '~r~Stop~s~ spójrz w ~y~lewo~s~. Ograniczenie prędkości:~y~ ', + ['stop_look_left'] = '~r~Stop~s~ spójrz w ~y~lewo~s~. Ograniczenie prędkości: ~y~%s~s~ km/h', ['good_turn_right'] = '~g~Świetnie~s~, skręć w prawo i podążaj za linią', ['watch_traffic_lightson'] = 'obserwuj ruch uliczny i ~y~włącz światła~s~!', ['stop_for_passing'] = '~r~Stop~s~ przepuść przejeżdźające pojazdy!', - ['hway_time'] = 'czas na autostradę! Ograniczenie prędkości:~y~ ', + ['hway_time'] = 'czas na autostradę! Ograniczenie prędkości: ~y~%s~s~ km/h', ['gratz_stay_alert'] = 'jestem pod wrażeniem, ale nie zapomnij się zatrzymać ~r~alert~s~ podczas jazdy!', ['passed_test'] = '~g~Zdałeś~s~ egzamin, gratulacje!', ['failed_test'] = '~r~Oblałeś~s~ egzamin, powodzenia następnym razem!', diff --git a/locales/sv.lua b/locales/sv.lua new file mode 100644 index 00000000..9171bafe --- /dev/null +++ b/locales/sv.lua @@ -0,0 +1,27 @@ +Locales['sv'] = { + ['you_paid'] = 'du betalade ~r~%s SEK~s~ till körskolan', + ['go_next_point'] = 'åk till nästa punkt!', + ['in_town_speed'] = 'du åker ni i stan, var uppmärksam på din hastighet! hastighetsgräns: ~y~', + ['next_point_speed'] = 'åk till nästa punkt! hastighetsgräns: ~y~%s~s~ km/h', + ['stop_for_ped'] = '~r~Stanna~s~ för fotgängare som korsar vägen!', + ['good_lets_cont'] = '~g~Bra~s~, fortsätt.', + ['stop_look_left'] = '~r~Stanna~s~ och kolla åt ~y~vänster~s~. Hastighetsgräns: ~y~%s~s~ km/h', + ['good_turn_right'] = '~g~Bra~s~, sväng höger och följ linjen', + ['watch_traffic_lightson'] = 'var vaken i trafiken och ~y~sätt på dina lampor~s~!', + ['stop_for_passing'] = '~r~Stanna~s~ för passerande fordon!', + ['hway_time'] = 'det är dags att köra på motorväg! Hastighetsgräns: ~y~%s~s~ km/h', + ['gratz_stay_alert'] = 'jag är imponerad, glöm inte vara ~r~pigg~s~ när du kör!', + ['passed_test'] = 'du ~g~passerade~s~ provet, gratulerar!', + ['failed_test'] = 'du ~r~kuggade~s~ provet, bättre lycka nästa gång', + ['theory_test'] = 'teoretiskt körningsprov', + ['road_test_car'] = 'B-körkort (personbil)', + ['road_test_bike'] = 'A-körkort (motorcykel)', + ['road_test_truck'] = 'C-körkort (lastbil)', + ['driving_school'] = 'körskola', + ['press_open_menu'] = 'tryck ~INPUT_CONTEXT~ för att öppna menyn', + ['driving_school_blip'] = 'körskola', + ['driving_test_complete'] = 'körprovet har avslutats', + ['driving_too_fast'] = '~r~Du kör för snabbt,~s~ den nuvarande hastighetsgräns är: ~y~%s~s~ km/h!', + ['errors'] = 'misstag: ~r~%s~s~/%s', + ['you_damaged_veh'] = 'du skadade fordonet!', +} From b1551054d3f3b9b0252d5186d78a8eb181e74f24 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Fri, 24 Aug 2018 18:42:18 +0200 Subject: [PATCH 15/36] Added Swedish dmv school files --- html/questions_sv.js | 91 +++++++++++++++++++++++++++++++++ html/ui_sv.html | 117 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 208 insertions(+) create mode 100644 html/questions_sv.js create mode 100644 html/ui_sv.html diff --git a/html/questions_sv.js b/html/questions_sv.js new file mode 100644 index 00000000..6200edcd --- /dev/null +++ b/html/questions_sv.js @@ -0,0 +1,91 @@ +var tableauQuestion = [ + { + question: "Vilket alternativ beskriver defensiv körning?", + propositionA: "Motorbromsningar, överhopp av växlar och användande av motorvärmare.", + propositionB: "Försvarande av den egna positionen genom att exempelvis inte låta någon annan köra om.", + propositionC: "Lugn, säker och planerad körning utan stress.", + propositionD: "Då flera fordon kör i någon typ av följe.", + reponse: "C" + }, + + { + question: "Vad har katalysatorn för uppgift?", + propositionA: "Dämpar motorljudet (ljuddämpare).", + propositionB: "Underlättar kallstarter.", + propositionC: "Omvandlar över 80 % av de skadliga ämnena i avgaserna till vatten och koldioxid.", + propositionD: "Reducerar bilens koldioxidutsläpp med över 80 %.", + reponse: "C" + }, + + { + question: "Vad betyder den svarta 30-skylten?", + propositionA: "Rekommenderad högsta hastighet.", + propositionB: "Vägarbetet upphör den 30:e samma månad.", + propositionC: "Rekommenderad lägsta hastighet.", + propositionD: "Skylten är inget vägmärke, utan är till för vägarbetarna.", + reponse: "A" + }, + + { + question: "Vad är ett reversibelt körfält?", + propositionA: "Ett körfält där trafik i båda färdriktningarna tillåts samtidigt.", + propositionB: "Ett vändbart körfält vars färdriktning bestäms av trafiksignaler.", + propositionC: "Ett körfält som endast får användas av utryckningsfordon.", + propositionD: "Ett körfält där man måste se upp för älgar.", + reponse: "B" + }, + + { + question: "Vilket alternativ ger ett exempel på miljövänlig körning?", + propositionA: "Körning på så låga växlar som möjligt.", + propositionB: "Mycket långsam fartökning.", + propositionC: "Hoppa över växlar.", + propositionD: "Hålla motorns varvtal på minst 3 000 varv/minut.", + reponse: "C" + }, + + { + question: "Vad är sant för unga män med körkort?", + propositionA: "Unga män har en tendens att överskatta sin körförmåga mer när de precis har fått körkort än när de har haft körkort i något år.", + propositionB: "Unga män löper 5–6 gånger större risk att råka ut för en trafikolycka jämfört med de över 75 år.", + propositionC: "Unga män har bäst reaktionstid i trafiken.", + propositionD: "Unga män har en tendens att överskatta sin körförmåga mer när de har haft körkort i något år än när de precis har fått körkort.", + reponse: "D" + }, + + { + question: "Var går gränsen för rattfylleri?", + propositionA: "0,1 promille alkohol i blodet.", + propositionB: "0,2 promille alkohol i blodet.", + propositionC: "1,0 promille alkohol i blodet.", + propositionD: "1,2 promille alkohol i blodet.", + reponse: "B" + }, + + { + question: "Vad är reaktionssträckan?", + propositionA: "Sträckan du förflyttas från det att du upptäckt hindret tills dess att du börjar bromsa.", + propositionB: "Reaktionstiden + bromssträckan.", + propositionC: "Bromssträckan + stoppsträckan.", + propositionD: "Sträckan du förflyttas från det att du upptäckt hindret tills dess att du står stilla.", + reponse: "A" + }, + + { + question: "Du ökar hastigheten från 30 km/h till 90 km/h. Hur påverkas bromssträckan?", + propositionA: "Den blir 9 gånger längre.", + propositionB: "Den blir 3 gånger längre.", + propositionC: "Den blir 2 gånger längre.", + propositionD: "Den förblir oförändrad.", + reponse: "A" + }, + + { + question: "Hur stor del av människans synfält utgörs av periferiseendet?", + propositionA: "1-2 %", + propositionB: "25 %", + propositionC: "50 %", + propositionD: "98-99 %", + reponse: "D" + }, +] diff --git a/html/ui_sv.html b/html/ui_sv.html new file mode 100644 index 00000000..fa83b134 --- /dev/null +++ b/html/ui_sv.html @@ -0,0 +1,117 @@ + + + + + + +
+
+ +
+

Körskola

+
+ +
+
+ +
+ +
+

Välkommen till körskolan

+
+
Alla medborgare i Los Santos måste ha körkort för att få behörigheten att köra fordon +
Ta din tid, svara med sunt förnuft och svara inte slumpmässigt. +
+
Kunskapsprov +
- Det teoretiska provet kostar 200 SEK, och kommer ej återbetalas om du misslyckas. +
- Var inte rädd, körskolan accepterar kredit. Var dock försiktig så att du inte får en stor skuld. +
- Om du misslyckas med testet första gången kan du inte omedelbart återta det, du måste ta det på ett senare tillfälle. +
+
Uppkörning +
- Uppkörningen kostar 500 SEK, precis som den teoretiska delen. Denna betalning återbetalas ej om du misslyckas. +
- Se till att du är uppmärksam vid körning och försök undvik olyckor!

+
+
+
+ Start +
+
+

Framsteg

+ +
+
+ +
+
+

+

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+

Framsteg

+ +
+
+ +
+
+
+

Bra jobbat!

+
+
Du har klarat teoretiska delen av körkortet +
+
Du kan nu stänga det här fönstret och ta uppkörningen!
+
+
+ Stäng +
+
+

Framsteg

+ +
+
+
+
+
+

Du kuggade

+
+
Du var inte redo för detta prov, försök igen senare... +
+
+
+
+
+ Stäng +
+
+

Framsteg

+ +
+
+
+
+ + + + + + + \ No newline at end of file From 2a04be057578a1b1af1ec59907a6caf8d4149d4a Mon Sep 17 00:00:00 2001 From: Samuel Date: Fri, 24 Aug 2018 18:47:35 +0200 Subject: [PATCH 16/36] Final commit v1.0.4 --- __resource.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/__resource.lua b/__resource.lua index 6064ccb7..eed009cd 100644 --- a/__resource.lua +++ b/__resource.lua @@ -2,7 +2,7 @@ resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' description 'ESX DMV School' -version '1.0.5' +version '1.0.4' server_scripts { '@es_extended/locale.lua', @@ -43,4 +43,4 @@ files { dependencies { 'es_extended', 'esx_license' -} \ No newline at end of file +} From bc613821453d9e56e25a8208983a52f2c0370b17 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Sun, 9 Dec 2018 20:21:11 +0100 Subject: [PATCH 17/36] Minor changes --- client/main.lua | 6 +++--- config.lua | 2 +- html/scripts.js | 7 ++----- html/ui.html | 15 ++++++++++----- html/ui_en.html | 9 ++++++--- html/ui_fi.html | 12 ++++++++---- html/ui_pl.html | 6 ++++-- html/ui_sv.html | 12 ++++++++---- 8 files changed, 42 insertions(+), 27 deletions(-) diff --git a/client/main.lua b/client/main.lua index ca443cc4..70c61ce2 100644 --- a/client/main.lua +++ b/client/main.lua @@ -35,9 +35,9 @@ end) function DrawMissionText(msg, time) ClearPrints() - SetTextEntry_2('STRING') - AddTextComponentString(msg) - DrawSubtitleTimed(time, 1) + BeginTextCommandPrint('STRING') + AddTextComponentSubstringPlayerName(msg) + EndTextCommandPrint(time, true) end function StartTheoryTest() diff --git a/config.lua b/config.lua index d08b91db..ffd216a6 100644 --- a/config.lua +++ b/config.lua @@ -2,7 +2,7 @@ Config = {} Config.DrawDistance = 100.0 Config.MaxErrors = 5 Config.SpeedMultiplier = 3.6 -Config.Locale = 'fr' +Config.Locale = 'sv' Config.Prices = { dmv = 500, diff --git a/html/scripts.js b/html/scripts.js index 5f78d4e2..07f2e817 100644 --- a/html/scripts.js +++ b/html/scripts.js @@ -64,7 +64,6 @@ function closeContainer() { // Listen for NUI Events window.addEventListener('message', function (event) { - var item = event.data; // Open & Close main window @@ -100,17 +99,16 @@ $(".btnKick").click(function () { // Handle Form Submits $("#question-form").submit(function (e) { - e.preventDefault(); if (questionNumber != nbQuestionToAnswer) { - //question 1 to 9 : pushing answer in array + //question 1 to 9: pushing answer in array closeAll(); userAnswer.push($('input[name="question"]:checked').val()); questionNumber++; openQuestionnaire(); } else { - // question 10 : comparing arrays and sending number of good answers + // question 10: comparing arrays and sending number of good answers userAnswer.push($('input[name="question"]:checked').val()); var nbGoodAnswer = 0; for (i = 0; i < nbQuestionToAnswer; i++) { @@ -128,5 +126,4 @@ $("#question-form").submit(function (e) { } return false; - }); diff --git a/html/ui.html b/html/ui.html index 59ffe301..cfa3094c 100644 --- a/html/ui.html +++ b/html/ui.html @@ -17,7 +17,8 @@

-

Bienvenu à votre Auto-école

+

Bienvenu à votre Auto-école +

Tous les citoyens de Los Santos doivent réussir leur examen de code avant de pouvoir conduire.
Prenez votre temps, répondez avec du bon sens, ne répondez pas au hasard. @@ -27,12 +28,15 @@ Examen de Code
- L'examen de code coute 200$, cela n'est pas remboursé si vous échouez.
- N'ayez pas peur, l'auto-école accepte les crédits, mais faite attention à ne pas vous endetter -
- Si vous loupez votre test une première fois, vous ne pouvez pas le repasser de suite, vous devrez le retenter un +
- Si vous loupez votre test une première fois, vous ne pouvez pas le repasser de suite, vous devrez le + retenter un autre jour.

Examen de Conduite -
- L'examen de Conduite coute 500$, comme pour l'examen de code, ce paiement ne vous sera pas remboursé si vous échoué. -
- La chose principale pour votre permis c'est de faire attention à ce qui vous entoure et surtout éviter les accidents +
- L'examen de Conduite coute 500$, comme pour l'examen de code, ce paiement ne vous sera pas remboursé si + vous échoué. +
- La chose principale pour votre permis c'est de faire attention à ce qui vous entoure et surtout éviter les + accidents !

@@ -81,7 +85,8 @@

Vous avez bien travaillé durant l'examen!
-
Vous pouvez maintenant fermer cette fenètre et passer à l'examen. +
Vous pouvez maintenant fermer cette fenètre et passer à l'examen. +
Fermer diff --git a/html/ui_en.html b/html/ui_en.html index 322a6b60..1c841c2f 100644 --- a/html/ui_en.html +++ b/html/ui_en.html @@ -17,7 +17,8 @@

-

Welcome to Driving School

+

Welcome to Driving School +

All citizens of Los Santos must pass their exam before they can drive.
Take your time, answer with common sense, and do not answer randomly. @@ -25,7 +26,8 @@
Theory Test
- The Theory Test costs $200, this is not refunded if you fail the test.
- Don't be afraid, the driving school accepts credit, but be careful not to get into debt. -
- If you fail your test the first time, you can't retake it immediately, you'll have to take it at a later date. +
- If you fail your test the first time, you can't retake it immediately, you'll have to take it at a later + date.

Driving Test
- The Driving Test costs $500, just like the theory test, this payment will not be refunded if you fail. @@ -78,7 +80,8 @@

You did well during the examination.
-
You can close this window, and go take your road test(s).
+
You can close this window, and go take your road test(s). +
Close diff --git a/html/ui_fi.html b/html/ui_fi.html index 117f33ca..5e679388 100644 --- a/html/ui_fi.html +++ b/html/ui_fi.html @@ -17,9 +17,11 @@

-

Tervetuloa autokouluun

+

Tervetuloa autokouluun +
-

Vaadimme kaikilta kansalaisilta että pääset läpi teoriaoppitestin ennen kuin voit saada voimassa olevan ajokortin. +
Vaadimme kaikilta kansalaisilta että pääset läpi teoriaoppitestin ennen kuin voit saada voimassa olevan + ajokortin.
Varaa aikaa ja vastaa maalaisjärjellä, älä yritä vastata tuurilla.

@@ -27,7 +29,8 @@ Teoriakoe
- Teoriakoe maksaa 200 € ja siitä ei voi saada rahoja takaisin jos epäonnistut
- Älä huoli, Autokoulu antaa maksaa luotolla, mutta älä ota liian paljon luottoa -
- Jos epäonnistut testissä, et voi ottaa sitä heti uudelleen, palaa takaisin toisella kertaa yrittään uudelleen. +
- Jos epäonnistut testissä, et voi ottaa sitä heti uudelleen, palaa takaisin toisella kertaa yrittään + uudelleen.

Inssi
- Ajokortti vaihtoehtoja on useita ja hinnat vaihtelee niitten mukaan. @@ -79,7 +82,8 @@

Sinulla meni testi aika hyvin!
-
Voit sulkea tämän ikkunan nyt ja jatkaa inssikokeeseen.
+
Voit sulkea tämän ikkunan nyt ja jatkaa inssikokeeseen. +
Sulje diff --git a/html/ui_pl.html b/html/ui_pl.html index c7964f51..653ab9cd 100644 --- a/html/ui_pl.html +++ b/html/ui_pl.html @@ -17,7 +17,8 @@

-

Witaj w szkole jazdy.

+

Witaj w szkole jazdy. +

Wszyscy mieszkańcy naszej wyspy muszą zdać egzamin zanim zaczną jeździć po ulicach.
Nie spiesz się, odpowiadaj zgodnie z polskimi przepisami i nie odpowiadaj losowo. @@ -79,7 +80,8 @@

Dobrze się spisałeś podczas egzaminu.
-
Możesz zamknąć to okno i przejść do egzaminu praktycznego.
+
Możesz zamknąć to okno i przejść do egzaminu praktycznego. +
Zamknij diff --git a/html/ui_sv.html b/html/ui_sv.html index fa83b134..dc1a2939 100644 --- a/html/ui_sv.html +++ b/html/ui_sv.html @@ -17,7 +17,8 @@

-

Välkommen till körskolan

+

Välkommen till körskolan +

Alla medborgare i Los Santos måste ha körkort för att få behörigheten att köra fordon
Ta din tid, svara med sunt förnuft och svara inte slumpmässigt. @@ -25,10 +26,12 @@
Kunskapsprov
- Det teoretiska provet kostar 200 SEK, och kommer ej återbetalas om du misslyckas.
- Var inte rädd, körskolan accepterar kredit. Var dock försiktig så att du inte får en stor skuld. -
- Om du misslyckas med testet första gången kan du inte omedelbart återta det, du måste ta det på ett senare tillfälle. +
- Om du misslyckas med testet första gången kan du inte omedelbart återta det, du måste ta det på ett senare + tillfälle.

Uppkörning -
- Uppkörningen kostar 500 SEK, precis som den teoretiska delen. Denna betalning återbetalas ej om du misslyckas. +
- Uppkörningen kostar 500 SEK, precis som den teoretiska delen. Denna betalning återbetalas ej om du + misslyckas.
- Se till att du är uppmärksam vid körning och försök undvik olyckor!

@@ -78,7 +81,8 @@

Du har klarat teoretiska delen av körkortet
-
Du kan nu stänga det här fönstret och ta uppkörningen! +
Du kan nu stänga det här fönstret och ta uppkörningen! +
Stäng From eee905adb96bffb58d6b5d67d319310c5889bf73 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Sun, 30 Dec 2018 21:33:47 +0100 Subject: [PATCH 18/36] Check IsControlJustReleased() every frame --- client/main.lua | 32 ++++++++++++-------------------- locales/fi.lua | 2 +- 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/client/main.lua b/client/main.lua index 70c61ce2..aba47778 100644 --- a/client/main.lua +++ b/client/main.lua @@ -120,7 +120,6 @@ function OpenDMVSchoolMenu() end if ownedLicenses['dmv'] then - if not ownedLicenses['drive'] then table.insert(elements, {label = _U('road_test_car') .. ' $' .. Config.Prices['drive'] .. '', value = 'drive_test', type = 'drive'}) end @@ -132,7 +131,6 @@ function OpenDMVSchoolMenu() if not ownedLicenses['drive_truck'] then table.insert(elements, {label = _U('road_test_truck') .. ' $' .. Config.Prices['drive_truck'] .. '', value = 'drive_test', type = 'drive_truck'}) end - end ESX.UI.Menu.CloseAll() @@ -141,26 +139,21 @@ function OpenDMVSchoolMenu() { title = _U('driving_school'), elements = elements, - align = 'top-left', + align = 'top-left' }, function(data, menu) if data.current.value == 'theory_test' then menu.close() StartTheoryTest() - end - - if data.current.value == 'drive_test' then - menu.close() + elseif data.current.value == 'drive_test' then StartDriveTest(data.current.type) end + end, function(data, menu) + menu.close() - end, function(data, menu) - menu.close() - - CurrentAction = 'dmvschool_menu' - CurrentActionMsg = _U('press_open_menu') - CurrentActionData = {} - end - ) + CurrentAction = 'dmvschool_menu' + CurrentActionMsg = _U('press_open_menu') + CurrentActionData = {} + end) end RegisterNUICallback('question', function(data, cb) @@ -217,7 +210,7 @@ end) Citizen.CreateThread(function() while true do - Citizen.Wait(10) + Citizen.Wait(0) local coords = GetEntityCoords(PlayerPedId()) @@ -234,7 +227,7 @@ end) Citizen.CreateThread(function() while true do - Citizen.Wait(10) + Citizen.Wait(100) local coords = GetEntityCoords(PlayerPedId()) local isInMarker = false @@ -282,7 +275,7 @@ end) -- Key Controls Citizen.CreateThread(function() while true do - Citizen.Wait(10) + Citizen.Wait(0) if CurrentAction ~= nil then @@ -305,7 +298,7 @@ end) Citizen.CreateThread(function() while true do - Citizen.Wait(10) + Citizen.Wait(0) if CurrentTest == 'drive' then local playerPed = PlayerPedId() @@ -329,7 +322,6 @@ Citizen.CreateThread(function() else if CurrentCheckPoint ~= LastCheckPoint then - if DoesBlipExist(CurrentBlip) then RemoveBlip(CurrentBlip) end diff --git a/locales/fi.lua b/locales/fi.lua index 33745498..ec8cf1ec 100644 --- a/locales/fi.lua +++ b/locales/fi.lua @@ -3,7 +3,7 @@ Locales['fi'] = { ['go_next_point'] = 'mene seuraavaan pisteeseen.', ['in_town_speed'] = 'saavuit kaupunkiin! Seuraa nopeuttasi Nopeusrajoitus: ~y~%s~s~ km/h', ['next_point_speed'] = 'mene seuraavaan pisteeseen Nopeusrajoitus: ~y~%s~s~ km/h', - ['stop_for_ped'] = '~r~Pysähdy~s~ katso tietä ~y~ylittäviä ~w~ jalankulikijoita', + ['stop_for_ped'] = '~r~Pysähdy~s~ katso tietä ~y~ylittäviä ~s~ jalankulikijoita', ['good_lets_cont'] = '~g~Hyvä~s~, jatkakaa.', ['stop_look_left'] = '~r~Pysähdy~s~ ja katso ~y~vasemmalle~s~. Nopeusrajoitus: ~y~%s~s~ km/h', ['good_turn_right'] = '~g~Hyvä~s~, käänny oikealle ja seuraa kaistaa', From 3de89dca334cc8973c6844998599dd82b443defb Mon Sep 17 00:00:00 2001 From: AnthonyTCS <32744832+AnthonyTCS@users.noreply.github.com> Date: Wed, 3 Apr 2019 22:18:01 +0200 Subject: [PATCH 19/36] Fix freeze screen after failing the first test --- html/scripts.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/html/scripts.js b/html/scripts.js index 07f2e817..20ce760f 100644 --- a/html/scripts.js +++ b/html/scripts.js @@ -91,10 +91,18 @@ $(".btnQuestion").click(function () { $(".btnClose").click(function () { $.post('http://esx_dmvschool/close', JSON.stringify({})); + userAnswer = []; + goodAnswer = []; + questionUsed = []; + questionNumber = 1; }); $(".btnKick").click(function () { $.post('http://esx_dmvschool/kick', JSON.stringify({})); + userAnswer = []; + goodAnswer = []; + questionUsed = []; + questionNumber = 1; }); // Handle Form Submits From 6c83e15b4edd93bd57675defdbdb412c30f41da2 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Thu, 4 Apr 2019 19:15:30 +0200 Subject: [PATCH 20/36] Proper arguments, minor changes --- client/main.lua | 7 ++----- config.lua | 12 ++++++------ 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/client/main.lua b/client/main.lua index aba47778..ca12255b 100644 --- a/client/main.lua +++ b/client/main.lua @@ -135,8 +135,7 @@ function OpenDMVSchoolMenu() ESX.UI.Menu.CloseAll() - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'dmvschool_actions', - { + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'dmvschool_actions', { title = _U('driving_school'), elements = elements, align = 'top-left' @@ -209,7 +208,6 @@ end) -- Display markers Citizen.CreateThread(function() while true do - Citizen.Wait(0) local coords = GetEntityCoords(PlayerPedId()) @@ -219,7 +217,6 @@ Citizen.CreateThread(function() DrawMarker(v.Type, v.Pos.x, v.Pos.y, v.Pos.z, 0.0, 0.0, 0.0, 0, 0.0, 0.0, v.Size.x, v.Size.y, v.Size.z, v.Color.r, v.Color.g, v.Color.b, 100, false, true, 2, false, false, false, false) end end - end end) @@ -277,7 +274,7 @@ Citizen.CreateThread(function() while true do Citizen.Wait(0) - if CurrentAction ~= nil then + if CurrentAction then ESX.ShowHelpNotification(CurrentActionMsg) diff --git a/config.lua b/config.lua index ffd216a6..d58e6dd8 100644 --- a/config.lua +++ b/config.lua @@ -2,7 +2,7 @@ Config = {} Config.DrawDistance = 100.0 Config.MaxErrors = 5 Config.SpeedMultiplier = 3.6 -Config.Locale = 'sv' +Config.Locale = 'fr' Config.Prices = { dmv = 500, @@ -62,7 +62,7 @@ Config.CheckPoints = { Action = function(playerPed, vehicle, setCurrentZoneType) Citizen.CreateThread(function() DrawMissionText(_U('stop_for_ped'), 5000) - PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) + PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', false, 0, true) FreezeEntityPosition(vehicle, true) Citizen.Wait(4000) @@ -79,7 +79,7 @@ Config.CheckPoints = { Citizen.CreateThread(function() DrawMissionText(_U('stop_look_left', Config.SpeedLimits['town']), 5000) - PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) + PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', false, 0, true) FreezeEntityPosition(vehicle, true) Citizen.Wait(6000) @@ -107,7 +107,7 @@ Config.CheckPoints = { Pos = {x = -73.542, y = -1364.335, z = 27.789}, Action = function(playerPed, vehicle, setCurrentZoneType) DrawMissionText(_U('stop_for_passing'), 5000) - PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) + PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', false, 0, true) FreezeEntityPosition(vehicle, true) Citizen.Wait(6000) FreezeEntityPosition(vehicle, false) @@ -134,7 +134,7 @@ Config.CheckPoints = { setCurrentZoneType('freeway') DrawMissionText(_U('hway_time', Config.SpeedLimits['freeway']), 5000) - PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) + PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', false, 0, true) end }, @@ -171,7 +171,7 @@ Config.CheckPoints = { Pos = {x = 1163.603, y = -1841.771, z = 35.679}, Action = function(playerPed, vehicle, setCurrentZoneType) DrawMissionText(_U('gratz_stay_alert'), 5000) - PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', 0, 0, 1) + PlaySound(-1, 'RACE_PLACED', 'HUD_AWARDS', false, 0, true) end }, From cae59f4f2528ce319c85271dcdd3b355e01373fa Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Thu, 4 Apr 2019 19:18:00 +0200 Subject: [PATCH 21/36] Proper css indent --- html/styles.css | 260 ++++++++++++++++++++++++------------------------ 1 file changed, 131 insertions(+), 129 deletions(-) diff --git a/html/styles.css b/html/styles.css index 4653f29a..ad39fba4 100644 --- a/html/styles.css +++ b/html/styles.css @@ -1,185 +1,187 @@ html { - overflow: hidden; - font-family: 'Open Sans', sans-serif; + overflow: hidden; + font-family: 'Open Sans', sans-serif; } .full-screen { - width: 100%; - height:100%; - display: flex; - align-items: center; + width: 100%; + height: 100%; + display: flex; + align-items: center; } .question-container { - width: 70%; - height: 700px; - background-color: #fff; - border: 1px solid #222; - border-radius: 1px; - margin-left: auto; - margin-right: auto; - overflow: hidden; - z-index: 9999999; - display: none; + width: 70%; + height: 700px; + background-color: #fff; + border: 1px solid #222; + border-radius: 1px; + margin-left: auto; + margin-right: auto; + overflow: hidden; + z-index: 9999999; + display: none; } .header { - width:100%; - height: 20%; - background-color: #eee; - display: flex; - flex-direction: row; - flex-wrap: wrap; - justify-content: center; + width: 100%; + height: 20%; + background-color: #eee; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; } .header .logo { - width: 80%; - max-height: 50%; - margin: auto; - margin-bottom: 0; + width: 80%; + max-height: 50%; + margin: auto; + margin-bottom: 0; } .header h1 { - font-size: 2em; - text-align: center; - margin:auto; + font-size: 2em; + text-align: center; + margin: auto; } .body { - width: 100%; - height: 80%; - display: flex; - flex-direction: row; - flex-wrap: wrap; - display: none; + width: 100%; + height: 80%; + display: flex; + flex-direction: row; + flex-wrap: wrap; + display: none; } .content { - display: flex; - flex-direction: column; - align-self: center; - width: 90%; - height: 70%; - margin: auto; - border:none; + display: flex; + flex-direction: column; + align-self: center; + width: 90%; + height: 70%; + margin: auto; + border: none; } .content .logo { - width: auto; - max-height: auto; - margin: auto; - margin-bottom: 0; + width: auto; + max-height: auto; + margin: auto; + margin-bottom: 0; } .content h2, p { - margin: 5px; + margin: 5px; } .buttonspot { - display: flex; - flex-direction: column; - align-self: center; - width: auto; - height: 15%; - margin: auto; - border:none; + display: flex; + flex-direction: column; + align-self: center; + width: auto; + height: 15%; + margin: auto; + border: none; } .buttonspot h2, p { - margin: 5px; + margin: 5px; } .button { - width: 30%; - height: 40px; - align-self: center; - text-align: center; - margin-left: 40px; - margin-right: 40px; - background: #6699ff; - background-image: linear-gradient(to bottom, #6699ff, #4d88ff); - border-radius: 4px; - color: #ffffff; - font-size: 1.5em; - text-decoration: none; + width: 30%; + height: 40px; + align-self: center; + text-align: center; + margin-left: 40px; + margin-right: 40px; + background: #6699ff; + background-image: linear-gradient(to bottom, #6699ff, #4d88ff); + border-radius: 4px; + color: #ffffff; + font-size: 1.5em; + text-decoration: none; } - .form { - display: flex; - flex-direction: row; - justify-content: center; - flex-wrap: wrap; - width: 100%; - margin-top:5px; + display: flex; + flex-direction: row; + justify-content: center; + flex-wrap: wrap; + width: 100%; + margin-top: 5px; } .form div { - margin :auto; - margin-top:5px; - margin-bottom: 5px; - width: 100%; + margin: auto; + margin-top: 5px; + margin-bottom: 5px; + width: 100%; } -.submit{ - align-items: center; - height: 30px; - text-align: center; - width: 30%; - background: #017ebc; - background-image: linear-gradient(to bottom, #6699ff, #4d88ff); - border-radius: 4px; - color: #fff; - font-size: 1.2em; - margin-top: 10px; +.submit { + align-items: center; + height: 30px; + text-align: center; + width: 30%; + background: #017ebc; + background-image: linear-gradient(to bottom, #6699ff, #4d88ff); + border-radius: 4px; + color: #fff; + font-size: 1.2em; + margin-top: 10px; } .barre-progression { - width: 50%; - align-self: center; - height: 10%; - margin: auto; - margin-top: 0; - display: flex; - flex-wrap: wrap; - justify-content: center; - padding: 0; + width: 50%; + align-self: center; + height: 10%; + margin: auto; + margin-top: 0; + display: flex; + flex-wrap: wrap; + justify-content: center; + padding: 0; } -.barre-progression h2{ - width: 100%; - height: 60%; - text-align: center; - display: flex; - justify-content: center; - align-items: center; - margin:0; - color: #6699ff; +.barre-progression h2 { + width: 100%; + height: 60%; + text-align: center; + display: flex; + justify-content: center; + align-items: center; + margin: 0; + color: #6699ff; } .progression { - width: 80%; - border: 0 none; - background: #ddd; - border-radius: 14px; - box-shadow: inset 0px 1px 1px rgba(0,0,0,0.5), 0px 1px 0px rgba(255,255,255,0.2); + width: 80%; + border: 0 none; + background: #ddd; + border-radius: 14px; + box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.5), 0px 1px 0px rgba(255, 255, 255, 0.2); } -.progression::-moz-progress-bar { - background: #FFF; - border-radius: 14px; - box-shadow: inset 0 -2px 4px rgba(0,0,0,0.4), 0 2px 5px 0px rgba(0,0,0,0.3); -} -.progression::-webkit-progress-bar { - background: transparent; -} -.progression::-webkit-progress-value { - background-image: linear-gradient(to bottom, #6699ff, #4d88ff); - border-radius: 14px; - box-shadow: inset 0 -2px 4px rgba(0,0,0,0.4), 0 2px 5px 0px rgba(0,0,0,0.3); -} -.bold-text{ - font-weight: bold; - font-size: 1.3em; +.progression::-moz-progress-bar { + background: #FFF; + border-radius: 14px; + box-shadow: inset 0 -2px 4px rgba(0, 0, 0, 0.4), 0 2px 5px 0px rgba(0, 0, 0, 0.3); +} + +.progression::-webkit-progress-bar { + background: transparent; +} + +.progression::-webkit-progress-value { + background-image: linear-gradient(to bottom, #6699ff, #4d88ff); + border-radius: 14px; + box-shadow: inset 0 -2px 4px rgba(0, 0, 0, 0.4), 0 2px 5px 0px rgba(0, 0, 0, 0.3); +} + +.bold-text { + font-weight: bold; + font-size: 1.3em; } \ No newline at end of file From 4baac86207400488770864582043f6e2579224e0 Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Thu, 4 Apr 2019 19:22:35 +0200 Subject: [PATCH 22/36] Minor changes --- README.md | 2 +- html/scripts.js | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index bd0143b9..2e5fb53e 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ start esx_dmvschool ### License esx_dmvschool - realistic DMV school for ESX -Copyright (C) 2015-2018 Jérémie N'gadi +Copyright (C) 2015-2019 Jérémie N'gadi This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version. diff --git a/html/scripts.js b/html/scripts.js index 20ce760f..56d70097 100644 --- a/html/scripts.js +++ b/html/scripts.js @@ -9,19 +9,19 @@ var nbPossibleQuestions = 10; // number of questions in database questions.js var lastClick = 0; function getRandomQuestion() { - var random = Math.floor(Math.random() * nbPossibleQuestions) + var random = Math.floor(Math.random() * nbPossibleQuestions); while (true) { if (questionUsed.indexOf(random) === -1) { - break + break; } - random = Math.floor(Math.random() * nbPossibleQuestions) + random = Math.floor(Math.random() * nbPossibleQuestions); } - questionUsed.push(random) + questionUsed.push(random); - return random + return random; } // Partial Functions From 207440ae7521cebd1c248b0e3175a065183e835c Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Thu, 4 Apr 2019 19:32:13 +0200 Subject: [PATCH 23/36] Proper group digits and proper formatting --- client/main.lua | 30 ++++++++++++++++++++++-------- locales/br.lua | 1 + locales/en.lua | 1 + locales/fi.lua | 1 + locales/fr.lua | 1 + locales/pl.lua | 1 + locales/sv.lua | 1 + server/main.lua | 2 +- 8 files changed, 29 insertions(+), 9 deletions(-) diff --git a/client/main.lua b/client/main.lua index ca12255b..8f62976b 100644 --- a/client/main.lua +++ b/client/main.lua @@ -116,20 +116,35 @@ function OpenDMVSchoolMenu() local elements = {} if not ownedLicenses['dmv'] then - table.insert(elements, {label = _U('theory_test') .. ' $' .. Config.Prices['dmv'] .. '', value = 'theory_test'}) + table.insert(elements, { + label = (('%s: %s'):format(_U('theory_test'), _U('school_item', ESX.Math.GroupDigits(Config.Prices['dmv'])))), + value = 'theory_test' + }) end if ownedLicenses['dmv'] then if not ownedLicenses['drive'] then - table.insert(elements, {label = _U('road_test_car') .. ' $' .. Config.Prices['drive'] .. '', value = 'drive_test', type = 'drive'}) + table.insert(elements, { + label = (('%s: %s'):format(_U('road_test_car'), _U('school_item', ESX.Math.GroupDigits(Config.Prices['drive'])))), + value = 'drive_test', + type = 'drive' + }) end if not ownedLicenses['drive_bike'] then - table.insert(elements, {label = _U('road_test_bike') .. ' $' .. Config.Prices['drive_bike'] .. '', value = 'drive_test', type = 'drive_bike'}) + table.insert(elements, { + label = (('%s: %s'):format(_U('road_test_bike'), _U('school_item', ESX.Math.GroupDigits(Config.Prices['drive_bike'])))), + value = 'drive_test', + type = 'drive_bike' + }) end if not ownedLicenses['drive_truck'] then - table.insert(elements, {label = _U('road_test_truck') .. ' $' .. Config.Prices['drive_truck'] .. '', value = 'drive_test', type = 'drive_truck'}) + table.insert(elements, { + label = (('%s: %s'):format(_U('drive_truck'), _U('school_item', ESX.Math.GroupDigits(Config.Prices['drive_truck'])))), + value = 'drive_test', + type = 'drive_truck' + }) end end @@ -160,17 +175,17 @@ RegisterNUICallback('question', function(data, cb) openSection = 'question' }) - cb('OK') + cb() end) RegisterNUICallback('close', function(data, cb) StopTheoryTest(true) - cb('OK') + cb() end) RegisterNUICallback('kick', function(data, cb) StopTheoryTest(false) - cb('OK') + cb() end) AddEventHandler('esx_dmvschool:hasEnteredMarker', function(zone) @@ -275,7 +290,6 @@ Citizen.CreateThread(function() Citizen.Wait(0) if CurrentAction then - ESX.ShowHelpNotification(CurrentActionMsg) if IsControlJustReleased(0, Keys['E']) then diff --git a/locales/br.lua b/locales/br.lua index 47f2fff4..3058b104 100644 --- a/locales/br.lua +++ b/locales/br.lua @@ -17,6 +17,7 @@ Locales['br'] = { ['road_test_car'] = 'teste de habilidades de condução', ['road_test_bike'] = 'teste de habilidades da motocicleta', ['road_test_truck'] = 'teste de habilidades de caminhão', + ['school_item'] = '$%s', ['driving_school'] = 'escola de condução', ['press_open_menu'] = 'pressione ~INPUT_CONTEXT~ para abrir o menu', ['driving_school_blip'] = 'escola de condução', diff --git a/locales/en.lua b/locales/en.lua index 6df3f17f..55c3c945 100644 --- a/locales/en.lua +++ b/locales/en.lua @@ -17,6 +17,7 @@ Locales['en'] = { ['road_test_car'] = 'driving Test', ['road_test_bike'] = 'motorcycle Skills Test', ['road_test_truck'] = 'truck Skills Test', + ['school_item'] = '$%s', ['driving_school'] = 'driving School', ['press_open_menu'] = 'press ~INPUT_CONTEXT~ to open the menu', ['driving_school_blip'] = 'driving School', diff --git a/locales/fi.lua b/locales/fi.lua index ec8cf1ec..88a6cef7 100644 --- a/locales/fi.lua +++ b/locales/fi.lua @@ -17,6 +17,7 @@ Locales['fi'] = { ['road_test_car'] = 'ajokoe', ['road_test_bike'] = 'moottoripyörä ajokoe', ['road_test_truck'] = 'rekka ajokoe', + ['school_item'] = '$%s', ['driving_school'] = 'Autokoulu', ['press_open_menu'] = 'paina ~INPUT_CONTEXT~ hankkiaksesi ajokortin', ['driving_school_blip'] = 'Autokoulu', diff --git a/locales/fr.lua b/locales/fr.lua index 8668d3bb..7608d694 100644 --- a/locales/fr.lua +++ b/locales/fr.lua @@ -17,6 +17,7 @@ Locales['fr'] = { ['road_test_car'] = 'examen de conduite [voiture]', ['road_test_bike'] = 'examen de conduite [moto]', ['road_test_truck'] = 'examen de conduite [camion]', + ['school_item'] = '$%s', ['driving_school'] = 'ecole de conduite', ['press_open_menu'] = 'appuyez sur ~INPUT_CONTEXT~ pour ouvrir le menu', ['driving_school_blip'] = 'auto-école', diff --git a/locales/pl.lua b/locales/pl.lua index 703fe405..97e87a69 100644 --- a/locales/pl.lua +++ b/locales/pl.lua @@ -17,6 +17,7 @@ Locales['pl'] = { ['road_test_car'] = 'egzamin praktyczny kat. B', ['road_test_bike'] = 'egzamin praktyczny kat. A', ['road_test_truck'] = 'egzamin praktyczny kat. C', + ['school_item'] = '$%s', ['driving_school'] = 'szkoła jazdy', ['press_open_menu'] = 'wciśnij ~INPUT_CONTEXT~ by otworzyć menu', ['driving_school_blip'] = 'ośrodek egzaminacyjny', diff --git a/locales/sv.lua b/locales/sv.lua index 9171bafe..ff2b8fe9 100644 --- a/locales/sv.lua +++ b/locales/sv.lua @@ -17,6 +17,7 @@ Locales['sv'] = { ['road_test_car'] = 'B-körkort (personbil)', ['road_test_bike'] = 'A-körkort (motorcykel)', ['road_test_truck'] = 'C-körkort (lastbil)', + ['school_item'] = '%s SEK', ['driving_school'] = 'körskola', ['press_open_menu'] = 'tryck ~INPUT_CONTEXT~ för att öppna menyn', ['driving_school_blip'] = 'körskola', diff --git a/server/main.lua b/server/main.lua index dd364795..6b7133b0 100644 --- a/server/main.lua +++ b/server/main.lua @@ -25,5 +25,5 @@ AddEventHandler('esx_dmvschool:pay', function(price) local xPlayer = ESX.GetPlayerFromId(_source) xPlayer.removeMoney(price) - TriggerClientEvent('esx:showNotification', _source, _U('you_paid', price)) + TriggerClientEvent('esx:showNotification', _source, _U('you_paid', ESX.Math.GroupDigits(price))) end) From b796a76ec31dd22c503da62c2adea1241c5ce3aa Mon Sep 17 00:00:00 2001 From: rex2630 Date: Sat, 4 Jan 2020 19:49:37 +0100 Subject: [PATCH 24/36] Removed keys table --- client/main.lua | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/client/main.lua b/client/main.lua index 8f62976b..2b16b421 100644 --- a/client/main.lua +++ b/client/main.lua @@ -1,15 +1,3 @@ -local Keys = { - ["ESC"] = 322, ["F1"] = 288, ["F2"] = 289, ["F3"] = 170, ["F5"] = 166, ["F6"] = 167, ["F7"] = 168, ["F8"] = 169, ["F9"] = 56, ["F10"] = 57, - ["~"] = 243, ["1"] = 157, ["2"] = 158, ["3"] = 160, ["4"] = 164, ["5"] = 165, ["6"] = 159, ["7"] = 161, ["8"] = 162, ["9"] = 163, ["-"] = 84, ["="] = 83, ["BACKSPACE"] = 177, - ["TAB"] = 37, ["Q"] = 44, ["W"] = 32, ["E"] = 38, ["R"] = 45, ["T"] = 245, ["Y"] = 246, ["U"] = 303, ["P"] = 199, ["["] = 39, ["]"] = 40, ["ENTER"] = 18, - ["CAPS"] = 137, ["A"] = 34, ["S"] = 8, ["D"] = 9, ["F"] = 23, ["G"] = 47, ["H"] = 74, ["K"] = 311, ["L"] = 182, - ["LEFTSHIFT"] = 21, ["Z"] = 20, ["X"] = 73, ["C"] = 26, ["V"] = 0, ["B"] = 29, ["N"] = 249, ["M"] = 244, [","] = 82, ["."] = 81, - ["LEFTCTRL"] = 36, ["LEFTALT"] = 19, ["SPACE"] = 22, ["RIGHTCTRL"] = 70, - ["HOME"] = 213, ["PAGEUP"] = 10, ["PAGEDOWN"] = 11, ["DELETE"] = 178, - ["LEFT"] = 174, ["RIGHT"] = 175, ["TOP"] = 27, ["DOWN"] = 173, - ["NENTER"] = 201, ["N4"] = 108, ["N5"] = 60, ["N6"] = 107, ["N+"] = 96, ["N-"] = 97, ["N7"] = 117, ["N8"] = 61, ["N9"] = 118 -} - ESX = nil local CurrentAction = nil local CurrentActionMsg = nil @@ -292,7 +280,7 @@ Citizen.CreateThread(function() if CurrentAction then ESX.ShowHelpNotification(CurrentActionMsg) - if IsControlJustReleased(0, Keys['E']) then + if IsControlJustReleased(0, 38) then if CurrentAction == 'dmvschool_menu' then OpenDMVSchoolMenu() end @@ -412,4 +400,4 @@ Citizen.CreateThread(function() Citizen.Wait(500) end end -end) \ No newline at end of file +end) From 168cb1710f40eba0f9437540bac6cd68225520e6 Mon Sep 17 00:00:00 2001 From: rex2630 Date: Sun, 19 Jan 2020 17:47:42 +0100 Subject: [PATCH 25/36] Locale fix --- client/main.lua | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/client/main.lua b/client/main.lua index 2b16b421..8ddc344b 100644 --- a/client/main.lua +++ b/client/main.lua @@ -6,11 +6,10 @@ local Licenses = {} local CurrentTest = nil local CurrentTestType = nil local CurrentVehicle = nil -local CurrentCheckPoint = 0 +local CurrentCheckPoint, DriveErrors = 0, 0 local LastCheckPoint = -1 local CurrentBlip = nil local CurrentZoneType = nil -local DriveErrors = 0 local IsAboveSpeedLimit = false local LastVehicleHealth = nil @@ -129,7 +128,7 @@ function OpenDMVSchoolMenu() if not ownedLicenses['drive_truck'] then table.insert(elements, { - label = (('%s: %s'):format(_U('drive_truck'), _U('school_item', ESX.Math.GroupDigits(Config.Prices['drive_truck'])))), + label = (('%s: %s'):format(_U('road_test_truck'), _U('school_item', ESX.Math.GroupDigits(Config.Prices['drive_truck'])))), value = 'drive_test', type = 'drive_truck' }) From de844c9222871325e944f74584a47c09cd03bb8c Mon Sep 17 00:00:00 2001 From: rex2630 Date: Sun, 19 Jan 2020 17:50:55 +0100 Subject: [PATCH 26/36] Replace __resource.lua with fxmanifest.lua --- __resource.lua => fxmanifest.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) rename __resource.lua => fxmanifest.lua (91%) diff --git a/__resource.lua b/fxmanifest.lua similarity index 91% rename from __resource.lua rename to fxmanifest.lua index eed009cd..fe8e4b3c 100644 --- a/__resource.lua +++ b/fxmanifest.lua @@ -1,4 +1,6 @@ -resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' +fx_version 'adamant' + +game 'gta5' description 'ESX DMV School' From 98220cec20c4dbc8bebf72da0ec0f57e72c5915e Mon Sep 17 00:00:00 2001 From: ElPumpo Date: Tue, 14 Apr 2020 16:49:13 +0200 Subject: [PATCH 27/36] Latest ESX code --- README.md | 2 +- esx_dmvschool.sql | 2 +- localization/en_esx_dmvschool.sql | 2 +- localization/fi_esx_dmvschool.sql | 2 +- localization/sv_esx_dmvschool.sql | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2e5fb53e..164a46dc 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ start esx_dmvschool ### License esx_dmvschool - realistic DMV school for ESX -Copyright (C) 2015-2019 Jérémie N'gadi +Copyright (C) 2015-2020 Jérémie N'gadi This program Is free software: you can redistribute it And/Or modify it under the terms Of the GNU General Public License As published by the Free Software Foundation, either version 3 Of the License, Or (at your option) any later version. diff --git a/esx_dmvschool.sql b/esx_dmvschool.sql index a6ecd0cb..3f82f9a8 100644 --- a/esx_dmvschool.sql +++ b/esx_dmvschool.sql @@ -1,4 +1,4 @@ -USE `essentialmode`; +USE `es_extended`; INSERT INTO `licenses` (`type`, `label`) VALUES ('dmv', 'Code de la route'), diff --git a/localization/en_esx_dmvschool.sql b/localization/en_esx_dmvschool.sql index db2034e9..293f9289 100644 --- a/localization/en_esx_dmvschool.sql +++ b/localization/en_esx_dmvschool.sql @@ -1,4 +1,4 @@ -USE `essentialmode`; +USE `es_extended`; INSERT INTO `licenses` (`type`, `label`) VALUES ('dmv', 'Driving Permit'), diff --git a/localization/fi_esx_dmvschool.sql b/localization/fi_esx_dmvschool.sql index df8d6656..9f59e5b6 100644 --- a/localization/fi_esx_dmvschool.sql +++ b/localization/fi_esx_dmvschool.sql @@ -1,4 +1,4 @@ -USE `essentialmode`; +USE `es_extended`; INSERT INTO `licenses` (`type`, `label`) VALUES ('dmv', 'Teoriakoe'), diff --git a/localization/sv_esx_dmvschool.sql b/localization/sv_esx_dmvschool.sql index becaf0ff..51fd95f2 100644 --- a/localization/sv_esx_dmvschool.sql +++ b/localization/sv_esx_dmvschool.sql @@ -1,4 +1,4 @@ -USE `essentialmode`; +USE `es_extended`; INSERT INTO `licenses` (`type`, `label`) VALUES ('dmv', 'Körkortstillstånd'), From 85e43a0229ab2b2f0c85c157564eb03909d6e034 Mon Sep 17 00:00:00 2001 From: userMacieG Date: Tue, 14 Apr 2020 18:55:48 +0200 Subject: [PATCH 28/36] Change menu align Change menu align from `top-right` into `bottom-left` --- client/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/main.lua b/client/main.lua index 8ddc344b..a171a449 100644 --- a/client/main.lua +++ b/client/main.lua @@ -140,7 +140,7 @@ function OpenDMVSchoolMenu() ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'dmvschool_actions', { title = _U('driving_school'), elements = elements, - align = 'top-left' + align = 'bottom-right' }, function(data, menu) if data.current.value == 'theory_test' then menu.close() From fba9a11cebecff51f3690b785689601a9fc321c5 Mon Sep 17 00:00:00 2001 From: azgar44 <50982832+azgar44@users.noreply.github.com> Date: Sun, 3 May 2020 14:44:23 +0200 Subject: [PATCH 29/36] Add fr-FR translation database --- localization/fr_esx_dmvschool.sql | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 localization/fr_esx_dmvschool.sql diff --git a/localization/fr_esx_dmvschool.sql b/localization/fr_esx_dmvschool.sql new file mode 100644 index 00000000..29e9f38a --- /dev/null +++ b/localization/fr_esx_dmvschool.sql @@ -0,0 +1,8 @@ +USE `es_extended`; + +INSERT INTO `licenses` (`type`, `label`) VALUES + ('dmv', 'Permis de conduire'), + ('drive', 'Licence de conduite'), + ('drive_bike', 'Permis de motocyclette'), + ('drive_truck', 'Licence de conduite commerciale') +; From 8d53220461c1223a86d2c7f7d074b1440a3002f9 Mon Sep 17 00:00:00 2001 From: Gabriel Calderon <835733+gabrielcalderon@users.noreply.github.com> Date: Thu, 21 May 2020 14:44:16 -0400 Subject: [PATCH 30/36] Update main.lua * Changes to spawn test vehicle with 100% fuel level. * Code replicated from LegacyFuel SetFuel function. --- client/main.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/main.lua b/client/main.lua index 8ddc344b..c49a5e4e 100644 --- a/client/main.lua +++ b/client/main.lua @@ -72,6 +72,8 @@ function StartDriveTest(type) local playerPed = PlayerPedId() TaskWarpPedIntoVehicle(playerPed, vehicle, -1) + SetVehicleFuelLevel(vehicle, 100.0) + DecorSetFloat(vehicle, "_FUEL_LEVEL", GetVehicleFuelLevel(vehicle)) end) TriggerServerEvent('esx_dmvschool:pay', Config.Prices[type]) From a2565af907e097cbd168f3a1bc1259324f16343a Mon Sep 17 00:00:00 2001 From: Djamuras Date: Thu, 28 May 2020 21:12:30 +0300 Subject: [PATCH 31/36] Close menu before starting the test Simple fix, but i saw people struggling with it --- client/main.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/client/main.lua b/client/main.lua index c49a5e4e..ca4199d9 100644 --- a/client/main.lua +++ b/client/main.lua @@ -148,6 +148,7 @@ function OpenDMVSchoolMenu() menu.close() StartTheoryTest() elseif data.current.value == 'drive_test' then + menu.close() StartDriveTest(data.current.type) end end, function(data, menu) From c781c10c160051dbc0ff8c51d634eeecd689c382 Mon Sep 17 00:00:00 2001 From: Djamuras Date: Thu, 28 May 2020 21:52:59 +0300 Subject: [PATCH 32/36] Update main.lua --- client/main.lua | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/client/main.lua b/client/main.lua index ca4199d9..1999b90c 100644 --- a/client/main.lua +++ b/client/main.lua @@ -38,7 +38,7 @@ function StartTheoryTest() SetNuiFocus(true, true) end) - TriggerServerEvent('esx_dmvschool:pay', Config.Prices['dmv']) + end function StopTheoryTest(success) @@ -75,8 +75,6 @@ function StartDriveTest(type) SetVehicleFuelLevel(vehicle, 100.0) DecorSetFloat(vehicle, "_FUEL_LEVEL", GetVehicleFuelLevel(vehicle)) end) - - TriggerServerEvent('esx_dmvschool:pay', Config.Prices[type]) end function StopDriveTest(success) @@ -146,10 +144,22 @@ function OpenDMVSchoolMenu() }, function(data, menu) if data.current.value == 'theory_test' then menu.close() - StartTheoryTest() + ESX.TriggerServerCallback('esx_dmvschool:canYouPay', function(haveMoney) + if haveMoney then + StartTheoryTest() + else + ESX.ShowNotification(_U('not_enough_money')) + end + end, 'dmv') elseif data.current.value == 'drive_test' then menu.close() - StartDriveTest(data.current.type) + ESX.TriggerServerCallback('esx_dmvschool:canYouPay', function(haveMoney) + if haveMoney then + StartDriveTest(data.current.type) + else + ESX.ShowNotification(_U('not_enough_money')) + end + end, data.current.type) end end, function(data, menu) menu.close() From f3ca2d76e67cc2d416c633117b9cdc30bc7c10e3 Mon Sep 17 00:00:00 2001 From: Djamuras Date: Thu, 28 May 2020 21:53:50 +0300 Subject: [PATCH 33/36] Update en.lua --- locales/en.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/locales/en.lua b/locales/en.lua index 55c3c945..72adab8e 100644 --- a/locales/en.lua +++ b/locales/en.lua @@ -25,4 +25,5 @@ Locales['en'] = { ['driving_too_fast'] = '~r~You\'re driving too fast,~s~ the current speed limit is: ~y~%s~s~ km/h!', ['errors'] = 'mistakes: ~r~%s~s~/%s', ['you_damaged_veh'] = 'you damaged the vehicle', + ['not_enough_money'] = 'You don\'t have enough money', } From 99144215fcccf436ff50f8d858174cc461f3dc0c Mon Sep 17 00:00:00 2001 From: Djamuras Date: Thu, 28 May 2020 21:54:46 +0300 Subject: [PATCH 34/36] Check if you have enough money --- server/main.lua | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/server/main.lua b/server/main.lua index 6b7133b0..6eb493b1 100644 --- a/server/main.lua +++ b/server/main.lua @@ -2,6 +2,19 @@ ESX = nil TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) +ESX.RegisterServerCallback('esx_dmvschool:canYouPay', function(source, cb, type) + local xPlayer = ESX.GetPlayerFromId(source) + + if xPlayer.getMoney() >= Config.Prices[type] then + xPlayer.removeMoney(Config.Prices[type]) + TriggerClientEvent('esx:showNotification', source, _U('you_paid', Config.Prices[type])) + cb(true) + else + cb(false) + end +end) + + AddEventHandler('esx:playerLoaded', function(source) TriggerEvent('esx_license:getLicenses', source, function(licenses) TriggerClientEvent('esx_dmvschool:loadLicenses', source, licenses) @@ -19,11 +32,3 @@ AddEventHandler('esx_dmvschool:addLicense', function(type) end) end) -RegisterNetEvent('esx_dmvschool:pay') -AddEventHandler('esx_dmvschool:pay', function(price) - local _source = source - local xPlayer = ESX.GetPlayerFromId(_source) - - xPlayer.removeMoney(price) - TriggerClientEvent('esx:showNotification', _source, _U('you_paid', ESX.Math.GroupDigits(price))) -end) From d257e98797e8de19cd194cf8e40924a8f0fbe08e Mon Sep 17 00:00:00 2001 From: Jougito - Kheros Date: Mon, 27 Jul 2020 00:40:22 +0200 Subject: [PATCH 35/36] Spanish translation implemented (#51) * Spanish translation implemented * Create es_esx_dmvschool.sql --- fxmanifest.lua | 2 ++ locales/es.lua | 28 ++++++++++++++++++++++++++++ localization/es_esx_dmvschool.sql | 8 ++++++++ 3 files changed, 38 insertions(+) create mode 100644 locales/es.lua create mode 100644 localization/es_esx_dmvschool.sql diff --git a/fxmanifest.lua b/fxmanifest.lua index fe8e4b3c..fa363b87 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -12,6 +12,7 @@ server_scripts { 'locales/fi.lua', 'locales/fr.lua', 'locales/en.lua', + 'locales/es.lua', 'locales/pl.lua', 'locales/sv.lua', 'config.lua', @@ -24,6 +25,7 @@ client_scripts { 'locales/fi.lua', 'locales/fr.lua', 'locales/en.lua', + 'locales/es.lua', 'locales/pl.lua', 'locales/sv.lua', 'config.lua', diff --git a/locales/es.lua b/locales/es.lua new file mode 100644 index 00000000..c07462a3 --- /dev/null +++ b/locales/es.lua @@ -0,0 +1,28 @@ +Locales['es'] = { + ['you_paid'] = 'Pagaste ~g~%s$~s~ a la autoescuela', + ['go_next_point'] = '¡Vete al siguiente punto!', + ['in_town_speed'] = '¡Entraste a la ciudad, presta atención a tu velocidad! Límite de velocidad: ~y~%s~s~ km/h', + ['next_point_speed'] = '¡Vete al siguiente punto! Límite de velocidad: ~y~%s~s~ km/h', + ['stop_for_ped'] = '~r~Para~s~ en el ~y~paso de peatones', + ['good_lets_cont'] = '~g~Bien~s~, continua', + ['stop_look_left'] = '~r~Para~s~ y mira a la ~y~izquierda~s~. Límite de velocidad: ~y~%s~s~ km/h', + ['good_turn_right'] = '~g~Bien~s~, gira a la derecha y sigue la línea', + ['watch_traffic_lightson'] = '¡Mira el tráfico y ~y~enciende las luces~s~!', + ['stop_for_passing'] = '¡~r~Para~s~ para que pasen los vehículos!', + ['hway_time'] = '¡Es hora de conducir por la autopista! Límite de velocidad: ~y~%s~s~ km/h', + ['gratz_stay_alert'] = '¡Estoy impresionado pero no dejes de estar ~r~alerta~s~ mientras conduces!', + ['passed_test'] = 'Has ~g~aprobado~s~ el examen, ¡Enorabuena!', + ['failed_test'] = 'Has ~r~suspendido~s~ el examen, ¡Más suerte la próxima vez!', + ['theory_test'] = 'Examen teórico de conducir', + ['road_test_car'] = 'Examen práctico de conducir', + ['road_test_bike'] = 'Examen práctico de moto', + ['road_test_truck'] = 'Examen práctico de camiones', + ['school_item'] = '%s$', + ['driving_school'] = 'Escuela de conducción', + ['press_open_menu'] = 'Pulsa ~INPUT_CONTEXT~ para abrir el menú', + ['driving_school_blip'] = 'Autoescuela', + ['driving_test_complete'] = 'Examen de conducir finalizado', + ['driving_too_fast'] = '¡~r~Estás conduciendo muy rápido,~s~ el límite de velocidad actual es: ~y~%s~s~ km/h!', + ['errors'] = 'Fallos: ~r~%s~s~ / %s', + ['you_damaged_veh'] = '¡Has dañado el vehículo!', +} diff --git a/localization/es_esx_dmvschool.sql b/localization/es_esx_dmvschool.sql new file mode 100644 index 00000000..5644da2b --- /dev/null +++ b/localization/es_esx_dmvschool.sql @@ -0,0 +1,8 @@ +USE `es_extended`; + +INSERT INTO `licenses` (`type`, `label`) VALUES + ('dmv', 'Permiso teórico de conducir'), + ('drive', 'Permiso de conducir de coche'), + ('drive_bike', 'Permiso de conducir de moto'), + ('drive_truck', 'Permiso de conducir de camión') +; From 9655fb6ab7cf40d78eb1b8a8d5bf3ea0335f72c2 Mon Sep 17 00:00:00 2001 From: HypeLevels <61633775+HypeLevels@users.noreply.github.com> Date: Tue, 1 Dec 2020 21:42:28 +0000 Subject: [PATCH 36/36] Update config.lua Changed default language to english as its the universal language --- config.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.lua b/config.lua index d58e6dd8..fa55eb1e 100644 --- a/config.lua +++ b/config.lua @@ -2,7 +2,7 @@ Config = {} Config.DrawDistance = 100.0 Config.MaxErrors = 5 Config.SpeedMultiplier = 3.6 -Config.Locale = 'fr' +Config.Locale = 'en' Config.Prices = { dmv = 500,