[RELEASE] Pringus Simple Race Script

Putting this in discussion because I’m not allowed to post in releases. If a mod could move it, that’d be great.

Been working on a simple race script. Currently, it’s more like a time trial with checkpoints. I looked over the forums and couldn’t find anyone trying to do anything similar.

Please note that currently, the countdown timer doesn’t freeze player movement properly, so your time for the race won’t be entirely accurate. If someone knows how to fix this, please let me know.

Also, there’s a lot of stuff in there that some people aren’t huge fans of. Most of it can be commented out and still work fine.

Special thanks to a few folks in the discord for answering my stupid questions:
d0p3t
zr0iq
Mittens
rik rik bam bam

To create a race, simply edit the CheckPoints[x].
Add checkpoints using the formatting:
CheckPoints[1] = { x = 0, y = 0, z = 0, type = 5}
Number in brackets is the number of the checkpoint (CheckPoints[1] would be the first
checkpoint in the race)
Change the checkpoint type to determine whether or not it will be a checkpoint or
the finish line. type = 5 for regular checkpoints, type = 9 for the finish.

The example race is in North Yankton.

--Pringus race script (probably more accurately a time trial script)
--todo: add laps?

function LocalPed()
	return GetPlayerPed(-1)
end
 
--Edit the xyz coords of this blip to change the starting line for the race
local blips = {
    {title="Yankton Race", colour=5, id=315, x= 3103.01, y= -4826.48, z= 111.81}
}


local IsRacing = false 
local cP = 1
local cP2 = 2
local checkpoint
local blip
local startTime

--[[

Add checkpoints using the formatting:
CheckPoints[1] =  	{ x = 0, y = 0, z = 0, type = 5}
Number in brackets is the number of the checkpoint (CheckPoints[1] would be the first 
checkpoint in the race)
Change the checkpoint type to determine whether or not it will be a checkpoint or
the finish line. type = 5 for regular checkpoints, type = 9 for the finish.

The example race is in North Yankton.

]]
local CheckPoints = {}
CheckPoints[1] =  	{ x = 3193.48, y = -4833.70, z = 111.10, type = 5}
CheckPoints[2] =	{ x = 3220.04, y = -4723.66, z = 111.59, type = 5}
CheckPoints[3] =	{ x = 3259.36, y = -4683.49, z = 112.09, type = 5}
CheckPoints[4] =	{ x = 3213.41, y = -4788.37, z = 111.09, type = 5}
CheckPoints[5] =	{ x = 3273.93, y = -4842.86, z = 111.08, type = 5}
CheckPoints[6] =	{ x = 3448.06, y = -4860.14, z = 111.06, type = 5}
CheckPoints[7] =	{ x = 3512.24, y = -4863.06, z = 110.98, type = 5}
CheckPoints[8] =	{ x = 3536.23, y = -4734.19, z = 111.84, type = 5}
CheckPoints[9] =	{ x = 3535.28, y = -4676.86, z = 113.47, type = 5}
CheckPoints[10] =  	{ x = 3493.69, y = -4660.35, z = 114.08, type = 5}
CheckPoints[11] =  	{ x = 3296.20, y = -4614.22, z = 115.23, type = 5}
CheckPoints[12] =  	{ x = 3241.98, y = -4617.21, z = 115.14, type = 5}
CheckPoints[13] =	{ x = 3236.97, y = -4655.57, z = 113.90, type = 5}
CheckPoints[14] =  	{ x = 3243.55, y = -4682.48, z = 112.04, type = 5}
CheckPoints[15] =  	{ x = 3210.94, y = -4817.35, z = 111.09, type = 9}

Citizen.CreateThread(function()
    preRace()
end)

function preRace()
    while not IsRacing do
        Citizen.Wait(0)
            --[[if (IsControlJustReleased(1, 47)) then
                SetPedCoordsKeepVehicle(LocalPed(), 3103.01, -4826.48, 111.81)
                TriggerServerEvent("printPlayers")
            end]]
            DrawMarker(1, 3103.01, -4826.48, 111.81 - 1, 0, 0, 0, 0, 0, 0, 3.0001, 3.0001, 1.5001, 255, 165, 0,165, 0, 0, 0,0) 
        if GetDistanceBetweenCoords( 3103.01, -4826.48, 111.81, GetEntityCoords(LocalPed())) < 50.0 then
            	Draw3DText( 3103.01, -4826.48, 111.81  +.500, "Yankton",7,0.3,0.2)
            	Draw3DText( 3103.01, -4826.48, 111.81  +.100, "Race",7,0.3,0.2)
        end
        if GetDistanceBetweenCoords( 3103.01, -4826.48, 111.81, GetEntityCoords(LocalPed())) < 2.0 then
            TriggerEvent("fs_freemode:displayHelp", "Press ~INPUT_CONTEXT~ to Race!")
            if (IsControlJustReleased(1, 38)) then
                if IsRacing == false then
                    IsRacing = true
                    TriggerEvent("cRace:TPAll")
                else
                    return
                end
            end
        end
    end
