I have made a Go karting racing system fully functioning but i only made it to notice who comes first and i do not know how i will do it for who ever comes other places.
if you can also explain how i can make a folder that has players names with what position they are in i will be very happy.
Sorry if i did not explain well.
local RaceModule = {}
local Checkpoint = require(script.Checkpoint)
local Racer = require(script.Racer)
local GameSettings = game.Workspace.Game.GameSettings
-- Local variable defaults
local startCheckpoint = nil
local finishCheckpoint = nil
local autoStart = false
local debugEnabled = true
local numLaps = 1
local raceDuration = GameSettings.RaceDuration.Value
local intermissionDuration = GameSettings.IntermissionDuration.Value
-- Other local variables
local numCheckpoints = 0
local checkpoints = {}
local racers = {}
local FirstPlace = nil
local SecondPlace = nil
local ThirdPlace = nil
local RacersNeeded = 3 ---WIP
-- Private functions
local function getCheckpointFromPart(part)
for _, checkpoint in pairs(checkpoints) do
if checkpoint.CollisionBody == part then
return checkpoint
end
end
return nil
end
local function hasPlayerFinishedLap(player, lap)
for _, checkpoint in pairs(checkpoints) do
if checkpoint:PlayerLapPassed(player, lap) ~= lap then
return false
end
end
return true
end
local function addRacer(player)
racers[player] = Racer.new()
end
local function checkAllFinished()
for _, racer in pairs(racers) do
if not racer:HasFinishedLap(numLaps) then
return false
end
end
return true
end
-- Getters/Setters
function RaceModule:SetStartCheckpoint(checkpoint)
startCheckpoint = getCheckpointFromPart(checkpoint)
end
function RaceModule:GetStartCheckpoint()
return startCheckpoint
end
function RaceModule:SetFinishCheckpoint(checkpoint)
finishCheckpoint = getCheckpointFromPart(checkpoint)
end
function RaceModule:GetFinishCheckpoint()
return finishCheckpoint
end
function RaceModule:SetNumLaps(number)
numLaps = number
end
function RaceModule:GetNumLaps()
return numLaps
end
function RaceModule:SetAutoStart(autostart)
autoStart = autostart
end
function RaceModule:GetAutoStart()
return autoStart
end
function RaceModule:SetRaceDuration(duration)
raceDuration = duration
end
function RaceModule:GetRaceDuration()
return raceDuration
end
function RaceModule:SetIntermissionDuration(duration)
intermissionDuration = duration
end
function RaceModule:GetIntermissionDuration()
return intermissionDuration
end
function RaceModule:SetDebugEnabled(enabled)
debugEnabled = enabled
end
function RaceModule:GetDebugEnabled()
return debugEnabled
end
-- Events
local onRaceStartedEvent = Instance.new("BindableEvent")
RaceModule.RaceStarted = onRaceStartedEvent.Event
local onRaceFinishedEvent = Instance.new("BindableEvent")
RaceModule.RaceFinished = onRaceFinishedEvent.Event
local onLapStartedEvent = Instance.new("BindableEvent")
RaceModule.LapStarted = onLapStartedEvent.Event
local onLapFinishedEvent = Instance.new("BindableEvent")
RaceModule.LapFinished = onLapFinishedEvent.Event
local onIntermissionStartedEvent = Instance.new("BindableEvent")
RaceModule.IntermissionStarted = onIntermissionStartedEvent.Event
local onCheckpointPassedEvent = Instance.new("BindableEvent")
RaceModule.CheckpointPassed = onCheckpointPassedEvent.Event
-- Public functions
function RaceModule:SetRacers(racerList)
for i = 1, #racerList do
addRacer(racerList[i])
end
end
function RaceModule:RegisterCheckpoint(checkpoint)
if not checkpoints[checkpoint] then
local newCheckpoint = Checkpoint.new(checkpoint, RaceModule)
numCheckpoints = numCheckpoints + 1
checkpoints[checkpoint] = newCheckpoint
end
end
function RaceModule:PlayerCrossedCheckpoint(player, checkpoint)
local racer = racers[player]
if not racer or racer.FinishedRace then return
end
local currentLap = racer.CurrentLap
if checkpoint == startCheckpoint and not racer:HasStartedLap(currentLap) then
racer:StartLap(currentLap)
onLapStartedEvent:Fire(player, currentLap)
end
if racer:HasStartedLap(currentLap) then
local alreadyPassed = checkpoint:SetPlayerPassed(player, currentLap)
if not alreadyPassed then
onCheckpointPassedEvent:Fire(checkpoint.CollisionBody)
end
end
if checkpoint == finishCheckpoint and hasPlayerFinishedLap(player, currentLap) then
local lapTime = racer:FinishLap(currentLap)
onLapFinishedEvent:Fire(player, currentLap, lapTime)
if currentLap == numLaps then
if not FirstPlace then
FirstPlace = player
end
racer.FinishedRace = true
if checkAllFinished() then
onRaceFinishedEvent:Fire(FirstPlace)
end
else
racer.CurrentLap = racer.CurrentLap + 1
end
end
end
function RaceModule:Start()
if debugEnabled then print("RACEMODULE: Starting race")
FirstPlace = nil
SecondPlace = nil
ThirdPlace = nil
assert(numCheckpoints > 0, "No checkpoints registered")
assert(startCheckpoint, "Start Checkpoint not set")
assert(finishCheckpoint, "Finish Checkpoint not set")
if debugEnabled then
print("RACEMODULE: Checking if players set")
end
if #racers == 0 then
RaceModule:SetRacers(game.Players:GetPlayers())
end
for _, checkpoint in pairs(checkpoints) do
checkpoint:Reset()
end
onRaceStartedEvent:Fire()
local raceOver = false
local finishedConnection
finishedConnection = RaceModule.RaceFinished:connect(function()
raceOver = true
racers = {}
finishedConnection:disconnect()
end)
spawn(function()
wait(raceDuration)
if not raceOver then
onRaceFinishedEvent:Fire(FirstPlace)
end
end)
end
end
-- Autostart code
spawn(function()
wait(5)
repeat
onIntermissionStartedEvent:Fire()
wait(intermissionDuration)
RaceModule:Start()
RaceModule.RaceFinished:wait()
until autoStart == false
end)
return RaceModule
Thanks For reading it, Comment if you know how i should go about doing this

4 comments
Is it possible for you to include only code that might be relevant? 261 lines is hard to read through plus with how you have your functions organized.
Did you make this script?
Also something I was wondering.
I used the race script module and changed the script