Run it
Copy the script and paste it into your executor.
VEHICLES = {
{ name = , id = , spikes = , snatch = },
{ name = , id = , spikes = , snatch = },
{ name = , id = , spikes = , snatch = },
{ name = , id = , spikes = , snatch = },
{ name = , id = , spikes = , snatch = , drop = , ride = - },
{ name = , id = , spikes = , snatch = , drop = , yaw = , seat = .(-, -, -) },
}
MAX_SPEED =
REVERSE_SPEED =
ACCEL =
BRAKE =
DRAG =
TURN_RATE =
GRAVITY =
RIDE_OFFSET =
DEPLOY_DROP =
SPIKE_TRAVEL =
DEFAULT_SEAT = .(-, -, -)
ENGINE_ID =
ACCEL_ID =
DEPLOY_ID =
UNDEPLOY_ID =
SPIKE_DEPLOY_ID =
SNATCH = {
Enabled = ,
DefaultMph = ,
DeployedMul = ,
Hold = { , },
MaxHeight = ,
Lift = ,
Grip = ,
ThrowSpeed = ,
ThrowUp = ,
Cooldown = ,
MinFieldMph = ,
}
()
g = ()
f = g g.TornadoAPI
(f) ~=
ok, snap = (f)
ok snap
(snap, p)
h01 = .((p.Y - snap.pos.Y) / .(snap.height, ), , )
bx, bz = snap.(h01)
.(snap.pos.X + bx, snap.pos.Y, snap.pos.Z + bz)
(snap, p)
c = (snap, p)
d = .(.((p.X - c.X) ^ + (p.Z - c.Z) ^ ), )
Rc = .(snap.colR * , )
(d < Rc) snap.peak * (d / Rc) snap.peak * (Rc / d) ^
(snap, p)
c = (snap, p)
rx, rz = p.X - c.X, p.Z - c.Z
dist = .(.(rx * rx + rz * rz), )
rdx, rdz = rx / dist, rz / dist
core = .(snap.colR * , )
vt = (dist < core) (dist / core) (core / dist) ^
h01 = .((p.Y - c.Y) / .(snap.height, ), , )
upK = .( - dist / (core * ), , ) ^
peak = .(snap.peak, SNATCH.MinFieldMph)
v = .(-rdz, , rdx) * (vt * peak)
+ .(-rdx, , -rdz) * (vt * peak * )
+ .(, upK * peak * * ( - * h01), )
v, c, dist, core
Players = :()
RunService = :()
UIS = :()
lp = Players.LocalPlayer
g = ()
g.__Dominator1 (g.__Dominator1)
g.__DominatorGarage (g.__DominatorGarage)
conns, cleanupList = {}, {}
current, spawning = ,
()
current (current.destroy); current =
_, c (conns) (() c:() )
_, o (cleanupList) (() o:() )
(() lp.Character:(, ) )
().__DominatorGarage = cleanup
guiParent
(() guiParent = gethui () )
guiParent = guiParent lp:()
hud = .()
hud.Name =
hud.ResetOnSpawn =
hud.Enabled =
hud.Parent = guiParent
.(cleanupList, hud)
(parent, text, size, pos, color)
b = .()
b.Size = size
b.Position = pos
b.BackgroundColor3 = color
b.TextColor3 = .(, , )
b.Font = .Font.GothamBold
b.TextSize =
b.Text = text
b.Parent = parent
.(, b)
b
speedLabel = .()
speedLabel.Size = .(, , , )
speedLabel.Position = .(, -, , -)
speedLabel.BackgroundColor3 = .(, , )
speedLabel.BackgroundTransparency =
speedLabel.TextColor3 = .(, , )
speedLabel.Font = .Font.GothamBold
speedLabel.TextSize =
speedLabel.Text =
speedLabel.Parent = hud
.(, speedLabel)
windLabel = .()
windLabel.Size = .(, , , )
windLabel.Position = .(, -, , )
windLabel.BackgroundColor3 = .(, , )
windLabel.BackgroundTransparency =
windLabel.TextColor3 = .(, , )
windLabel.Font = .Font.GothamBold
windLabel.TextSize =
windLabel.Text =
windLabel.Visible =
windLabel.Parent = hud
.(, windLabel)
exitBtn = (hud, , .(, , , ), .(, -, , ), .(, , ))
deployBtn = (hud, , .(, , , ), .(, -, , ), .(, , ))
lightsBtn = (hud, , .(, , , ), .(, -, , ), .(, , ))
lightsBtn.TextSize =
.(conns, exitBtn.Activated:(() current current.() ))
.(conns, deployBtn.Activated:(() current current.() ))
.(conns, lightsBtn.Activated:(() current current.() ))
.(conns, UIS.JumpRequest:(()
current current.() current.()
))
.(conns, UIS.InputBegan:((input, gp)
gp current
input.KeyCode == .KeyCode.F current.()
input.KeyCode == .KeyCode.L current.()
))
controls
(()
controls = (lp.PlayerScripts:(, )):()
)
()
mv = .zero
controls
o, v = (() controls:() )
o v mv = v
mv.Magnitude <
x, z = ,
UIS:(.KeyCode.W) z -=
UIS:(.KeyCode.S) z +=
UIS:(.KeyCode.D) x +=
UIS:(.KeyCode.A) x -=
mv = .(x, , z)
-mv.Z, mv.X
(def)
char = lp.Character
hrp = char char:()
hrp ()
result = :( .. def.id)
model = result result[]
model ( .. def.name)
model:()
wrap = .()
model.Parent = wrap
model = wrap
model.Name = def.name
model.PrimaryPart =
yaw = def.yaw
seatOffset = def.seat DEFAULT_SEAT
vconns = {}
spikeSet, spikes = {}, {}
(d)
x = d
x x ~= model
n = x.Name:()
n:() n:() n:()
x = x.Parent
_, d (model:())
d:()
d:()
d:()
d.Anchored =
d.Massless =
(d.Name) d.Name = .. d.Name
def.spikes (d) spikeSet[d] =
d:() d:()
d.Disabled =
names = {}
_, c (model:()) .(names, c.Name)
spikeCount =
_ (spikeSet) spikeCount +=
(def.name .. .. .(names, ) .. .. spikeCount)
(frame)
mn = .(.huge, .huge, .huge)
mx = .(-.huge, -.huge, -.huge)
n =
_, d (model:())
d:() d.Transparency < spikeSet[d]
s = d.Size /
ix = -, ,
iy = -, ,
iz = -, ,
pt = frame:((d.CFrame * .(s.X * ix, s.Y * iy, s.Z * iz)).Position)
mn = .(.(mn.X, pt.X), .(mn.Y, pt.Y), .(mn.Z, pt.Z))
mx = .(.(mx.X, pt.X), .(mx.Y, pt.Y), .(mx.Z, pt.Z))
n +=
mn, mx, n
ref = model:()
mn, mx, n = (ref)
n ==
spikeSet = {}
mn, mx, n = (ref)
n ==
bcf, bsz = model:()
c = ref:(bcf.Position)
mn, mx = c - bsz / , c + bsz /
bbSize = mx - mn
model.WorldPivot = ref * .((mn + mx) / )
halfH = bbSize.Y /
swap = .(yaw) % ==
width = swap bbSize.Z bbSize.X
length = swap bbSize.X bbSize.Z
pivot0 = model:()
part (spikeSet)
.(spikes, { part = part, rel = pivot0:(part.CFrame) })
rayParams = RaycastParams.()
rayParams.FilterType = .RaycastFilterType.Exclude
()
rayParams.FilterDescendantsInstances = { model, lp.Character }
()
spawnPos = hrp.Position + hrp.CFrame.LookVector * (length / + )
hit = :(spawnPos + .(, , ), .(, -, ), rayParams)
pos = (hit hit.Position spawnPos) + .(, halfH, )
look0 = hrp.CFrame.LookVector
heading = .(-look0.X, -look0.Z)
up = .yAxis
speed, vy = ,
driving, deployed, deployAlpha = , ,
mode =
vel, angVel, airRot = .zero, .zero,
snatchT, snatchDur, snatchCooldown, spinDir = , , ,
snatchMph = def.snatch SNATCH.DefaultMph
deployDrop = def.drop DEPLOY_DROP
()
airRot .(pos) * airRot
fwd = .(, heading, ).LookVector
look = (fwd - up * fwd:(up)).Unit
right = look:(up).Unit
.(pos, right, up, -look)
promptPart = .()
promptPart.Size = .(, , )
promptPart.Transparency =
promptPart.CanCollide =
promptPart.CanQuery =
promptPart.Anchored =
promptPart.Parent = model
lights, lightsOn = {},
_, sx ({ -, })
p = .()
p.Size = .(, , )
p.Material = .Material.Neon
p.Color = .(, , )
p.Anchored =
p.CanCollide =
p.CanQuery =
p.CanTouch =
p.Parent = model
sl = .()
sl.Face = .NormalId.Front
sl.Range =
sl.Angle =
sl.Brightness =
sl.Color = .(, , )
sl.Enabled =
sl.Parent = p
.(lights, { part = p, light = sl, x = sx * width * })
(on)
lightsOn = on
_, l (lights)
l.light.Enabled = on
l.part.Color = on .(, , ) .(, , )
lightsBtn.Text = on
lightsBtn.BackgroundColor3 = on .(, , ) .(, , )
engineSound = .()
engineSound.SoundId = .. ENGINE_ID
engineSound.Looped =
engineSound.Volume =
engineSound.RollOffMaxDistance =
engineSound.Parent = promptPart
accelSound = .()
accelSound.SoundId = .. ACCEL_ID
accelSound.Volume =
accelSound.RollOffMaxDistance =
accelSound.Parent = promptPart
(id, vol)
snd = .()
snd.SoundId = .. id
snd.Volume = vol
snd.RollOffMaxDistance =
snd.Parent = promptPart
snd
deploySound = (DEPLOY_ID, )
undeploySound = (UNDEPLOY_ID, )
spikeDeploySound = (SPIKE_DEPLOY_ID, )
engineOn, wasPressing, lastAccel = , ,
()
cf = ()
e = deployAlpha * deployAlpha * ( - * deployAlpha)
P = cf * .(, -deployDrop * e, ) * .(, .(yaw), )
model:(P)
_, sp (spikes)
sp.part.CFrame = P * sp.rel - cf.UpVector * (SPIKE_TRAVEL * e)
promptPart.CFrame = cf
lcf = cf * .(, -deployDrop * e, )
_, l (lights)
l.part.CFrame = lcf * .(l.x, -halfH * , -length / - )
cf
cf0 = ()
cmn, _, cn = (cf0)
cn >
halfH = -cmn.Y
pos = (hit hit.Position spawnPos) + .(, halfH, )
()
(.(, def.name, bbSize.X, bbSize.Y, bbSize.Z, halfH))
prompt = .()
prompt.ActionText =
prompt.ObjectText = def.name
prompt.HoldDuration =
prompt.RequiresLineOfSight =
prompt.MaxActivationDistance = .(length, width) / +
prompt.KeyboardKeyCode = .KeyCode.E
prompt.Parent = promptPart
model.Parent =
()
driving
char = lp.Character
hum = char char:()
hrp = char char:()
hum hrp
driving =
char:(, )
()
_, p (char:())
p:() p.CanCollide =
hum.Sit =
hrp.Anchored =
prompt.Enabled =
deployBtn.Text = deployed
(lightsOn)
hud.Enabled =
()
driving mode ~=
driving =
char char:(, )
speed =
hum = char char:()
hrp hrp.Parent
hrp.Anchored =
hrp.CFrame = () * .(-(width / + ), , seatOffset.Z)
hum hum.Sit =
char
_, p (char:())
p:() p.Name ~= p.CanCollide =
prompt.Enabled =
hud.Enabled =
()
driving mode ~=
deployed .(speed) >
deployBtn.Text =
.(, ()
deployBtn.Text = deployed
)
deployed = deployed
deployBtn.Text = deployed
deployed
(def.spikes spikeDeploySound deploySound):()
undeploySound:()
.(vconns, prompt.Triggered:((plr)
plr == lp ()
))
.(vconns, lp.CharacterAdded:(()
driving =
prompt.Enabled =
hud.Enabled =
))
()
cf = ()
mode =
snatchT =
snatchDur = SNATCH.Hold[] + .() * (SNATCH.Hold[] - SNATCH.Hold[])
vel = cf.LookVector * speed
airRot = cf.Rotation
angVel = .(.() - , .() - , .() - ) *
spinDir = (.() < ) -
speed, vy = ,
deployed =
deployBtn.Text =
(g)
fwd = airRot.LookVector
flat = .(fwd.X, , fwd.Z)
flat.Magnitude < flat = .(, , -)
flat = flat.Unit
heading = .(-flat.X, -flat.Z)
airRot =
up = .yAxis
pos = g.Position + .(, halfH, )
vel, speed, vy = .zero, ,
mode =
snatchCooldown = .() + SNATCH.Cooldown
(dt, snap)
deployAlpha = .(deployAlpha - dt / , )
mode ==
snatchT += dt
snap snap.contact <
mode =
field, c = (snap, pos)
h = pos.Y - snap.pos.Y
lift = (h < snap.height * SNATCH.MaxHeight) SNATCH.Lift
vel += ((field + .(, lift, )) - vel) * .(, SNATCH.Grip * dt)
t = snatchT
target = .(.(t * + spinDir) * , * spinDir, .(t * ) * )
angVel = angVel:(target, .(, * dt))
snatchT >= snatchDur
rx, rz = pos.X - c.X, pos.Z - c.Z
d = .(.(rx * rx + rz * rz), )
rad = .(rx / d, , rz / d)
tan = .(-rad.Z, , rad.X)
vel = rad * SNATCH.ThrowSpeed + tan * (SNATCH.ThrowSpeed * ) + .(, SNATCH.ThrowUp, )
mode =
vel += .(, -GRAVITY, ) * dt
pos += vel * dt
w = angVel.Magnitude
w >
airRot = .(angVel.Unit, w * dt) * airRot
mode == vel.Y <=
reach = halfH + + (-vel.Y) * dt
g = :(pos + .(, , ), .(, -reach, ), rayParams)
g (g)
.(vconns, RunService.Heartbeat:((dt)
dt = .(dt, )
snap = SNATCH.Enabled ()
need = snatchMph * (deployed SNATCH.DeployedMul )
snap snap.contact >
mph = (snap, pos)
driving
windLabel.Visible =
windLabel.Text = .(, .(mph), .(need))
windLabel.TextColor3 = (mph >= need * ) .(, , ) .(, , )
mode == snap.contact > .() >= snatchCooldown mph >= need
()
driving
windLabel.Visible =
mode ~=
(dt, snap)
final = ()
driving hrp hrp.Parent
hrp.CFrame = final * .(seatOffset)
engineOn
engineSound.PlaybackSpeed =
engineSound.Volume =
driving
speedLabel.Text = .(, .(vel.Magnitude * ))
deployAlpha = .(deployAlpha + (deployed -) * dt / , , )
deployed speed =
throttle, steer = ,
driving deployed throttle, steer = ()
throttle >
speed < speed += BRAKE * dt speed += ACCEL * throttle * dt
speed = .(speed, MAX_SPEED * throttle)
throttle < -
speed > speed -= BRAKE * dt speed += ACCEL * throttle * dt
speed = .(speed, -REVERSE_SPEED)
d = DRAG * dt
.(speed) <= d speed = speed -= .(speed) * d
pressing = throttle >
pressing wasPressing driving .() - lastAccel >
lastAccel = .()
accelSound:()
wasPressing = pressing
driving engineOn
engineOn =
engineSound:()
driving engineOn
engineOn =
engineSound:()
engineOn
engineSound.PlaybackSpeed = + .(.(speed) / MAX_SPEED, , ) *
engineSound.Volume = pressing
sf = .(speed / , -, )
heading -= steer * TURN_RATE * sf * dt
cf = ()
fwd = cf.LookVector
flat = .(fwd.X, , fwd.Z)
flat = flat.Magnitude > flat.Unit fwd
dist = speed * dt
.(dist) >
dir = flat * .(dist)
boxCF = cf * .(, halfH * , )
bs = .(.(width * , ), .(bbSize.Y * , ), length * )
ok2, res = (()
:(boxCF, bs, dir * (.(dist) + ), rayParams)
)
ok2 res res.Normal.Y <
speed = -speed *
pos += flat * dist
g = :(pos + up * (halfH + ), -up * (halfH + ), rayParams)
g
up = up:(g.Normal, .(, * dt)).Unit
targetPos = g.Position + up * (halfH + RIDE_OFFSET + (def.ride ))
pos.Y - targetPos.Y >
vy -= GRAVITY * dt
pos += .(, vy * dt, )
pos.Y < targetPos.Y pos = .(pos.X, targetPos.Y, pos.Z); vy =
vy =
pos = pos:(targetPos, .(, * dt))
up = up:(.yAxis, .(, * dt)).Unit
vy -= GRAVITY * dt
pos += .(, vy * dt, )
final = ()
driving
hrp hrp.Parent
e = deployAlpha * deployAlpha * ( - * deployAlpha)
hrp.CFrame = final * .(seatOffset - .(, deployDrop * e, ))
speedLabel.Text = .(, .(.(speed) * ))
))
current = {
isDriving = () driving ,
exit = exit,
toggleDeploy = toggleDeploy,
toggleLights = ()
driving ( lightsOn)
,
destroy = ()
driving
mode =
()
_, c (vconns) (() c:() )
model:()
hud.Enabled =
,
}
(def, statusBtn)
spawning
spawning =
current current.(); current =
old = statusBtn statusBtn.Text
statusBtn statusBtn.Text =
ok, err = (buildVehicle, def)
ok
( .. (err))
statusBtn statusBtn.Text = ; .()
statusBtn statusBtn.Text = old
spawning =
menu = .()
menu.Name =
menu.ResetOnSpawn =
menu.Parent = guiParent
.(cleanupList, menu)
toggle = (menu, , .(, , , ), .(, , , ), .(, , ))
panel = .()
panel.Size = .(, , , )
panel.Position = .(, , , )
panel.BackgroundColor3 = .(, , )
panel.BackgroundTransparency =
panel.Visible =
panel.Parent = menu
.(, panel)
index =
leftBtn = (panel, , .(, , , ), .(, , , ), .(, , ))
rightBtn = (panel, , .(, , , ), .(, -, , ), .(, , ))
leftBtn.TextSize =
rightBtn.TextSize =
nameLabel = .()
nameLabel.Size = .(, -, , )
nameLabel.Position = .(, , , )
nameLabel.BackgroundColor3 = .(, , )
nameLabel.TextColor3 = .(, , )
nameLabel.Font = .Font.GothamBold
nameLabel.TextSize =
nameLabel.TextScaled =
nameLabel.TextWrapped =
nameLabel.Parent = panel
.(, nameLabel)
countLabel = .()
countLabel.Size = .(, , , )
countLabel.Position = .(, , , )
countLabel.BackgroundTransparency =
countLabel.TextColor3 = .(, , )
countLabel.Font = .Font.Gotham
countLabel.TextSize =
countLabel.Parent = panel
okBtn = (panel, , .(, -, , ), .(, , , ), .(, , ))
removeBtn = (panel, , .(, -, , ), .(, , , ), .(, , ))
removeBtn.TextSize =
()
nameLabel.Text = VEHICLES[index].name
countLabel.Text = index .. .. #VEHICLES
()
.(conns, leftBtn.Activated:(()
index = (index - ) % #VEHICLES +
()
))
.(conns, rightBtn.Activated:(()
index = index % #VEHICLES +
()
))
.(conns, okBtn.Activated:(()
(VEHICLES[index], okBtn)
))
.(conns, removeBtn.Activated:(()
current current.(); current =
))
.(conns, toggle.Activated:(() panel.Visible = panel.Visible ))
()You can spawn interceptors with this

Universal