end

RegisterNetEvent("cRace:TPAll")
AddEventHandler("cRace:TPAll", function()
    SetPedCoordsKeepVehicle(PlayerPedId(), 3103.01, -4826.48, 111.81)
    SetEntityHeading(PlayerPedId(), 265.0)
    Citizen.CreateThread(function()
        local time = 0
        function setcountdown(x)
          time = GetGameTimer() + x*1000
        end
        function getcountdown()
          return math.floor((time-GetGameTimer())/1000)
        end
        setcountdown(6)
        while getcountdown() > 0 do
            Citizen.Wait(1)
            
            --how the hell do I disable controls?

            DrawHudText(getcountdown(), {255,191,0,255},0.5,0.4,4.0,4.0)
        end
            TriggerEvent("fs_race:BeginRace")
    end)
end)

RegisterNetEvent("fs_race:BeginRace") --main loop
AddEventHandler("fs_race:BeginRace", function()
    startTime = GetGameTimer()
    Citizen.CreateThread(function()
        checkpoint = CreateCheckpoint(CheckPoints[cP].type, CheckPoints[cP].x,  CheckPoints[cP].y,  CheckPoints[cP].z + 2, CheckPoints[cP2].x, CheckPoints[cP2].y, CheckPoints[cP2].z, 8.0, 204, 204, 1, 100, 0)
        blip = AddBlipForCoord(CheckPoints[cP].x, CheckPoints[cP].y, CheckPoints[cP].z)          
        while IsRacing do 
            Citizen.Wait(5)
            SetVehicleDensityMultiplierThisFrame(0.0)
            SetPedDensityMultiplierThisFrame(0.0)
            SetRandomVehicleDensityMultiplierThisFrame(0.0)
            SetParkedVehicleDensityMultiplierThisFrame(0.0)
            SetScenarioPedDensityMultiplierThisFrame(0.0, 0.0)

            --Comment these out if you don't want HUD text
            DrawHudText(math.floor(GetDistanceBetweenCoords(CheckPoints[cP].x,  CheckPoints[cP].y,  CheckPoints[cP].z, GetEntityCoords(GetPlayerPed(-1)))) .. " meters", {249, 249, 249,255},0.0,0.75,1.0,1.0)
            DrawHudText(string.format("%i / %i", cP, tablelength(CheckPoints)), {249, 249, 249, 255},0.7,0.0,1.5,1.5)
            DrawHudText(formatTimer(startTime, GetGameTimer()), {249, 249, 249,255},0.0,0.0,1.5,1.5)
                if GetDistanceBetweenCoords(CheckPoints[cP].x,  CheckPoints[cP].y,  CheckPoints[cP].z, GetEntityCoords(GetPlayerPed(-1))) < 10.0 then
                    if CheckPoints[cP].type == 5 then
                        DeleteCheckpoint(checkpoint)
                        RemoveBlip(blip)
                        PlaySoundFrontend(-1, "RACE_PLACED", "HUD_AWARDS")
                        cP = math.ceil(cP+1)
                        cP2 = math.ceil(cP2+1)
                        checkpoint = CreateCheckpoint(CheckPoints[cP].type, CheckPoints[cP].x,  CheckPoints[cP].y,  CheckPoints[cP].z + 2, CheckPoints[cP2].x, CheckPoints[cP2].y, CheckPoints[cP2].z, 8.0, 204, 204, 1, 100, 0)
                        blip = AddBlipForCoord(CheckPoints[cP].x, CheckPoints[cP].y, CheckPoints[cP].z)
                    else
                        PlaySoundFrontend(-1, "ScreenFlash", "WastedSounds")
                        DeleteCheckpoint(checkpoint)
                        RemoveBlip(blip)
                        IsRacing = false
                        cP = 1
                        cP2 = 2
                        TriggerEvent("chatMessage", "Server", {0,0,0}, string.format("Finished with a time of " .. formatTimer(startTime, GetGameTimer())))
                        preRace()
                    end
                    else
                end
            end
        end)
end)


