Run it
Copy the script and paste it into your executor.
Players = :()
RS = :()
UIS = :()
LocalPlayer = Players.LocalPlayer
().HorseFarm ().HorseFarm.Stop
(().HorseFarm.Stop)
CFG = {
AutoQuest = ,
AutoRace = ,
GateDelay = ,
GateTimeout = ,
MaxRetries = ,
QuestRetry = ,
QuestTimeout = ,
BoardOffset = .(, , ),
}
(...) (, ...)
alive =
busy =
state = {
questActive = ,
questSince = ,
finishedAt = ,
lastClick = ,
completed = ,
questText = ,
raceText = ,
}
conns = {}
okReq, HS = (()
(RS:():())
)
okReq (HS) ~=
(, (HS))
Gates = HS.Race.Gates
Attr = HS.Race.Attributes
GateRemote = RS:():():(HS.Remote)
()
char = LocalPlayer.Character
char char:()
()
(LocalPlayer:(Attr.Gate)) ==
(LocalPlayer:(Attr.Gates)) ==
(LocalPlayer:(Attr.Place)) ==
()
f =
_, name (Gates.CoursePath)
f = f f:(name)
f
(folder, place)
folder (place) ~=
_, child (folder:())
child.Name == place child:() == place
child
_, d (RS:())
d:() d.Name ==
.(conns, d.OnClientEvent:((action, data)
action ==
state.questActive =
state.questSince = ()
()
action ==
state.questActive =
state.finishedAt = ()
(data) ==
state.completed = state.completed +
( .. state.completed .. )
))
()
state.lastClick = ()
board = :()
board = board board:()
board = board board:()
papers = board board:()
paper = papers papers:()
cd = paper paper:()
(paper cd)
state.questText =
root = ()
root
state.questText =
original = root.CFrame
state.questText =
root.CFrame = .(paper.Position + CFG.BoardOffset)
.()
ok, err = (, cd)
ok (, (err))
t = ()
alive state.questActive (() - t) <
.()
state.questActive
state.questText =
state.questText =
r = ()
r r.CFrame = original
.(()
alive
.()
CFG.AutoQuest
state.questActive (() - state.questSince) > CFG.QuestTimeout
state.questActive =
state.questText =
state.questActive () busy
(() - state.lastClick) >= CFG.QuestRetry
(() - state.finishedAt) >=
ok, err = (acceptQuest)
ok (, (err))
)
()
busy
busy =
place = LocalPlayer:(Attr.Place)
course = ((), place)
course
(, (place))
state.raceText =
busy =
(, (place))
retries, lastGate = ,
alive CFG.AutoRace ()
LocalPlayer:(Attr.Place) ~= place
gate = LocalPlayer:(Attr.Gate)
total = LocalPlayer:(Attr.Gates)
state.raceText = place .. .. gate .. .. total
gate == lastGate
retries = retries +
retries > CFG.MaxRetries
( .. gate .. .. CFG.MaxRetries .. )
state.raceText = .. gate
CFG.AutoRace =
retries, lastGate = , gate
marker = course:((gate))
root = ()
marker marker:() root
root.CFrame = marker.CFrame * .(, (Gates.Height ) / , )
(()
root.AssemblyLinearVelocity = .zero
root.AssemblyAngularVelocity = .zero
)
.()
(() GateRemote:(Gates.Remote, gate) )
t = ()
alive CFG.AutoRace LocalPlayer:(Attr.Gate) == gate
() (() - t) < CFG.GateTimeout
.()
(, (gate))
.()
.(CFG.GateDelay)
state.raceText:() == state.raceText =
()
busy =
.(()
alive
CFG.AutoRace () busy
ok, err = (runRace)
ok
busy =
(, (err))
.()
)
gui = .()
gui.Name =
gui.ResetOnSpawn =
(() gui.Parent = (gethui ()) :() )
frame = .()
frame.Size = .(, , , )
frame.Position = .(, , , )
frame.BackgroundColor3 = .(, , )
frame.BorderSizePixel =
frame.Parent = gui
title = .()
title.Size = .(, , , )
title.BackgroundColor3 = .(, , )
title.BorderSizePixel =
title.TextColor3 = .(, , )
title.Font = .Font.GothamBold
title.TextSize =
title.Text =
title.Parent = frame
(text, y)
b = .()
b.Size = .(, -, , )
b.Position = .(, , , y)
b.BorderSizePixel =
b.TextColor3 = .(, , )
b.Font = .Font.GothamBold
b.TextSize =
b.Text = text
b.Parent = frame
b
btnQuest = (, )
btnRace = (, )
statusLabel = .()
statusLabel.Size = .(, -, , )
statusLabel.Position = .(, , , )
statusLabel.BackgroundTransparency =
statusLabel.TextColor3 = .(, , )
statusLabel.Font = .Font.Gotham
statusLabel.TextSize =
statusLabel.TextXAlignment = .TextXAlignment.Left
statusLabel.TextYAlignment = .TextYAlignment.Top
statusLabel.TextWrapped =
statusLabel.Text =
statusLabel.Parent = frame
()
btnQuest.Text = .. (CFG.AutoQuest )
btnQuest.BackgroundColor3 = CFG.AutoQuest .(, , ) .(, , )
btnRace.Text = .. (CFG.AutoRace )
btnRace.BackgroundColor3 = CFG.AutoRace .(, , ) .(, , )
()
btnQuest.MouseButton1Click:(()
CFG.AutoQuest = CFG.AutoQuest
()
)
btnRace.MouseButton1Click:(()
CFG.AutoRace = CFG.AutoRace
CFG.AutoRace state.raceText:() state.raceText =
()
)
dragging, dragStart, startPos
.(conns, title.InputBegan:((input)
input.UserInputType == .UserInputType.MouseButton1
dragging, dragStart, startPos = , input.Position, frame.Position
))
.(conns, UIS.InputChanged:((input)
dragging input.UserInputType == .UserInputType.MouseMovement
d = input.Position - dragStart
frame.Position = .(startPos.X.Scale, startPos.X.Offset + d.X,
startPos.Y.Scale, startPos.Y.Offset + d.Y)
))
.(conns, UIS.InputEnded:((input)
input.UserInputType == .UserInputType.MouseButton1 dragging =
))
.(conns, UIS.InputBegan:((input, processed)
processed input.KeyCode == .KeyCode.F6
on = (CFG.AutoQuest CFG.AutoRace)
CFG.AutoQuest, CFG.AutoRace = on, on
()
))
.(()
alive
statusLabel.Text = .. state.questText
.. .. state.raceText
.. .. state.completed ..
.()
)
().HorseFarm = {
Stop = ()
alive =
CFG.AutoQuest, CFG.AutoRace = ,
_, c (conns) (() c:() )
gui:()
,
}
()completes the horse race quest for spook tokens so you can afk it overnight doesnt work for the desert location bc it finishes it too fast if u want add a buffer for when the desert quest is detected -vibecoded with claude code