local path = nil
coroutine.wrap(function() path = require(script.PathCreator) end)()
-- Handle remote functions/events
function runStarting(player)
if player.Character then
if player.Character:FindFirstChild("FastStartScript") then
player.Character.FastStartScript.Disabled = false
end
end
end
game.ReplicatedStorage.RemoteEvents.RunStarting.OnServerEvent:connect(runStarting)
local behaviourModules = {}
coroutine.wrap(function()
for _, behaviourScript in ipairs(script.Behaviours:GetChildren()) do
local success, errMessage = pcall(function()
behaviourModules[behaviourScript.Name] = require(behaviourScript)
end)
if not success then
warn("Failed to load module" ..behaviourScript.Name.. ".\n" ..errMessage)
end
end
end)()
function executeBehaviour(player, character, brickTouched, behaviourName)
if behaviourModules[behaviourName] ~= nil then
behaviourModules[behaviourName]:ExecuteBehaviour(brickTouched, character)
end
end
game.ReplicatedStorage.RemoteEvents.ExecuteBehaviour.OnServerEvent:connect(executeBehaviour)
-- Initialization
local lastActivePath = {}
if game.Workspace:FindFirstChild("BasePlate") then
game.Workspace.BasePlate:Destroy()
end
local tracksModel = Instance.new("Model")
tracksModel.Name = "Tracks"
tracksModel.Parent = game.Workspace
function packagePathModels()
local pathPackager = require(script.PathPackager)
while true do
local pathBase = game.Workspace:FindFirstChild("PathBase", true)
if pathBase then
pathPackager:PackageRoom(pathBase)
else
break
end
end
end
--This line
coroutine.wrap(function() packagePathModels() end)()
-- Leaderboard
function loadLeaderstats(player)
local stats = Instance.new("IntValue")
stats.Name = "leaderstats"
local highScore = Instance.new("IntValue")
highScore.Name = "High Score"
highScore.Parent = stats
highScore.Value = 0
local currentScore = Instance.new("IntValue")
currentScore.Name = "Score"
currentScore.Parent = stats
stats.Parent = player
end
function initialiseRunStats(player)
if player:FindFirstChild("RunStats") then
player.RunStats.Distance.Value = 0
player.RunStats.CoinsCollected.Value = 0
end
end
function showResults(player)
local resultsGUI = game.ServerStorage.GUIs.PostRunGUI:Clone()
resultsGUI.Frame.DistanceValue.Text = player.RunStats.Distance.Value
resultsGUI.Frame.CoinsValue.Text = player.RunStats.CoinsCollected.Value
resultsGUI.Frame.ScoreValue.Text = player.leaderstats.Score.Value
resultsGUI.Parent = player.PlayerGui
return resultsGUI
end
function initialiseNewRun(player, delayTime, charExpected, showLastResults)
if not path then
while not path do
wait()
end
end
local lastResultsGUI = nil
if showLastResults then
lastResultsGUI = showResults(player)
end
if delayTime ~= 0 then
wait(delayTime)
end
if lastResultsGUI ~= nil then
lastResultsGUI:Destroy()
end
if player and player.Parent then
-- charExpected is needed to avoid calling LoadCharacter on players leaving the game
if player.Character or charExpected == false then
player:LoadCharacter()
initialiseRunStats(player)
local playersPath = path()
lastActivePath[player.Name] = playersPath
playersPath:init(player.Name)
end
end
end
function setUpPostRunStats(player)
local folder = Instance.new("Folder")
folder.Name = "RunStats"
folder.Parent = player
local currentDistance = Instance.new("IntValue")
currentDistance.Name = "Distance"
currentDistance.Value = 0
currentDistance.Parent = folder
local coinsCollected = Instance.new("IntValue")
coinsCollected.Name = "CoinsCollected"
coinsCollected.Value = 0
coinsCollected.Parent = folder
end
function onPlayerEntered(player)
player.CharacterAdded:connect(function(character)
local humanoid = character:WaitForChild("Humanoid")
if humanoid then
humanoid.Died:connect(function()
initialiseNewRun(player, 4, true, true)
end)
end
end)
-- Initial loading
loadLeaderstats(player)
setUpPostRunStats(player)
-- Start game
initialiseNewRun(player, 0, false, false)
end
game.Players.PlayerAdded:connect(onPlayerEntered)
function onPlayerRemoving(player)
local track = game.Workspace.Tracks:FindFirstChild(player.Name)
if track ~= nil then
track:Destroy()
end
end
game.Players.PlayerRemoving:connect(onPlayerRemoving)
for _, player in pairs(game.Players:GetChildren()) do
onPlayerEntered(player)
end
One thing, when you say “if player.Character” are you check if the player exists once, or are waiting for it? because if you’re waiting for it, there’s a chance it won’t exist, and that script won’t be executed in the runStarting() function.
It looks like the error is happening the function, but it’s actually probably occurring in the script.PathPackages folder. look in there for any references of ".End.
Also, the script is kind of entirely stupid, because they’re doing everything in a coroutine, so some thread may have not finished yet, but another thread is trying to reference something supposed to be already created in the other.
There is alot going on in that file. It’s hard to read. I suggest you make your own line runner if that’s what you’re trying to do, because most likely this one is outdated, and it’s just a template anyways.
FOR ANYONE ENCOUNTERING THIS ISSUE CONFUSED I FOUND A SOLUTION:
go to ServerScriptService → PathPackager and open it up at line 174 - 185 this code will show
for i = 1, #regions do
--Repeatedly finds 200 parts in the region until none are left
while true do
local parts = game.Workspace:FindPartsInRegion3(regions[i], nil, 200)
if #parts == 0 then
break
end
for _, part in pairs(parts) do
processPart(roomModel, part, parts)
end
end
end
if your maps have more than 200 parts than this is why its not working its because the script caps the number of parts it searches to 200 change this number to like 2000 and it should be working
learned this the hard way. if you want to actually make a successful line runner i wouldnt use this template but if you want the fix there it is