--utility funcs

function tablelength(T)
    local count = 0
    for _ in pairs(T) do 
    count = count + 1 end
    return count
end

function formatTimer(startTime, currTime)
    local newString = currTime - startTime
        local ms = string.sub(newString, -3, -2)
        local sec = string.sub(newString, -5, -4)
        local min = string.sub(newString, -7, -6)
        --newString = string.sub(newString, -1)
        newString = string.format("%s%s.%s", min, sec, ms)
    return newString
end

function Draw3DText(x,y,z,textInput,fontId,scaleX,scaleY)
         local px,py,pz=table.unpack(GetGameplayCamCoords())
         local dist = GetDistanceBetweenCoords(px,py,pz, x,y,z, 1)
    
         local scale = (1/dist)*20
         local fov = (1/GetGameplayCamFov())*100
         local scale = scale*fov
    
         SetTextScale(scaleX*scale, scaleY*scale)
         SetTextFont(fontId)
         SetTextProportional(1)
         SetTextColour(255, 255, 255, 250)
         SetTextDropshadow(1, 1, 1, 1, 255)
         SetTextEdge(2, 0, 0, 0, 150)
         SetTextDropShadow()
         SetTextOutline()
         SetTextEntry("STRING")
         SetTextCentre(1)
         AddTextComponentString(textInput)
         SetDrawOrigin(x,y,z+2, 0)
         DrawText(0.0, 0.0)
         ClearDrawOrigin()
        end

function DrawHudText(text,colour,coordsx,coordsy,scalex,scaley) --courtesy of driftcounter
    SetTextFont(7)
    SetTextProportional(7)
    SetTextScale(scalex, scaley)
    local colourr,colourg,colourb,coloura = table.unpack(colour)
    SetTextColour(colourr,colourg,colourb, coloura)
    SetTextDropshadow(0, 0, 0, 0, coloura)
    SetTextEdge(1, 0, 0, 0, coloura)
    SetTextDropShadow()
    SetTextOutline()
    SetTextEntry("STRING")
    AddTextComponentString(text)
    DrawText(coordsx,coordsy)
end

--create blip
Citizen.CreateThread(function()
    for _, info in pairs(blips) do
        info.blip = AddBlipForCoord(info.x, info.y, info.z)
        SetBlipSprite(info.blip, info.id)
        SetBlipDisplay(info.blip, 4)
        SetBlipScale(info.blip, 1.0)
        SetBlipColour(info.blip, info.colour)
        SetBlipAsShortRange(info.blip, true)
        BeginTextCommandSetBlipName("STRING")
        AddTextComponentString(info.title)
        EndTextCommandSetBlipName(info.blip)
    end
end)

14 Likes

moved it for you :wink:

Very Nice Could come in handy!!!
Keep up

Looks very good :grin:

Where is download link ?

There is no download link, he gives the code in the post.

How do I get this mod to work? For dummies ^^

1 Like

How do i even start the race? :smiley: i edited all the cordinates.

What Would we have to put in the resource file to run this ?--------
----------------- Never mind i got it to work :slight_smile: but every time you finish a race you got to restart the resource and the chat message thats in there does not shop up after a race for me

SetPlayerControl(PlayerId(),false,256)

SetPlayerControl(PlayerId(),true)

I didn’t have a chance to test it but I’m pretty sure these are the commands to freeze a player’s controls.
Also, after the race, I can’t start it again. Does that happen to everyone? Because I see preRace() at the bottom but it doesn’t seem to execute. I’m not sure why. (I’m not very good at lua scripting :frowning: )

Yeah it’s just like what OXMODD3R said in his edit.

The script is otherwise very nicely done! I like simple ones like this. No databases or dependencies on other scripts. I would love to see this work for other players too though. :smiley:

1 Like

Seems to be in the way it counts the checkpoints. There is probably a better way, but my lazy fix was to repeat the last checkpoint

then add CheckPoints[16] = { x = 3210.94, y = -4817.35, z = 111.09, type = 9}

Worked for me after that.

1 Like

Hey there everyone,

Can someone tell me what I’m doing wrong? I can get the minimap and map icon to show but when I’m there, there is no circles, no 3d text, no notification to press something to start, just nothing at all. In the OP, it stated just to change checkpoints but it seems he’s buried coordinates all through the script. At first, I tried replacing the coords with blips.x, blips.y and blips.z but got no starting line so I just used a replace function in the text editor to change the x, y and z so I wouldn’t make a mistake and still nothing shows.

