[RELEASE] Pringus Simple Race Script

mpspecialraces

#1

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)


Race or rally resource?
#2

moved it for you :wink:


#3

Very Nice Could come in handy!!!
Keep up


#4

Looks very good :grin:


#5

Where is download link ?


#6

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


#7

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


#8

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


#9

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


#10
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:


#11

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.


#12

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!


#13

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

#14

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!


#15

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)


#16

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.


#17

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


#18

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