├── timetrials ├── __resource.lua ├── timetrials_sv.lua ├── timetrials_cl.lua └── tracks.lua └── README.md /timetrials/__resource.lua: -------------------------------------------------------------------------------- 1 | resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' 2 | 3 | client_scripts { 4 | "tracks.lua", 5 | "timetrials_cl.lua" 6 | } 7 | 8 | server_scripts { 9 | "timetrials_sv.lua" 10 | } 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FiveM Timetrials 2 | 3 | FiveM resource for timetrial races with leaderboard and server side scores. 4 | 5 | ## Installation 6 | 7 | 1. Add the timetrials folder to your FiveM resources directory 8 | 2. Edit your server.cfg and add "start timetrials" 9 | 10 | ## Credit 11 | 12 | * Pringus for simple racing script https://forum.fivem.net/t/release-pringus-simple-race-script/96876 13 | -------------------------------------------------------------------------------- /timetrials/timetrials_sv.lua: -------------------------------------------------------------------------------- 1 | -- Filename to store scores 2 | local scoreFileName = "./scores.txt" 3 | 4 | -- Colors for printing scores 5 | local color_finish = {238, 198, 78} 6 | local color_highscore = {238, 78, 118} 7 | 8 | -- Save scores to JSON file 9 | function saveScores(scores) 10 | local file = io.open(scoreFileName, "w+") 11 | if file then 12 | local contents = json.encode(scores) 13 | file:write(contents) 14 | io.close( file ) 15 | return true 16 | else 17 | return false 18 | end 19 | end 20 | 21 | -- Load scores from JSON file 22 | function getScores() 23 | local contents = "" 24 | local myTable = {} 25 | local file = io.open(scoreFileName, "r") 26 | if file then 27 | -- read all contents of file into a string 28 | local contents = file:read("*a") 29 | myTable = json.decode(contents); 30 | io.close( file ) 31 | return myTable 32 | end 33 | return {} 34 | end 35 | 36 | -- Create thread to send scores to clients every 5s 37 | Citizen.CreateThread(function() 38 | while (true) do 39 | Citizen.Wait(5000) 40 | TriggerClientEvent('raceReceiveScores', -1, getScores()) 41 | end 42 | end) 43 | 44 | -- Save score and send chat message when player finishes 45 | RegisterServerEvent('racePlayerFinished') 46 | AddEventHandler('racePlayerFinished', function(source, message, title, newScore) 47 | -- Get top car score for this race 48 | local msgAppend = "" 49 | local msgSource = source 50 | local msgColor = color_finish 51 | local allScores = getScores() 52 | local raceScores = allScores[title] 53 | if raceScores ~= nil then 54 | -- Compare top score and update if new one is faster 55 | local carName = newScore.car 56 | local topScore = raceScores[carName] 57 | if topScore == nil or newScore.time < topScore.time then 58 | -- Set new high score 59 | topScore = newScore 60 | 61 | -- Set message parameters to send to all players for high score 62 | msgSource = -1 63 | msgAppend = " (fastest)" 64 | msgColor = color_highscore 65 | end 66 | raceScores[carName] = topScore 67 | else 68 | -- No scores for this race, create struct and set new high score 69 | raceScores = {} 70 | raceScores[newScore.car] = newScore 71 | 72 | -- Set message parameters to send to all players for high score 73 | msgSource = -1 74 | msgAppend = " (fastest)" 75 | msgColor = color_highscore 76 | end 77 | 78 | -- Save and store scores back to file 79 | allScores[title] = raceScores 80 | saveScores(allScores) 81 | 82 | -- Trigger message to all players 83 | TriggerClientEvent('chatMessage', -1, "[RACE]", msgColor, message .. msgAppend) 84 | end) 85 | -------------------------------------------------------------------------------- /timetrials/timetrials_cl.lua: -------------------------------------------------------------------------------- 1 | -- Local parameters 2 | local START_PROMPT_DISTANCE = 10.0 -- distance to prompt to start race 3 | local DRAW_TEXT_DISTANCE = 100.0 -- distance to start rendering the race name text 4 | local DRAW_SCORES_DISTANCE = 25.0 -- Distance to start rendering the race scores 5 | local DRAW_SCORES_COUNT_MAX = 15 -- Maximum number of scores to draw above race title 6 | local CHECKPOINT_Z_OFFSET = -5.00 -- checkpoint offset in z-axis 7 | local RACING_HUD_COLOR = {238, 198, 78, 255} -- color for racing HUD above map 8 | 9 | -- State variables 10 | local raceState = { 11 | cP = 1, 12 | index = 0 , 13 | scores = nil, 14 | startTime = 0, 15 | blip = nil, 16 | checkpoint = nil 17 | } 18 | 19 | -- Array of colors to display scores, top to bottom and scores out of range will be white 20 | local raceScoreColors = { 21 | {214, 175, 54, 255}, 22 | {167, 167, 173, 255}, 23 | {167, 112, 68, 255} 24 | } 25 | 26 | -- Create preRace thread 27 | Citizen.CreateThread(function() 28 | preRace() 29 | end) 30 | 31 | -- Function that runs when a race is NOT active 32 | function preRace() 33 | -- Initialize race state 34 | raceState.cP = 1 35 | raceState.index = 0 36 | raceState.startTime = 0 37 | raceState.blip = nil 38 | raceState.checkpoint = nil 39 | 40 | -- While player is not racing 41 | while raceState.index == 0 do 42 | -- Update every frame 43 | Citizen.Wait(0) 44 | 45 | -- Get player 46 | local player = GetPlayerPed(-1) 47 | 48 | -- Teleport player to waypoint if active and button pressed 49 | if IsWaypointActive() and IsControlJustReleased(0, 182) then 50 | -- Teleport player to waypoint 51 | local waypoint = GetFirstBlipInfoId(8) 52 | if DoesBlipExist(waypoint) then 53 | -- Teleport to location, wait 100ms to load then get ground coordinate 54 | local coords = GetBlipInfoIdCoord(waypoint) 55 | teleportToCoord(coords.x, coords.y, coords.z, 0) 56 | Citizen.Wait(100) 57 | local temp, zCoord = GetGroundZFor_3dCoord(coords.x, coords.y, 9999.9, 1) 58 | teleportToCoord(coords.x, coords.y, zCoord + 4.0, 0) 59 | end 60 | end 61 | 62 | -- Loop through all races 63 | for index, race in pairs(races) do 64 | if race.isEnabled then 65 | -- Draw map marker 66 | DrawMarker(1, race.start.x, race.start.y, race.start.z - 1, 0, 0, 0, 0, 0, 0, 3.0001, 3.0001, 1.5001, 255, 165, 0,165, 0, 0, 0,0) 67 | 68 | -- Check distance from map marker and draw text if close enough 69 | if GetDistanceBetweenCoords( race.start.x, race.start.y, race.start.z, GetEntityCoords(player)) < DRAW_TEXT_DISTANCE then 70 | -- Draw race name 71 | Draw3DText(race.start.x, race.start.y, race.start.z-0.600, race.title, RACING_HUD_COLOR, 4, 0.3, 0.3) 72 | end 73 | 74 | -- When close enough, draw scores 75 | if GetDistanceBetweenCoords( race.start.x, race.start.y, race.start.z, GetEntityCoords(player)) < DRAW_SCORES_DISTANCE then 76 | -- If we've received updated scores, display them 77 | if raceState.scores ~= nil then 78 | -- Get scores for this race and sort them 79 | raceScores = raceState.scores[race.title] 80 | if raceScores ~= nil then 81 | local sortedScores = {} 82 | for k, v in pairs(raceScores) do 83 | table.insert(sortedScores, { key = k, value = v }) 84 | end 85 | table.sort(sortedScores, function(a,b) return a.value.time < b.value.time end) 86 | 87 | -- Create new list with scores to draw 88 | local count = 0 89 | drawScores = {} 90 | for k, v in pairs(sortedScores) do 91 | if count < DRAW_SCORES_COUNT_MAX then 92 | count = count + 1 93 | table.insert(drawScores, v.value) 94 | end 95 | end 96 | 97 | -- Initialize offset 98 | local zOffset = 0 99 | if (#drawScores > #raceScoreColors) then 100 | zOffset = 0.450*(#raceScoreColors) + 0.300*(#drawScores - #raceScoreColors - 1) 101 | else 102 | zOffset = 0.450*(#drawScores - 1) 103 | end 104 | 105 | -- Print scores above title 106 | for k, score in pairs(drawScores) do 107 | -- Draw score text with color coding 108 | if (k > #raceScoreColors) then 109 | -- Draw score in white, decrement offset 110 | Draw3DText(race.start.x, race.start.y, race.start.z+zOffset, string.format("%s %.2fs (%s)", score.car, (score.time/1000.0), score.player), {255,255,255,255}, 4, 0.13, 0.13) 111 | zOffset = zOffset - 0.300 112 | else 113 | -- Draw score with color and larger text, decrement offset 114 | Draw3DText(race.start.x, race.start.y, race.start.z+zOffset, string.format("%s %.2fs (%s)", score.car, (score.time/1000.0), score.player), raceScoreColors[k], 4, 0.22, 0.22) 115 | zOffset = zOffset - 0.450 116 | end 117 | end 118 | end 119 | end 120 | end 121 | 122 | -- When close enough, prompt player 123 | if GetDistanceBetweenCoords( race.start.x, race.start.y, race.start.z, GetEntityCoords(player)) < START_PROMPT_DISTANCE then 124 | helpMessage("Press ~INPUT_CONTEXT~ to Race!") 125 | if (IsControlJustReleased(1, 51)) then 126 | -- Set race index, clear scores and trigger event to start the race 127 | raceState.index = index 128 | raceState.scores = nil 129 | TriggerEvent("raceCountdown") 130 | break 131 | end 132 | end 133 | end 134 | end 135 | end 136 | end 137 | 138 | -- Receive race scores from server and print 139 | RegisterNetEvent("raceReceiveScores") 140 | AddEventHandler("raceReceiveScores", function(scores) 141 | -- Save scores to state 142 | raceState.scores = scores 143 | end) 144 | 145 | -- Countdown race start with controls disabled 146 | RegisterNetEvent("raceCountdown") 147 | AddEventHandler("raceCountdown", function() 148 | -- Get race from index 149 | local race = races[raceState.index] 150 | 151 | -- Teleport player to start and set heading 152 | teleportToCoord(race.start.x, race.start.y, race.start.z + 4.0, race.start.heading) 153 | 154 | Citizen.CreateThread(function() 155 | -- Countdown timer 156 | local time = 0 157 | function setcountdown(x) time = GetGameTimer() + x*1000 end 158 | function getcountdown() return math.floor((time-GetGameTimer())/1000) end 159 | 160 | -- Count down to race start 161 | setcountdown(6) 162 | while getcountdown() > 0 do 163 | -- Update HUD 164 | Citizen.Wait(1) 165 | DrawHudText(getcountdown(), {255,191,0,255},0.5,0.4,4.0,4.0) 166 | 167 | -- Disable acceleration/reverse until race starts 168 | DisableControlAction(2, 71, true) 169 | DisableControlAction(2, 72, true) 170 | end 171 | 172 | -- Enable acceleration/reverse once race starts 173 | EnableControlAction(2, 71, true) 174 | EnableControlAction(2, 72, true) 175 | 176 | -- Start race 177 | TriggerEvent("raceRaceActive") 178 | end) 179 | end) 180 | 181 | -- Main race function 182 | RegisterNetEvent("raceRaceActive") 183 | AddEventHandler("raceRaceActive", function() 184 | -- Get race from index 185 | local race = races[raceState.index] 186 | 187 | -- Start a new timer 188 | raceState.startTime = GetGameTimer() 189 | Citizen.CreateThread(function() 190 | -- Create first checkpoint 191 | checkpoint = CreateCheckpoint(race.checkpoints[raceState.cP].type, race.checkpoints[raceState.cP].x, race.checkpoints[raceState.cP].y, race.checkpoints[raceState.cP].z + CHECKPOINT_Z_OFFSET, race.checkpoints[raceState.cP].x,race.checkpoints[raceState.cP].y, race.checkpoints[raceState.cP].z, race.checkpointRadius, 204, 204, 1, math.ceil(255*race.checkpointTransparency), 0) 192 | raceState.blip = AddBlipForCoord(race.checkpoints[raceState.cP].x, race.checkpoints[raceState.cP].y, race.checkpoints[raceState.cP].z) 193 | 194 | -- Set waypoints if enabled 195 | if race.showWaypoints == true then 196 | SetNewWaypoint(race.checkpoints[raceState.cP+1].x, race.checkpoints[raceState.cP+1].y) 197 | end 198 | 199 | -- While player is racing, do stuff 200 | while raceState.index ~= 0 do 201 | Citizen.Wait(1) 202 | 203 | -- Stop race when L is pressed, clear and reset everything 204 | if IsControlJustReleased(0, 182) and GetLastInputMethod(0) then 205 | -- Delete checkpoint and raceState.blip 206 | DeleteCheckpoint(checkpoint) 207 | RemoveBlip(raceState.blip) 208 | 209 | -- Set new waypoint and teleport to the same spot 210 | SetNewWaypoint(race.start.x, race.start.y) 211 | teleportToCoord(race.start.x, race.start.y, race.start.z + 4.0, race.start.heading) 212 | 213 | -- Clear racing index and break 214 | raceState.index = 0 215 | break 216 | end 217 | 218 | -- Draw checkpoint and time HUD above minimap 219 | local checkpointDist = math.floor(GetDistanceBetweenCoords(race.checkpoints[raceState.cP].x, race.checkpoints[raceState.cP].y, race.checkpoints[raceState.cP].z, GetEntityCoords(GetPlayerPed(-1)))) 220 | DrawHudText(("%.3fs"):format((GetGameTimer() - raceState.startTime)/1000), RACING_HUD_COLOR, 0.015, 0.725, 0.7, 0.7) 221 | DrawHudText(string.format("Checkpoint %i / %i (%d m)", raceState.cP, #race.checkpoints, checkpointDist), RACING_HUD_COLOR, 0.015, 0.765, 0.5, 0.5) 222 | 223 | -- Check distance from checkpoint 224 | if GetDistanceBetweenCoords(race.checkpoints[raceState.cP].x, race.checkpoints[raceState.cP].y, race.checkpoints[raceState.cP].z, GetEntityCoords(GetPlayerPed(-1))) < race.checkpointRadius then 225 | -- Delete checkpoint and map raceState.blip, 226 | DeleteCheckpoint(checkpoint) 227 | RemoveBlip(raceState.blip) 228 | 229 | -- Play checkpoint sound 230 | PlaySoundFrontend(-1, "RACE_PLACED", "HUD_AWARDS") 231 | 232 | -- Check if at finish line 233 | if raceState.cP == #(race.checkpoints) then 234 | -- Save time and play sound for finish line 235 | local finishTime = (GetGameTimer() - raceState.startTime) 236 | PlaySoundFrontend(-1, "ScreenFlash", "WastedSounds") 237 | 238 | -- Get vehicle name and create score 239 | local aheadVehHash = GetEntityModel(GetVehiclePedIsUsing(GetPlayerPed(-1))) 240 | local aheadVehNameText = GetLabelText(GetDisplayNameFromVehicleModel(aheadVehHash)) 241 | local score = {} 242 | score.player = GetPlayerName(PlayerId()) 243 | score.time = finishTime 244 | score.car = aheadVehNameText 245 | 246 | -- Send server event with score and message, move this to server eventually 247 | message = string.format("Player " .. GetPlayerName(PlayerId()) .. " finished " .. race.title .. " using " .. aheadVehNameText .. " in " .. (finishTime / 1000) .. " s") 248 | TriggerServerEvent('racePlayerFinished', GetPlayerName(PlayerId()), message, race.title, score) 249 | 250 | -- Clear racing index and break 251 | raceState.index = 0 252 | break 253 | end 254 | 255 | -- Increment checkpoint counter and create next checkpoint 256 | raceState.cP = math.ceil(raceState.cP+1) 257 | if race.checkpoints[raceState.cP].type == 5 then 258 | -- Create normal checkpoint 259 | checkpoint = CreateCheckpoint(race.checkpoints[raceState.cP].type, race.checkpoints[raceState.cP].x, race.checkpoints[raceState.cP].y, race.checkpoints[raceState.cP].z + CHECKPOINT_Z_OFFSET, race.checkpoints[raceState.cP].x, race.checkpoints[raceState.cP].y, race.checkpoints[raceState.cP].z, race.checkpointRadius, 204, 204, 1, math.ceil(255*race.checkpointTransparency), 0) 260 | raceState.blip = AddBlipForCoord(race.checkpoints[raceState.cP].x, race.checkpoints[raceState.cP].y, race.checkpoints[raceState.cP].z) 261 | SetNewWaypoint(race.checkpoints[raceState.cP+1].x, race.checkpoints[raceState.cP+1].y) 262 | elseif race.checkpoints[raceState.cP].type == 9 then 263 | -- Create finish line 264 | checkpoint = CreateCheckpoint(race.checkpoints[raceState.cP].type, race.checkpoints[raceState.cP].x, race.checkpoints[raceState.cP].y, race.checkpoints[raceState.cP].z + 4.0, race.checkpoints[raceState.cP].x, race.checkpoints[raceState.cP].y, race.checkpoints[raceState.cP].z, race.checkpointRadius, 204, 204, 1, math.ceil(255*race.checkpointTransparency), 0) 265 | raceState.blip = AddBlipForCoord(race.checkpoints[raceState.cP].x, race.checkpoints[raceState.cP].y, race.checkpoints[raceState.cP].z) 266 | SetNewWaypoint(race.checkpoints[raceState.cP].x, race.checkpoints[raceState.cP].y) 267 | end 268 | end 269 | end 270 | 271 | -- Reset race 272 | preRace() 273 | end) 274 | end) 275 | 276 | -- Create map blips for all enabled tracks 277 | Citizen.CreateThread(function() 278 | for _, race in pairs(races) do 279 | if race.isEnabled then 280 | race.blip = AddBlipForCoord(race.start.x, race.start.y, race.start.z) 281 | SetBlipSprite(race.blip, race.mapBlipId) 282 | SetBlipDisplay(race.blip, 4) 283 | SetBlipScale(race.blip, 1.0) 284 | SetBlipColour(race.blip, race.mapBlipColor) 285 | SetBlipAsShortRange(race.blip, true) 286 | BeginTextCommandSetBlipName("STRING") 287 | AddTextComponentString(race.title) 288 | EndTextCommandSetBlipName(race.blip) 289 | end 290 | end 291 | end) 292 | 293 | -- Utility function to teleport to coordinates 294 | function teleportToCoord(x, y, z, heading) 295 | Citizen.Wait(1) 296 | local player = GetPlayerPed(-1) 297 | if IsPedInAnyVehicle(player, true) then 298 | SetEntityCoords(GetVehiclePedIsUsing(player), x, y, z) 299 | Citizen.Wait(100) 300 | SetEntityHeading(GetVehiclePedIsUsing(player), heading) 301 | else 302 | SetEntityCoords(player, x, y, z) 303 | Citizen.Wait(100) 304 | SetEntityHeading(player, heading) 305 | end 306 | end 307 | 308 | -- Utility function to display help message 309 | function helpMessage(text, duration) 310 | BeginTextCommandDisplayHelp("STRING") 311 | AddTextComponentSubstringPlayerName(text) 312 | EndTextCommandDisplayHelp(0, false, true, duration or 5000) 313 | end 314 | 315 | -- Utility function to display 3D text 316 | function Draw3DText(x,y,z,textInput,colour,fontId,scaleX,scaleY) 317 | local px,py,pz=table.unpack(GetGameplayCamCoords()) 318 | local dist = GetDistanceBetweenCoords(px,py,pz, x,y,z, 1) 319 | local scale = (1/dist)*20 320 | local fov = (1/GetGameplayCamFov())*100 321 | local scale = scale*fov 322 | 323 | SetTextScale(scaleX*scale, scaleY*scale) 324 | SetTextFont(fontId) 325 | SetTextProportional(1) 326 | local colourr,colourg,colourb,coloura = table.unpack(colour) 327 | SetTextColour(colourr,colourg,colourb, coloura) 328 | SetTextDropshadow(2, 1, 1, 1, 255) 329 | SetTextEdge(3, 0, 0, 0, 150) 330 | SetTextDropShadow() 331 | SetTextOutline() 332 | SetTextEntry("STRING") 333 | SetTextCentre(1) 334 | AddTextComponentString(textInput) 335 | SetDrawOrigin(x,y,z+2, 0) 336 | DrawText(0.0, 0.0) 337 | ClearDrawOrigin() 338 | end 339 | 340 | -- Utility function to display HUD text 341 | function DrawHudText(text,colour,coordsx,coordsy,scalex,scaley) 342 | SetTextFont(4) 343 | SetTextProportional(7) 344 | SetTextScale(scalex, scaley) 345 | local colourr,colourg,colourb,coloura = table.unpack(colour) 346 | SetTextColour(colourr,colourg,colourb, coloura) 347 | SetTextDropshadow(0, 0, 0, 0, coloura) 348 | SetTextEdge(1, 0, 0, 0, coloura) 349 | SetTextDropShadow() 350 | SetTextOutline() 351 | SetTextEntry("STRING") 352 | AddTextComponentString(text) 353 | DrawText(coordsx,coordsy) 354 | end 355 | -------------------------------------------------------------------------------- /timetrials/tracks.lua: -------------------------------------------------------------------------------- 1 | 2 | -- Racing configuration, edit this to add or change races 3 | races = { 4 | { 5 | title = "TEST", -- Race title 6 | isEnabled = false, -- Enable the race 7 | showWaypoints = false, -- Set GPS waypoints, waypoint will always be set to next checkpoint + 1 8 | checkpointRadius = 10.0, -- Radius of checkpoint 9 | checkpointTransparency = 1.0, -- Checkpoint transparancy 10 | mapBlipId = 315, -- Map blip ID 11 | mapBlipColor = 5, -- Map blip color 12 | start = { x = -50.0, y = 6326.0, z = 31.0, heading = 135.0, type = 5 }, -- Starting race coordinates (/saveRaceStart) 13 | checkpoints = { -- Checkpoints and finish line 14 | { x = -60.0, y = 6316.0, z = 31.0, heading = 135.0, type = 5 }, -- Race checkpoints, type 5 is a normal checkpoint (/saveRaceCp) 15 | { x = -50.0, y = 6326.0, z = 31.0, heading = 135.0, type = 9 } -- Race checkpoints, type 9 is a finish line (/saveRaceEnd) 16 | } 17 | }, 18 | { 19 | title = "Sandy Airfield", 20 | isEnabled = true, 21 | showWaypoints = false, 22 | checkpointRadius = 24.0, 23 | checkpointTransparency = 1.0, 24 | mapBlipId = 315, 25 | mapBlipColor = 5, 26 | start = { x = 1718.0, y = 3254.5, z = 40.5, heading = 105.0, type = 5 }, 27 | checkpoints = { 28 | {x = 1472.0715332032, y = 3188.8779296875, z = 39.729152679444, heading = 105.37201690674, type = 5}, 29 | {x = 1073.3435058594, y = 3043.9104003906, z = 40.528339385986, heading = 197.2525177002, type = 5}, 30 | {x = 1337.2255859375, y = 3082.1672363282, z = 39.850803375244, heading = 283.56066894532, type = 5}, 31 | {x = 1598.4370117188, y = 3195.6440429688, z = 39.846961975098, heading = 130.9425354004, type = 9} 32 | } 33 | }, 34 | { 35 | title = "Airport Drag Race", 36 | isEnabled = true, 37 | showWaypoints = false, 38 | checkpointRadius = 24.0, 39 | checkpointTransparency = 1.0, 40 | mapBlipId = 315, 41 | mapBlipColor = 5, 42 | start = { x = -1355.0, y = -2245.0, z = 13.5, heading = 150.0, type = 5 }, 43 | checkpoints = { 44 | { x = -1455.0, y = -2419.0, z = 13.5, heading = 150.0, type = 5 }, 45 | { x = -1555.0, y = -2593.0, z = 13.5, heading = 150.0, type = 9 } 46 | } 47 | }, 48 | { 49 | title = "Airport Circuit", 50 | isEnabled = true, 51 | showWaypoints = true, 52 | checkpointRadius = 24.0, 53 | checkpointTransparency = 1.0, 54 | mapBlipId = 315, 55 | mapBlipColor = 5, 56 | start = { x = -1483.8513183594, y = -2466.4462890625, z = 13.23726272583, heading = 149.99917602539, type = 5 }, 57 | checkpoints = { 58 | 59 | { x = -1680.8255615234, y = -2878.8698730469, z = 13.235111236572, heading = 176.03915405273, type = 5 }, 60 | { x = -1470.9576416016, y = -3065.8903808594, z = 13.244960784912, heading = 238.63464355469, type = 5 }, 61 | { x = -1208.2521972656, y = -3304.4533691406, z = 13.231184005737, heading = 208.5503692627, type = 5 }, 62 | { x = -1042.4713134766, y = -3443.3386230469, z = 13.237512588501, heading = 240.62759399414, type = 5 }, 63 | { x = -873.10095214844, y = -3418.6193847656, z = 13.236061096191, heading = 329.0498046875, type = 5 }, 64 | { x = -830.09899902344, y = -3206.4260253906, z = 13.236886978149, heading = 61.586364746094, type = 5 }, 65 | { x = -1018.353515625, y = -3061.9873046875, z = 13.237516403198, heading = 57.20064163208, type = 5 }, 66 | { x = -1414.3126220703, y = -2730.6306152344, z = 13.237626075745, heading = 1.111701965332, type = 5 }, 67 | { x = -1208.3099365234, y = -2401.0974121094, z = 13.238660812378, heading = 306.29351806641, type = 5 }, 68 | { x = -1119.1400146484, y = -2341.23046875, z = 13.236170768738, heading = 329.97036743164, type = 5 }, 69 | { x = -1266.2938232422, y = -2207.615234375, z = 13.237180709839, heading = 60.200450897217, type = 5 }, 70 | { x = -1483.8513183594, y = -2466.4462890625, z = 13.23726272583, heading = 149.99917602539, type = 9 } 71 | } 72 | }, 73 | { 74 | title = "North GP", 75 | isEnabled = true, 76 | showWaypoints = true, 77 | checkpointRadius = 24.0, 78 | checkpointTransparency = 1.0, 79 | mapBlipId = 315, 80 | mapBlipColor = 5, 81 | start = {x = 0.0, y = 6376.0, z = 31.0, heading = 135.0, type = 5 }, 82 | checkpoints = { 83 | {x = -450.0, y = 5913.0, z = 32.0, heading = 0.0, type = 5}, 84 | {x = -650.0, y = 5570.0, z = 38.0, heading = 0.0, type = 5}, 85 | {x = -1285.0, y = 5254.0, z = 52.0, heading = 0.0, type = 5}, 86 | {x = -1568.0, y = 4934.0, z = 61.0, heading = 0.0, type = 5}, 87 | {x = -2020.0, y = 4498.0, z = 57.0, heading = 0.0, type = 5}, 88 | {x = -2170.0, y = 4444.0, z = 62.0, heading = 0.0, type = 5}, 89 | {x = -2237.0, y = 4282.0, z = 46.0, heading = 0.0, type = 5}, 90 | {x = -2570.0, y = 3352.0, z = 13.0, heading = 0.0, type = 5}, 91 | {x = -2670.0, y = 2284.0, z = 21.0, heading = 0.0, type = 5}, 92 | {x = -2465.0, y = 2294.0, z = 31.0, heading = 0.0, type = 5}, 93 | {x = -2025.0, y = 2336.0, z = 34.0, heading = 0.0, type = 5}, 94 | {x = -1600.0, y = 2412.0, z = 26.0, heading = 0.0, type = 5}, 95 | {x = -1323.0, y = 2465.0, z = 25.0, heading = 0.0, type = 5}, 96 | {x = -1080.0, y = 2695.0, z = 20.0, heading = 0.0, type = 5}, 97 | {x = -882.0, y = 2750.0, z = 23.0, heading = 0.0, type = 5}, 98 | {x = -556.0, y = 2850.0, z = 34.0, heading = 0.0, type = 5}, 99 | {x = -320.0, y = 2890.0, z = 45.0, heading = 0.0, type = 5}, 100 | {x = 0.0, y = 2786.0, z = 57.0, heading = 0.0, type = 5}, 101 | {x = 350.0, y = 2655.0, z = 44.0, heading = 0.0, type = 5}, 102 | {x = 825.0, y = 2700.0, z = 40.0, heading = 0.0, type = 5}, 103 | {x = 1600.0, y = 2815.0, z = 38.0, heading = 0.0, type = 5}, 104 | {x = 2230.0, y = 3010.0, z = 45.0, heading = 0.0, type = 5}, 105 | {x = 2470.0, y = 2894.0, z = 47.0, heading = 0.0, type = 5}, 106 | {x = 2775.0, y = 3330.0, z = 56.0, heading = 0.0, type = 5}, 107 | {x = 2915.0, y = 4087.0, z = 50.0, heading = 0.0, type = 5}, 108 | {x = 2585.0, y = 5320.0, z = 44.0, heading = 0.0, type = 5}, 109 | {x = 2340.0, y = 5880.0, z = 47.0, heading = 0.0, type = 5}, 110 | {x = 1940.0, y = 6320.0, z = 43.0, heading = 0.0, type = 5}, 111 | {x = 820.0, y = 6500.0, z = 23.0, heading = 0.0, type = 5}, 112 | {x = 0.0, y = 6376.0, z = 31.0, heading = 135.0,type = 9} 113 | } 114 | }, 115 | { 116 | title = "Nurburgring Nordschleife", 117 | isEnabled = true, 118 | showWaypoints = false, 119 | checkpointRadius = 20.0, 120 | checkpointTransparency = 0.6, 121 | mapBlipId = 315, 122 | mapBlipColor = 5, 123 | start = { x = 3713.3266601562, y = -6519.0180664062, z = 2190.806640625, heading = 134.7043762207, type = 5 }, 124 | checkpoints = { 125 | { x = 3353.8029785156, y = -6877.1694335938, z = 2184.6547851562, heading = 131.2176361084, type = 5 }, 126 | { x = 3215.3469238282, y = -6930.9326171875, z = 2177.7607421875, heading = 11.139162063598, type = 5 }, 127 | { x = 3188.7666015625, y = -6900.5844726562, z = 2178.0241699218, heading = 109.11637115478, type = 5 }, 128 | { x = 3137.2211914062, y = -7000.87109375, z = 2177.6359863282, heading = 168.81777954102, type = 5 }, 129 | { x = 3069.7277832032, y = -7250.3427734375, z = 2173.8608398438, heading = 161.44604492188, type = 5 }, 130 | { x = 3099.2673339844, y = -7367.720703125, z = 2169.2556152344, heading = 241.97760009766, type = 5 }, 131 | { x = 3179.7121582032, y = -7412.2412109375, z = 2164.6145019532, heading = 214.3480682373, type = 5 }, 132 | { x = 3126.68359375, y = -7490.8940429688, z = 2158.330078125, heading = 116.47142791748, type = 5 }, 133 | { x = 2868.5358886718, y = -7701.0649414062, z = 2139.9133300782, heading = 144.72105407714, type = 5 }, 134 | { x = 2780.58984375, y = -7818.6987304688, z = 2135.9604492188, heading = 99.497375488282, type = 5 }, 135 | { x = 2734.1455078125, y = -7776.9814453125, z = 2136.0959472656, heading = 352.92767333984, type = 5 }, 136 | { x = 2870.0798339844, y = -7627.9716796875, z = 2142.9208984375, heading = 314.39126586914, type = 5 }, 137 | { x = 2956.5979003906, y = -7452.3149414062, z = 2158.9619140625, heading = 15.353079795838, type = 5 }, 138 | { x = 3003.1708984375, y = -7203.2255859375, z = 2172.4873046875, heading = 341.98635864258, type = 5 }, 139 | { x = 3023.0451660156, y = -6950.1508789062, z = 2177.6967773438, heading = 66.125411987304, type = 5 }, 140 | { x = 2902.9328613282, y = -6887.330078125, z = 2174.919921875, heading = 39.401309967042, type = 5 }, 141 | { x = 2903.8154296875, y = -6815.8447265625, z = 2171.55859375, heading = 325.93545532226, type = 5 }, 142 | { x = 3161.9052734375, y = -6520.662109375, z = 2159.3249511718, heading = 296.91180419922, type = 5 }, 143 | { x = 3621.3435058594, y = -6375.7700195312, z = 2181.10546875, heading = 335.75100708008, type = 5 }, 144 | { x = 3688.80859375, y = -6318.8852539062, z = 2186.1799316406, heading = 285.12023925782, type = 5 }, 145 | { x = 3827.8430175782, y = -6281.3325195312, z = 2191.1086425782, heading = 304.60830688476, type = 5 }, 146 | { x = 3829.1818847656, y = -6208.283203125, z = 2197.2668457032, heading = 39.269577026368, type = 5 }, 147 | { x = 3738.7846679688, y = -6115.0756835938, z = 2196.365234375, heading = 110.06678009034, type = 5 }, 148 | { x = 3562.1259765625, y = -6304.3872070312, z = 2172.3967285156, heading = 113.4914932251, type = 5 }, 149 | { x = 2809.7026367188, y = -6003.0561523438, z = 2149.9482421875, heading = 80.79148864746, type = 5 }, 150 | { x = 2233.0715332032, y = -4653.3618164062, z = 2136.3122558594, heading = 15.723192214966, type = 5 }, 151 | { x = 1862.3931884766, y = -4069.6293945312, z = 2109.9597167968, heading = 66.36026763916, type = 5 }, 152 | { x = 1932.094116211, y = -3901.4223632812, z = 2087.4851074218, heading = 290.82498168946, type = 5 }, 153 | { x = 2733.0063476562, y = -2910.6875, z = 2044.8466796875, heading = 304.0206604004, type = 5 }, 154 | { x = 3684.6735839844, y = -1943.8540039062, z = 1931.81640625, heading = 270.43563842774, type = 5 }, 155 | { x = 4621.5087890625, y = -1577.0061035156, z = 1932.0782470704, heading = 303.76055908204, type = 5 }, 156 | { x = 5108.9892578125, y = -2220.2045898438, z = 1974.226196289, heading = 245.54553222656, type = 5 }, 157 | { x = 6355.8359375, y = -2381.7883300782, z = 2082.5927734375, heading = 305.28051757812, type = 5 }, 158 | { x = 6614.3232421875, y = -2502.9721679688, z = 2126.4765625, heading = 307.3380432129, type = 5 }, 159 | { x = 7358.7670898438, y = -2078.9025878906, z = 2181.7644042968, heading = 254.34376525878, type = 5 }, 160 | { x = 7909.4233398438, y = -2858.3527832032, z = 2110.0441894532, heading = 182.7716217041, type = 5 }, 161 | { x = 7475.5063476562, y = -3359.056640625, z = 2109.8671875, heading = 177.39701843262, type = 5 }, 162 | { x = 7112.8452148438, y = -3809.6164550782, z = 2104.2587890625, heading = 151.30856323242, type = 5 }, 163 | { x = 6180.2412109375, y = -4196.1044921875, z = 2123.4204101562, heading = 224.30256652832, type = 5 }, 164 | { x = 6405.744140625, y = -4627.916015625, z = 2125.365234375, heading = 119.32774353028, type = 5 }, 165 | { x = 4537.255859375, y = -5710.0263671875, z = 2157.5783691406, heading = 132.58056640625, type = 5 }, 166 | { x = 4233.0688476562, y = -6093.4487304688, z = 2169.9963378906, heading = 138.64822387696, type = 5 }, 167 | { x = 4115.0004882812, y = -6225.9497070312, z = 2180.1176757812, heading = 157.44969177246, type = 5 }, 168 | { x = 4028.8940429688, y = -6256.2348632812, z = 2186.9311523438, heading = 98.033226013184, type = 5 }, 169 | { x = 3846.4174804688, y = -6380.38671875, z = 2191.7783203125, heading = 136.45506286622, type = 5 }, 170 | { x = 3705.0573730468, y = -6522.4326171875, z = 2190.7019042968, heading = 135.49685668946, type = 9 } 171 | } 172 | }, 173 | { 174 | title = "Cannonball Run", 175 | isEnabled = true, 176 | showWaypoints = true, 177 | checkpointRadius = 24.0, 178 | checkpointTransparency = 1.0, 179 | mapBlipId = 315, 180 | mapBlipColor = 5, 181 | start = { x = -1607.318359375, y = -959.67138671875, z = 12.597019195557, heading = 321.09140014648, type = 5 }, 182 | checkpoints = { 183 | { x = -1460.4228515625, y = -781.34197998047, z = 23.361558914185, heading = 318.8801574707, type = 5 }, 184 | { x = -1340.3503417969, y = -679.0263671875, z = 25.581365585327, heading = 306.97860717773, type = 5 }, 185 | { x = -1243.9234619141, y = -566.95849609375, z = 28.111865997314, heading = 33.419361114502, type = 5 }, 186 | { x = -1426.6506347656, y = -327.95690917969, z = 44.007438659668, heading = 39.909969329834, type = 5 }, 187 | { x = -1583.845703125, y = -144.46768188477, z = 55.170845031738, heading = 34.813705444336, type = 5 }, 188 | { x = -1895.6900634766, y = 176.14093017578, z = 81.726440429688, heading = 43.351215362549, type = 5 }, 189 | { x = -1972.7966308594, y = 538.77508544922, z = 109.95614624023, heading = 349.78002929688, type = 5 }, 190 | { x = -1733.6348876953, y = 828.24841308594, z = 142.94569396973, heading = 323.63955688477, type = 5 }, 191 | { x = -1622.5186767578, y = 1139.5323486328, z = 150.15615844727, heading = 13.660859107971, type = 5 }, 192 | { x = -1546.9471435547, y = 1407.9493408203, z = 124.12697601318, heading = 317.61862182617, type = 5 }, 193 | { x = -1507.9011230469, y = 1683.7175292969, z = 98.48136138916, heading = 4.4252882003784, type = 5 }, 194 | { x = -1449.0495605469, y = 1976.0850830078, z = 69.504554748535, heading = 29.093732833862, type = 5 }, 195 | { x = -1505.7811279297, y = 2131.2114257813, z = 55.617652893066, heading = 329.19528198242, type = 5 }, 196 | { x = -1425.1112060547, y = 2147.1608886719, z = 53.005302429199, heading = 269.25903320313, type = 5 }, 197 | { x = -1356.0765380859, y = 2220.62109375, z = 48.389919281006, heading = 354.47640991211, type = 5 }, 198 | { x = -1297.9562988281, y = 2488.7194824219, z = 21.916236877441, heading = 317.03799438477, type = 5 }, 199 | { x = -1123.8458251953, y = 2657.6137695313, z = 17.203315734863, heading = 310.96087646484, type = 5 }, 200 | { x = -859.53430175781, y = 2750.5139160156, z = 22.800928115845, heading = 274.66470336914, type = 5 }, 201 | { x = -537.13549804688, y = 2846.5302734375, z = 33.907627105713, heading = 261.95040893555, type = 5 }, 202 | { x = -209.5178527832, y = 2874.6220703125, z = 46.778469085693, heading = 248.77243041992, type = 5 }, 203 | { x = 69.805358886719, y = 2732.6301269531, z = 55.677001953125, heading = 226.16117858887, type = 5 }, 204 | { x = 331.44790649414, y = 2648.9692382813, z = 44.302200317383, heading = 287.69750976563, type = 5 }, 205 | { x = 961.46356201172, y = 2693.6887207031, z = 39.790191650391, heading = 269.58987426758, type = 5 }, 206 | { x = 1543.1647949219, y = 2775.83203125, z = 37.697772979736, heading = 303.06399536133, type = 5 }, 207 | { x = 1975.9383544922, y = 2979.5173339844, z = 45.346519470215, heading = 281.96737670898, type = 5 }, 208 | { x = 2295.8908691406, y = 2995.9904785156, z = 46.215560913086, heading = 250.00836181641, type = 5 }, 209 | { x = 2470.4860839844, y = 2893.2915039063, z = 46.883125305176, heading = 320.52627563477, type = 5 }, 210 | { x = 2715.75390625, y = 3212.0219726563, z = 53.770889282227, heading = 328.04644775391, type = 5 }, 211 | { x = 2901.0354003906, y = 3659.1994628906, z = 52.231853485107, heading = 344.22540283203, type = 5 }, 212 | { x = 2864.6066894531, y = 4240.138671875, z = 49.647491455078, heading = 17.717800140381, type = 5 }, 213 | { x = 2584.5341796875, y = 5317.4731445313, z = 44.159732818604, heading = 16.238145828247, type = 5 }, 214 | { x = 2307.0017089844, y = 5925.72265625, z = 48.012245178223, heading = 38.409969329834, type = 5 }, 215 | { x = 2085.9475097656, y = 6110.4301757813, z = 50.005531311035, heading = 51.440216064453, type = 5 }, 216 | { x = 1904.2946777344, y = 6344.375, z = 41.979625701904, heading = 65.717811584473, type = 5 }, 217 | { x = 1512.3416748047, y = 6450.8530273438, z = 22.291770935059, heading = 66.489120483398, type = 5 }, 218 | { x = 909.94793701172, y = 6494.9145507813, z = 20.853240966797, heading = 88.569923400879, type = 5 }, 219 | { x = 389.83612060546, y = 6571.330078125, z = 26.932916641236, heading = 87.253578186036, type = 5 }, 220 | { x = 127.84744262696, y = 6554.578125, z = 30.927782058716, heading = 43.02042388916, type = 5 }, 221 | { x = 49.179161071778, y = 6634.1215820312, z = 30.892223358154, heading = 44.478343963624, type = 5 }, 222 | { x = -30.021013259888, y = 6620.7524414062, z = 29.751941680908, heading = 125.5305480957, type = 9 } 223 | } 224 | }, 225 | { 226 | title = "Observatory Loop", 227 | isEnabled = true, 228 | showWaypoints = true, 229 | checkpointRadius = 16.0, 230 | checkpointTransparency = 1.0, 231 | mapBlipId = 315, 232 | mapBlipColor = 5, 233 | start = { x = 302.28506469726, y = 1101.4989013672, z = 215.9768371582, heading = 30.918949127198, type = 5 }, 234 | checkpoints = { 235 | { x = 201.13650512695, y = 1351.2955322266, z = 241.38609313965, heading = 65.926895141602, type = 5 }, 236 | { x = 61.59497833252, y = 1423.3917236328, z = 264.47671508789, heading = 40.1181640625, type = 5 }, 237 | { x = -130.38139343262, y = 1511.5137939453, z = 287.22885131836, heading = 89.721450805664, type = 5 }, 238 | { x = -197.52734375, y = 1439.181640625, z = 288.8005065918, heading = 184.9315032959, type = 5 }, 239 | { x = -281.42712402344, y = 1219.5548095703, z = 317.37887573242, heading = 145.52589416504, type = 5 }, 240 | { x = -407.10946655273, y = 1184.5893554688, z = 325.11770629883, heading = 76.064628601074, type = 5 }, 241 | { x = -470.83023071289, y = 1263.3680419922, z = 316.5876159668, heading = 317.52450561523, type = 5 }, 242 | { x = -435.9953918457, y = 1404.7330322266, z = 293.5729675293, heading = 321.49356079102, type = 5 }, 243 | { x = -274.07931518555, y = 1475.8588867188, z = 288.50787353516, heading = 284.57989501953, type = 5 }, 244 | { x = -89.467720031738, y = 1507.1181640625, z = 283.19018554688, heading = 257.96508789063, type = 5 }, 245 | { x = 25.153619766235, y = 1435.6931152344, z = 270.3708190918, heading = 278.48516845703, type = 5 }, 246 | { x = 123.28765869141, y = 1392.9395751953, z = 255.89883422852, heading = 268.3034362793, type = 5 }, 247 | { x = 245.89440917969, y = 1297.1911621094, z = 235.24789428711, heading = 190.62579345703, type = 5 }, 248 | { x = 287.42782592773, y = 1101.6944580078, z = 216.97271728516, heading = 205.25936889648, type = 9 } 249 | } 250 | }, 251 | { 252 | title = "Hollywood Hills", 253 | isEnabled = true, 254 | showWaypoints = true, 255 | checkpointRadius = 16.0, 256 | checkpointTransparency = 1.0, 257 | mapBlipId = 315, 258 | mapBlipColor = 5, 259 | start = { x = 352.05926513672, y = 113.04263305664, z = 102.48695373535, heading = 340.93218994141, type = 5 }, 260 | checkpoints = { 261 | { x = 393.53713989258, y = 223.80508422852, z = 102.67239379883, heading = 337.41104125977, type = 5 }, 262 | { x = 586.15447998047, y = 280.23156738281, z = 103.09062957764, heading = 333.55163574219, type = 5 }, 263 | { x = 853.1240234375, y = 369.83282470703, z = 117.70520019531, heading = 315.78994750977, type = 5 }, 264 | { x = 948.91888427734, y = 519.84808349609, z = 112.5553894043, heading = 264.78237915039, type = 5 }, 265 | { x = 1101.0074462891, y = 588.45526123047, z = 101.70491027832, heading = 342.15698242188, type = 5 }, 266 | { x = 1144.1712646484, y = 741.54058837891, z = 144.23280334473, heading = 51.473220825195, type = 5 }, 267 | { x = 1025.8093261719, y = 690.43225097656, z = 159.18605041504, heading = 145.73094177246, type = 5 }, 268 | { x = 931.58880615234, y = 682.73876953125, z = 176.82684326172, heading = 10.241680145264, type = 5 }, 269 | { x = 957.19891357422, y = 968.50799560547, z = 223.88296508789, heading = 58.789539337158, type = 5 }, 270 | { x = 780.45721435547, y = 867.58276367188, z = 217.45401000977, heading = 154.3660736084, type = 5 }, 271 | { x = 648.15057373047, y = 781.72277832031, z = 204.70776367188, heading = 88.051315307617, type = 5 }, 272 | { x = 501.83450317383, y = 862.40264892578, z = 197.48085021973, heading = 68.052467346191, type = 5 }, 273 | { x = 471.42984008789, y = 913.439453125, z = 197.93460083008, heading = 346.66537475586, type = 5 }, 274 | { x = 535.99639892578, y = 1053.1295166016, z = 222.24603271484, heading = 5.8948431015015, type = 5 }, 275 | { x = 461.87451171875, y = 1102.5607910156, z = 230.83129882813, heading = 77.158508300781, type = 5 }, 276 | { x = 411.60482788086, y = 1239.8614501953, z = 256.15197753906, heading = 1.1716737747192, type = 5 }, 277 | { x = 503.56091308594, y = 1314.6312255859, z = 283.54666137695, heading = 292.54150390625, type = 5 }, 278 | { x = 600.24774169922, y = 1406.8585205078, z = 314.74124145508, heading = 270.03912353516, type = 5 }, 279 | { x = 731.66064453125, y = 1356.7783203125, z = 336.94409179688, heading = 282.65274047852, type = 5 }, 280 | { x = 857.69366455078, y = 1309.7030029297, z = 356.31665039063, heading = 175.57710266113, type = 5 }, 281 | { x = 825.40734863281, y = 1276.6529541016, z = 359.99813842773, heading = 94.132011413574, type = 9 } 282 | } 283 | }, 284 | { 285 | title = "Highway Sprint", 286 | isEnabled = true, 287 | showWaypoints = true, 288 | checkpointRadius = 20.0, 289 | checkpointTransparency = 1.0, 290 | mapBlipId = 315, 291 | mapBlipColor = 5, 292 | start = { x = 75.513229370117, y = -1267.1221923828, z = 28.65661239624, heading = 267.10388183594, type = 5 }, 293 | checkpoints = { 294 | { x = 245.46575927734, y = -1226.30078125, z = 37.771774291992, heading = 270.39596557617, type = 5 }, 295 | { x = 828.93774414063, y = -1201.6872558594, z = 45.167724609375, heading = 272.86663818359, type = 5 }, 296 | { x = 1120.2836914063, y = -1189.5764160156, z = 55.044425964355, heading = 271.21286010742, type = 5 }, 297 | { x = 1664.4847412109, y = -940.15826416016, z = 64.514312744141, heading = 300.4723815918, type = 5 }, 298 | { x = 2046.6374511719, y = -656.87005615234, z = 94.291999816895, heading = 308.82989501953, type = 5 }, 299 | { x = 2382.7224121094, y = -300.69787597656, z = 84.462699890137, heading = 329.07653808594, type = 5 }, 300 | { x = 2589.7526855469, y = 183.37069702148, z = 97.677200317383, heading = 345.33544921875, type = 5 }, 301 | { x = 2623.666015625, y = 581.41815185547, z = 94.804725646973, heading = 9.5683755874634, type = 5 }, 302 | { x = 2435.982421875, y = 988.86212158203, z = 85.55233001709, heading = 39.079048156738, type = 5 }, 303 | { x = 2083.1940917969, y = 1437.5494384766, z = 75.084121704102, heading = 28.737808227539, type = 5 }, 304 | { x = 1880.8665771484, y = 2110.0961914063, z = 54.124622344971, heading = 5.5711803436279, type = 5 }, 305 | { x = 2028.6341552734, y = 2562.3408203125, z = 54.112937927246, heading = 315.82192993164, type = 5 }, 306 | { x = 2417.0134277344, y = 2894.4228515625, z = 39.738132476807, heading = 308.01019287109, type = 5 }, 307 | { x = 2914.9418945313, y = 3708.0886230469, z = 52.139362335205, heading = 344.47491455078, type = 5 }, 308 | { x = 2757.3366699219, y = 4601.6293945313, z = 44.669410705566, heading = 14.183204650879, type = 5 }, 309 | { x = 2537.2282714844, y = 5471.9150390625, z = 44.061031341553, heading = 17.688333511353, type = 9 } 310 | } 311 | }, 312 | { 313 | title = "Lakeside Loop", 314 | isEnabled = true, 315 | showWaypoints = true, 316 | checkpointRadius = 24.0, 317 | checkpointTransparency = 1.0, 318 | mapBlipId = 315, 319 | mapBlipColor = 5, 320 | start = { x = 1886.826171875, y = 3622.4047851562, z = 33.811820983886, heading = 118.15670776368, type = 5 }, 321 | checkpoints = { 322 | { x = 1711.3807373046, y = 3520.2746582032, z = 36.014781951904, heading = 118.77588653564, type = 5 }, 323 | { x = 1462.6616210938, y = 3501.1486816406, z = 35.690353393554, heading = 74.668426513672, type = 5 }, 324 | { x = 1206.35546875, y = 3539.3190917968, z = 34.728713989258, heading = 87.506393432618, type = 5 }, 325 | { x = 776.36102294922, y = 3533.2995605468, z = 33.792770385742, heading = 95.614479064942, type = 5 }, 326 | { x = 359.71536254882, y = 3463.2805175782, z = 35.06834411621, heading = 111.85373687744, type = 5 }, 327 | { x = 223.08010864258, y = 3396.1552734375, z = 37.935890197754, heading = 93.261711120606, type = 5 }, 328 | { x = 93.846809387208, y = 3455.8029785156, z = 39.333072662354, heading = 6.060736656189, type = 5 }, 329 | { x = 38.593032836914, y = 3600.6357421875, z = 39.329750061036, heading = 74.91145324707, type = 5 }, 330 | { x = -113.98025512696, y = 3624.1779785156, z = 44.394584655762, heading = 55.176532745362, type = 5 }, 331 | { x = -215.44192504882, y = 3824.8474121094, z = 37.782653808594, heading = 16.481645584106, type = 5 }, 332 | { x = -229.21249389648, y = 4130.1157226562, z = 40.016460418702, heading = 345.9859008789, type = 5 }, 333 | { x = -73.620727539062, y = 4332.7094726562, z = 49.825462341308, heading = 341.80001831054, type = 5 }, 334 | { x = 46.478607177734, y = 4452.07421875, z = 62.420101165772, heading = 258.33905029296, type = 5 }, 335 | { x = 219.50521850586, y = 4461.28125, z = 69.154067993164, heading = 313.70938110352, type = 5 }, 336 | { x = 372.04113769532, y = 4445.9677734375, z = 62.40107345581, heading = 198.80307006836, type = 5 }, 337 | { x = 507.0467224121, y = 4279.6162109375, z = 53.12911605835, heading = 220.28533935546, type = 5 }, 338 | { x = 658.1005859375, y = 4218.4741210938, z = 52.60580444336, heading = 267.40612792968, type = 5 }, 339 | { x = 862.02856445312, y = 4264.1791992188, z = 50.318134307862, heading = 3.4469072818756, type = 5 }, 340 | { x = 816.0771484375, y = 4455.5751953125, z = 52.209590911866, heading = 13.039127349854, type = 5 }, 341 | { x = 860.63250732422, y = 4485.0107421875, z = 52.576694488526, heading = 231.01950073242, type = 5 }, 342 | { x = 1082.4252929688, y = 4439.3784179688, z = 59.7551612854, heading = 250.73699951172, type = 5 }, 343 | { x = 1266.754272461, y = 4466.8696289062, z = 58.386367797852, heading = 274.06317138672, type = 5 }, 344 | { x = 1349.6512451172, y = 4486.46875, z = 58.326972961426, heading = 290.29901123046, type = 5 }, 345 | { x = 1560.3768310546, y = 4566.6674804688, z = 49.121070861816, heading = 276.58981323242, type = 5 }, 346 | { x = 1837.927734375, y = 4575.80078125, z = 35.7375831604, heading = 276.8621520996, type = 5 }, 347 | { x = 2091.0400390625, y = 4707.3481445312, z = 40.748161315918, heading = 317.01858520508, type = 5 }, 348 | { x = 2366.7451171875, y = 4675.9145507812, z = 35.594787597656, heading = 222.09948730468, type = 5 }, 349 | { x = 2483.2963867188, y = 4447.0405273438, z = 35.005695343018, heading = 182.41502380372, type = 5 }, 350 | { x = 2500.3842773438, y = 4111.2534179688, z = 37.965755462646, heading = 157.26278686524, type = 5 }, 351 | { x = 2262.7744140625, y = 3838.9599609375, z = 33.896495819092, heading = 117.32835388184, type = 5 }, 352 | { x = 1851.0246582032, y = 3601.6157226562, z = 34.37642288208, heading = 119.03327941894, type = 9 } 353 | } 354 | }, 355 | { 356 | title = "North Rallycross ", 357 | isEnabled = true, 358 | showWaypoints = true, 359 | checkpointRadius = 20.0, 360 | checkpointTransparency = 1.0, 361 | mapBlipId = 315, 362 | mapBlipColor = 5, 363 | start = { x = -2499.0197753906, y = 3666.5871582032, z = 12.954191207886, heading = 81.60691833496, type = 5 }, 364 | checkpoints = { 365 | { x = -2633.7170410156, y = 3475.1098632812, z = 14.487664222718, heading = 92.000801086426, type = 5 }, 366 | { x = -2966.669921875, y = 3496.8244628906, z = 8.6374959945678, heading = 141.51609802246, type = 5 }, 367 | { x = -2989.6901855468, y = 3290.7316894532, z = 9.561598777771, heading = 211.46875, type = 5 }, 368 | { x = -2760.3291015625, y = 3084.1491699218, z = 8.5316543579102, heading = 233.60375976562, type = 5 }, 369 | { x = -2626.3073730468, y = 2904.9313964844, z = 4.9756264686584, heading = 228.95942687988, type = 5 }, 370 | { x = -2465.6428222656, y = 2837.05078125, z = 3.263032913208, heading = 272.26171875, type = 5 }, 371 | { x = -2273.5065917968, y = 2838.6962890625, z = 3.0335659980774, heading = 259.87799072266, type = 5 }, 372 | { x = -2124.82421875, y = 2715.33984375, z = 3.0864045619964, heading = 254.40844726562, type = 5 }, 373 | { x = -1855.629272461, y = 2691.4741210938, z = 3.7209014892578, heading = 267.99426269532, type = 5 }, 374 | { x = -1741.4565429688, y = 2744.5908203125, z = 5.154116153717, heading = 285.24072265625, type = 5 }, 375 | { x = -1629.551147461, y = 2708.9465332032, z = 5.3154859542846, heading = 287.2060546875, type = 5 }, 376 | { x = -1469.754272461, y = 2682.4565429688, z = 3.3802332878112, heading = 288.75396728516, type = 5 }, 377 | { x = -1203.5026855468, y = 2800.7104492188, z = 14.475507736206, heading = 320.32543945312, type = 5 }, 378 | { x = -1016.655090332, y = 2895.8278808594, z = 11.531224250794, heading = 273.8276977539, type = 5 }, 379 | { x = -790.90063476562, y = 2893.7612304688, z = 24.756513595582, heading = 311.09204101562, type = 5 }, 380 | { x = -615.11547851562, y = 3016.8815917968, z = 24.307655334472, heading = 275.87579345704, type = 5 }, 381 | { x = -451.07342529296, y = 2970.796875, z = 24.589477539062, heading = 259.12017822266, type = 5 }, 382 | { x = -265.79907226562, y = 2948.3681640625, z = 29.465747833252, heading = 273.07934570312, type = 5 }, 383 | { x = -107.0493774414, y = 2979.8776855468, z = 36.081687927246, heading = 285.74063110352, type = 5 }, 384 | { x = 98.11506652832, y = 3108.0971679688, z = 40.855293273926, heading = 321.23254394532, type = 5 }, 385 | { x = 176.24142456054, y = 3235.59765625, z = 41.773357391358, heading = 331.16900634766, type = 5 }, 386 | { x = 226.01635742188, y = 3353.8967285156, z = 39.22008895874, heading = 19.685445785522, type = 5 }, 387 | { x = 95.192169189454, y = 3485.7375488282, z = 39.410301208496, heading = 341.30731201172, type = 5 }, 388 | { x = 74.494873046875, y = 3589.2866210938, z = 39.421661376954, heading = 76.19287109375, type = 5 }, 389 | { x = -139.40495300292, y = 3642.5458984375, z = 45.474407196044, heading = 52.72838973999, type = 5 }, 390 | { x = -222.28861999512, y = 3855.259765625, z = 38.859828948974, heading = 12.133317947388, type = 5 }, 391 | { x = -262.49810791016, y = 3933.7314453125, z = 41.5452003479, heading = 38.738338470458, type = 5 }, 392 | { x = -408.74649047852, y = 3951.4167480468, z = 62.755989074708, heading = 112.7532043457, type = 5 }, 393 | { x = -564.9985961914, y = 3969.4855957032, z = 106.0877609253, heading = 43.403888702392, type = 5 }, 394 | { x = -651.44354248046, y = 4011.5671386718, z = 126.74110412598, heading = 72.391319274902, type = 5 }, 395 | { x = -782.36138916016, y = 4051.826171875, z = 155.87812805176, heading = 87.594024658204, type = 5 }, 396 | { x = -886.56024169922, y = 4094.8879394532, z = 163.09080505372, heading = 65.014793395996, type = 5 }, 397 | { x = -1075.157836914, y = 4273.146484375, z = 100.55354309082, heading = 71.051765441894, type = 5 }, 398 | { x = -1290.1850585938, y = 4261.9194335938, z = 63.584247589112, heading = 152.71101379394, type = 5 }, 399 | { x = -1359.0450439454, y = 4130.0244140625, z = 62.67975616455, heading = 72.865257263184, type = 5 }, 400 | { x = -1460.0047607422, y = 4223.5126953125, z = 51.78816986084, heading = 75.20492553711, type = 5 }, 401 | { x = -1577.794921875, y = 4203.2358398438, z = 79.59358215332, heading = 99.154815673828, type = 5 }, 402 | { x = -1725.0910644532, y = 4328.798828125, z = 64.1781539917, heading = 47.08869934082, type = 5 }, 403 | { x = -1988.5760498046, y = 4499.5190429688, z = 30.565328598022, heading = 59.613861083984, type = 5 }, 404 | { x = -2175.0705566406, y = 4514.2114257812, z = 34.90055847168, heading = 114.7021484375, type = 5 }, 405 | { x = -2256.43359375, y = 4407.7456054688, z = 39.290161132812, heading = 162.9909210205, type = 5 }, 406 | { x = -2261.0397949218, y = 4347.6440429688, z = 43.041870117188, heading = 190.64225769042, type = 9 } 407 | } 408 | }, 409 | { 410 | title = "Hillside Loop", 411 | isEnabled = true, 412 | showWaypoints = true, 413 | checkpointRadius = 16.0, 414 | checkpointTransparency = 1.0, 415 | mapBlipId = 315, 416 | mapBlipColor = 5, 417 | start = { x = 1075.298461914, y = 746.6328125, z = 154.2712097168, heading = 121.91492462158, type = 5 }, 418 | checkpoints = { 419 | { x = 969.58581542968, y = 645.78497314454, z = 165.17358398438, heading = 78.142349243164, type = 5 }, 420 | { x = 929.212890625, y = 741.45281982422, z = 183.17880249024, heading = 356.3341369629, type = 5 }, 421 | { x = 990.66833496094, y = 926.40588378906, z = 213.06823730468, heading = 18.209358215332, type = 5 }, 422 | { x = 852.70709228516, y = 981.2666015625, z = 240.5387878418, heading = 108.46174621582, type = 5 }, 423 | { x = 666.72650146484, y = 782.78662109375, z = 204.87017822266, heading = 93.711532592774, type = 5 }, 424 | { x = 403.40838623046, y = 908.32122802734, z = 199.61280822754, heading = 25.59401512146, type = 5 }, 425 | { x = 293.9772644043, y = 1001.8652954102, z = 209.77770996094, heading = 101.9250793457, type = 5 }, 426 | { x = 191.59265136718, y = 916.29223632812, z = 208.24444580078, heading = 90.105865478516, type = 5 }, 427 | { x = 59.02917098999, y = 1030.1206054688, z = 216.92413330078, heading = 65.812629699708, type = 5 }, 428 | { x = -275.8275756836, y = 1054.9682617188, z = 234.73652648926, heading = 109.05806732178, type = 5 }, 429 | { x = -343.32287597656, y = 967.30114746094, z = 232.64987182618, heading = 112.64511871338, type = 5 }, 430 | { x = -437.24960327148, y = 901.29528808594, z = 236.9234161377, heading = 101.32470703125, type = 5 }, 431 | { x = -564.4642944336, y = 956.24981689454, z = 242.15672302246, heading = 36.907333374024, type = 5 }, 432 | { x = -724.94714355468, y = 1013.831237793, z = 238.6925201416, heading = 350.39776611328, type = 5 }, 433 | { x = -714.42883300782, y = 1126.9636230468, z = 260.46542358398, heading = 31.252969741822, type = 5 }, 434 | { x = -763.58471679688, y = 1184.3771972656, z = 261.6837463379, heading = 23.987768173218, type = 5 }, 435 | { x = -804.34552001954, y = 1424.1372070312, z = 241.80868530274, heading = 353.0701599121, type = 5 }, 436 | { x = -769.86907958984, y = 1675.2131347656, z = 200.53128051758, heading = 319.43444824218, type = 5 }, 437 | { x = -677.14093017578, y = 1742.7390136718, z = 206.18270874024, heading = 252.91632080078, type = 5 }, 438 | { x = -576.66729736328, y = 1824.5227050782, z = 212.1713256836, heading = 338.91174316406, type = 5 }, 439 | { x = -499.48190307618, y = 1992.1813964844, z = 206.03666687012, heading = 282.18432617188, type = 5 }, 440 | { x = -409.51181030274, y = 1918.7518310546, z = 206.8990020752, heading = 202.36854553222, type = 5 }, 441 | { x = -269.09524536132, y = 1825.804321289, z = 198.23260498046, heading = 291.8083190918, type = 5 }, 442 | { x = -141.86988830566, y = 1865.2860107422, z = 197.57287597656, heading = 248.73611450196, type = 5 }, 443 | { x = -0.93955796957016, y = 1765.8305664062, z = 216.4091796875, heading = 190.2306213379, type = 5 }, 444 | { x = 163.80993652344, y = 1659.3505859375, z = 228.5812072754, heading = 295.48818969726, type = 5 }, 445 | { x = 363.42764282226, y = 1715.7644042968, z = 239.94078063964, heading = 311.31579589844, type = 5 }, 446 | { x = 553.83581542968, y = 1802.0145263672, z = 212.27737426758, heading = 264.99920654296, type = 5 }, 447 | { x = 797.60485839844, y = 1707.359008789, z = 174.52555847168, heading = 272.9049987793, type = 5 }, 448 | { x = 1041.6525878906, y = 1705.5604248046, z = 162.08283996582, heading = 229.91752624512, type = 5 }, 449 | { x = 1230.034790039, y = 1255.1221923828, z = 143.87908935546, heading = 168.75427246094, type = 5 }, 450 | { x = 1149.5358886718, y = 1117.4764404296, z = 171.4916381836, heading = 183.98384094238, type = 5 }, 451 | { x = 1235.7309570312, y = 1017.043395996, z = 143.4641571045, heading = 184.27030944824, type = 5 }, 452 | { x = 1164.5404052734, y = 918.81359863282, z = 150.2805633545, heading = 138.49966430664, type = 5 }, 453 | { x = 1079.446899414, y = 776.37188720704, z = 153.45388793946, heading = 149.79602050782, type = 9 } 454 | } 455 | } 456 | } 457 | --------------------------------------------------------------------------------