My version is supposed to start at the base western base of Mt. Chiliad and end at the top. I tried using the OP’s demo coords for testing but if I teleport to the starting line, I end up a couple hundred feet over the battleship.

If anyone could tell me why this doesn’t show anything more than a map blip, I’d be very appreciative!

--Pringus race script (probably more accurately a time trial script)
--todo: add laps?

function LocalPed()
	return GetPlayerPed(-1)
end
 
--Edit the xyz coords of this blip to change the starting line for the race
local blips = {
	-- {title="Chiliad Mountain Race", colour=5, id=315, x= -799.41, y= 5401.71, z= 34.21}
    {title="Yankton Race", colour=5, id=315, x= -799.41, y= 5401.71, z= 34.21}
}


local IsRacing = false 
local cP = 1
local cP2 = 2
local checkpoint
local blip
local startTime

--[[

Add checkpoints using the formatting:
CheckPoints[1] =  	{ x = 0, y = 0, z = 0, type = 5}
Number in brackets is the number of the checkpoint (CheckPoints[1] would be the first 
checkpoint in the race)
Change the checkpoint type to determine whether or not it will be a checkpoint or
the finish line. type = 5 for regular checkpoints, type = 9 for the finish.

The example race is in North Yankton.

]]
local CheckPoints = {}
CheckPoints[1] =  	{ x = -704.72, y = 5401.20, z =  34.21, type = 5}
CheckPoints[2] =	{ x = -707.56, y = 5286.41, z =  72.79, type = 5}
CheckPoints[3] =	{ x = -637.18, y = 5209.41, z =  82.33, type = 5}
CheckPoints[4] =	{ x = -570.84, y = 5053.54, z = 132.13, type = 5}
CheckPoints[5] =	{ x = -381.00, y = 4908.91, z = 193.61, type = 5}
CheckPoints[6] =	{ x = -301.82, y = 4970.74, z = 243.78, type = 5}
CheckPoints[7] =	{ x = -219.58, y = 4902.72, z = 314.37, type = 5}
CheckPoints[8] =	{ x =  -94.44, y = 4938.72, z = 378.89, type = 5}
CheckPoints[9] =	{ x =   16.47, y = 5028.70, z = 451.93, type = 5}
CheckPoints[10] =  	{ x =   99.42, y = 5088.46, z = 502.69, type = 5}
CheckPoints[11] =  	{ x =  134.96, y = 5213.44, z = 546.21, type = 5}
CheckPoints[12] =  	{ x =  230.67, y = 5300.07, z = 619.84, type = 5}
CheckPoints[13] =	{ x =  402.28, y = 5504.77, z = 728.41, type = 5}
CheckPoints[14] =  	{ x =  523.91, y = 5615.44, z = 780.27, type = 9}
CheckPoints[15] =  	{ x =  523.91, y = 5615.44, z = 780.27, type = 9}

Citizen.CreateThread(function()
    preRace()
end)

function preRace()
    while not IsRacing do
        Citizen.Wait(0)
            --[[if (IsControlJustReleased(1, 47)) then
                SetPedCoordsKeepVehicle(LocalPed(), -799.41, 5401.71, 34.21)
                TriggerServerEvent("printPlayers")
            end]]
            DrawMarker(1, -799.41, 5401.71, 34.21 - 1, 0, 0, 0, 0, 0, 0, 3.0001, 3.0001, 1.5001, 255, 165, 0,165, 0, 0, 0,0) 
        if GetDistanceBetweenCoords( -799.41, 5401.71, 34.21, GetEntityCoords(LocalPed())) < 50.0 then
            	Draw3DText( -799.41, 5401.71, 34.21  +.500, "Yankton",7,0.3,0.2)
            	Draw3DText( -799.41, 5401.71, 34.21  +.100, "Race",7,0.3,0.2)
        end
        if GetDistanceBetweenCoords( -799.41, 5401.71, 34.21, GetEntityCoords(LocalPed())) < 2.0 then
            TriggerEvent("fs_freemode:displayHelp", "Press ~INPUT_CONTEXT~ to Race!")
            if (IsControlJustReleased(1, 38)) then
                if IsRacing == false then
                    IsRacing = true
                    TriggerEvent("cRace:TPAll")
                else
                    return
                end
            end
        end
    end
end

RegisterNetEvent("cRace:TPAll")
AddEventHandler("cRace:TPAll", function()
    SetPedCoordsKeepVehicle(PlayerPedId(), -799.41, 5401.71, 34.21)
    SetEntityHeading(PlayerPedId(), 265.0)
    Citizen.CreateThread(function()
        local time = 0
        function setcountdown(x)
          time = GetGameTimer() + x*1000
        end
        function getcountdown()
          return math.floor((time-GetGameTimer())/1000)
        end
        setcountdown(6)
        while getcountdown() > 0 do
            Citizen.Wait(1)
            
            --how the hell do I disable controls?

            DrawHudText(getcountdown(), {255,191,0,255},0.5,0.4,4.0,4.0)
        end
            TriggerEvent("fs_race:BeginRace")
    end)
end)

RegisterNetEvent("fs_race:BeginRace") --main loop
AddEventHandler("fs_race:BeginRace", function()
    startTime = GetGameTimer()
    Citizen.CreateThread(function()
        checkpoint = CreateCheckpoint(CheckPoints[cP].type, CheckPoints[cP].x,  CheckPoints[cP].y,  CheckPoints[cP].z + 2, CheckPoints[cP2].x, CheckPoints[cP2].y, CheckPoints[cP2].z, 8.0, 204, 204, 1, 100, 0)
        blip = AddBlipForCoord(CheckPoints[cP].x, CheckPoints[cP].y, CheckPoints[cP].z)          
        while IsRacing do 
            Citizen.Wait(5)
            SetVehicleDensityMultiplierThisFrame(0.0)
            SetPedDensityMultiplierThisFrame(0.0)
            SetRandomVehicleDensityMultiplierThisFrame(0.0)
            SetParkedVehicleDensityMultiplierThisFrame(0.0)
            SetScenarioPedDensityMultiplierThisFrame(0.0, 0.0)

            --Comment these out if you don't want HUD text
            DrawHudText(math.floor(GetDistanceBetweenCoords(CheckPoints[cP].x,  CheckPoints[cP].y,  CheckPoints[cP].z, GetEntityCoords(GetPlayerPed(-1)))) .. " meters", {249, 249, 249,255},0.0,0.75,1.0,1.0)
            DrawHudText(string.format("%i / %i", cP, tablelength(CheckPoints)), {249, 249, 249, 255},0.7,0.0,1.5,1.5)
            DrawHudText(formatTimer(startTime, GetGameTimer()), {249, 249, 249,255},0.0,0.0,1.5,1.5)
                if GetDistanceBetweenCoords(CheckPoints[cP].x,  CheckPoints[cP].y,  CheckPoints[cP].z, GetEntityCoords(GetPlayerPed(-1))) < 10.0 then
                    if CheckPoints[cP].type == 5 then
                        DeleteCheckpoint(checkpoint)
                        RemoveBlip(blip)
                        PlaySoundFrontend(-1, "RACE_PLACED", "HUD_AWARDS")
                        cP = math.ceil(cP+1)
                        cP2 = math.ceil(cP2+1)
                        checkpoint = CreateCheckpoint(CheckPoints[cP].type, CheckPoints[cP].x,  CheckPoints[cP].y,  CheckPoints[cP].z + 2, CheckPoints[cP2].x, CheckPoints[cP2].y, CheckPoints[cP2].z, 8.0, 204, 204, 1, 100, 0)
                        blip = AddBlipForCoord(CheckPoints[cP].x, CheckPoints[cP].y, CheckPoints[cP].z)
                    else
                        PlaySoundFrontend(-1, "ScreenFlash", "WastedSounds")
                        DeleteCheckpoint(checkpoint)
                        RemoveBlip(blip)
                        IsRacing = false
                        cP = 1
                        cP2 = 2
                        TriggerEvent("chatMessage", "Server", {0,0,0}, string.format("Finished with a time of " .. formatTimer(startTime, GetGameTimer())))
                        preRace()
                    end
                    else
                end
            end
        end)
end)


--utility funcs

function tablelength(T)
    local count = 0
    for _ in pairs(T) do 
    count = count + 1 end
    return count
end

function formatTimer(startTime, currTime)
    local newString = currTime - startTime
        local ms = string.sub(newString, -3, -2)
        local sec = string.sub(newString, -5, -4)
        local min = string.sub(newString, -7, -6)
        --newString = string.sub(newString, -1)
        newString = string.format("%s%s.%s", min, sec, ms)
    return newString
end

function Draw3DText(x,y,z,textInput,fontId,scaleX,scaleY)
         local px,py,pz=table.unpack(GetGameplayCamCoords())
         local dist = GetDistanceBetweenCoords(px,py,pz, x,y,z, 1)
    
         local scale = (1/dist)*20
         local fov = (1/GetGameplayCamFov())*100
         local scale = scale*fov
    
         SetTextScale(scaleX*scale, scaleY*scale)
         SetTextFont(fontId)
         SetTextProportional(1)
         SetTextColour(255, 255, 255, 250)
         SetTextDropshadow(1, 1, 1, 1, 255)
         SetTextEdge(2, 0, 0, 0, 150)
         SetTextDropShadow()
         SetTextOutline()
         SetTextEntry("STRING")
         SetTextCentre(1)
         AddTextComponentString(textInput)
         SetDrawOrigin(x,y,z+2, 0)
         DrawText(0.0, 0.0)
         ClearDrawOrigin()
        end

function DrawHudText(text,colour,coordsx,coordsy,scalex,scaley) --courtesy of driftcounter
    SetTextFont(7)
    SetTextProportional(7)
    SetTextScale(scalex, scaley)
    local colourr,colourg,colourb,coloura = table.unpack(colour)
    SetTextColour(colourr,colourg,colourb, coloura)
    SetTextDropshadow(0, 0, 0, 0, coloura)
    SetTextEdge(1, 0, 0, 0, coloura)
    SetTextDropShadow()
    SetTextOutline()
    SetTextEntry("STRING")
    AddTextComponentString(text)
    DrawText(coordsx,coordsy)
end

--create blip
Citizen.CreateThread(function()
    for _, info in pairs(blips) do
        info.blip = AddBlipForCoord(info.x, info.y, info.z)
        SetBlipSprite(info.blip, info.id)
        SetBlipDisplay(info.blip, 4)
        SetBlipScale(info.blip, 1.0)
        SetBlipColour(info.blip, info.colour)
        SetBlipAsShortRange(info.blip, true)
        BeginTextCommandSetBlipName("STRING")
        AddTextComponentString(info.title)
        EndTextCommandSetBlipName(info.blip)
    end
end)

Any insight would be greatly appreciated!

Hi
Instead of

cP = math.ceil(cP+1)
cP2 = math.ceil(cP2+1)

I wrote

cP = cP + 1
if(CheckPoints[cP].type == 5) then
    cP2 = cP2+1
end

With this, the double “end checkpoint” isn’t necessary, and in your race example, you can (and should ?) remove the CheckPoints[15].

Also, to be able to race again, instead of

function preRace()
    while not IsRacing do
        Citizen.Wait(0)

I used

function preRace()
    while true do
        Citizen.Wait(0)
        if not Isracing then
3 Likes

Hi there Etuldan,

Is there any chance I could see a copy of your script that you’ve modified? I’m having a problem trying to implement your changes. I think I’m not closing all the loops properly but can’t figure out what I’m doing wrong.

Thanks!

for the 2nd modification, the function preRace(), as I add a new condition (the “if not racing then”), you have to add a “end” at the end of the function (so there will be 6 consecutive end instead of 5)

1 Like

So what I have highlighted freezes the player in their car for 3 seconds then unfreeze. You could try that?
If that’s what you were asking about.

2 Likes

can someone link a functional resourcefile for this? Have tried and doesnt seems to work… =(

Does anyone know how to convert the race time that’s printed to the chat, into minutes and seconds instead of just seconds?

i need somethign liek this for my touge race server but that will post the times ot an sql database and give the ability fopr people to check the times in game and on a website is there something that does this

Next time point out the original source of this script too :stuck_out_tongue:
Unless you are the one who made this video.
Original script can be found here:

Theres a link to his script too, but it doesnt work. I downloaded the same thing when the link was still working and its exactly the same (give or take a few lines) as shown here.
I also gave it a crack using the same script. What i got so far on the same base :
Timer
Time logs
Vehicle class based races
5x diffrent races so far
Money rewards
One race costs money
Leave the race area - race terminates
Kill your car - race terminates
Go back to the start to restart the race

Probably some little other details i forgot to mention. This is just to show you what potential this script has got.

Countdown is a good addition tho.
Would someone know how to make it detect other players around and sort of start the countdown for them both after actiavting the race? Like, if both are in the area, one presses E he’d then have to wait til the other player does the same, and then they both get the countdown.