local t=script.Parent local o=t.Configurations local n=require(script.RaycastModule)local P=0 for t,o in pairs(t:GetChildren())do if o:IsA("\066\097\115\101\080\097\114\116")then P=P+o:GetMass()*196.2 end end local b=Instance.new("\066\111\100\121\080\111\115\105\116\105\111\110",t.Chassis)b.MaxForce=Vector3.new()local d=Instance.new("\066\111\100\121\071\121\114\111",t.Chassis)d.MaxTorque=Vector3.new()local function M(P)local b,d=n.new(P.Position,P.CFrame:vectorToWorldSpace(Vector3.new(0,-1,0))*o.Height.Value)local M=(d-P.Position).magnitude local h=P:FindFirstChild("\087\104\101\101\108\087\101\108\100")h.C0=CFrame.new(0,-math.min(M,o.Height.Value*.8)+h.Part1.Size.Y/2,0)local I=t.Chassis.CFrame:inverse()*P.CFrame local E=t.Chassis.CFrame:vectorToObjectSpace(t.Chassis.Velocity)if I.Z<0 then local o=1 if E.Z>0 then o=-1 end h.C0=h.C0*CFrame.Angles(0,(t.Chassis.RotVelocity.Y/2)*o,0)end if b and P.Velocity.magnitude>=5 then h.Part1.ParticleEmitter.Enabled=true else h.Part1.ParticleEmitter.Enabled=false end end t.DriveSeat.Changed:connect(function(o)if o=="\079\099\099\117\112\097\110\116"then if t.DriveSeat.Occupant then local o=game.Players:GetPlayerFromCharacter(t.DriveSeat.Occupant.Parent)if o then t.DriveSeat:SetNetworkOwner(o)local n=script.LocalCarScript:Clone()n.Parent=o.PlayerGui n.Car.Value=t n.Disabled=false end else t.DriveSeat:SetNetworkOwnershipAuto()end end end)spawn(function()while true do(game:GetService("\082\117\110\083\101\114\118\105\099\101")).Stepped:wait()for t,o in pairs(t:GetChildren())do if o.Name=="\084\104\114\117\115\116\101\114"then M(o)end end if t.DriveSeat.Occupant then b.MaxForce=Vector3.new()d.MaxTorque=Vector3.new()else local M,h,I=n.new(t.Chassis.Position,t.Chassis.CFrame:vectorToWorldSpace(Vector3.new(0,-1,0))*o.Height.Value)if M and M.CanCollide then b.MaxForce=Vector3.new(P/5,math.huge,P/5)b.Position=(CFrame.new(h,h+I)*CFrame.new(0,0,-o.Height.Value+.5)).p d.MaxTorque=Vector3.new(math.huge,0,math.huge)d.CFrame=CFrame.new(h,h+I)*CFrame.Angles(-math.pi/2,0,0)else b.MaxForce=Vector3.new()d.MaxTorque=Vector3.new()end end end end)
--Scripted by DermonDarble

local car = script.Parent
local stats = car.Configurations
local Raycast = require(script.RaycastModule)

local mass = 0

for i, v in pairs(car:GetChildren()) do
	if v:IsA("BasePart") then
		mass = mass + (v:GetMass() * 196.2)
	end
end

local bodyPosition = Instance.new("BodyPosition", car.Chassis)
bodyPosition.MaxForce = Vector3.new()
local bodyGyro = Instance.new("BodyGyro", car.Chassis)
bodyGyro.MaxTorque = Vector3.new()

local function UpdateThruster(thruster)
	-- Raycasting
	local hit, position =
		Raycast.new(thruster.Position, thruster.CFrame:vectorToWorldSpace(Vector3.new(0, -1, 0)) * stats.Height.Value) --game.Workspace:FindPartOnRay(ray, car)
	local thrusterHeight = (position - thruster.Position).magnitude

	-- Wheel
	local wheelWeld = thruster:FindFirstChild("WheelWeld")
	wheelWeld.C0 = CFrame.new(0, -math.min(thrusterHeight, stats.Height.Value * 0.8) + (wheelWeld.Part1.Size.Y / 2), 0)
	-- Wheel turning
	local offset = car.Chassis.CFrame:inverse() * thruster.CFrame
	local speed = car.Chassis.CFrame:vectorToObjectSpace(car.Chassis.Velocity)
	if offset.Z < 0 then
		local direction = 1
		if speed.Z > 0 then
			direction = -1
		end
		wheelWeld.C0 = wheelWeld.C0 * CFrame.Angles(0, (car.Chassis.RotVelocity.Y / 2) * direction, 0)
	end

	-- Particles
	if hit and thruster.Velocity.magnitude >= 5 then
		wheelWeld.Part1.ParticleEmitter.Enabled = true
	else
		wheelWeld.Part1.ParticleEmitter.Enabled = false
	end
end

car.DriveSeat.Changed:connect(function(property)
	if property == "Occupant" then
		if car.DriveSeat.Occupant then
			local player = game.Players:GetPlayerFromCharacter(car.DriveSeat.Occupant.Parent)
			if player then
				car.DriveSeat:SetNetworkOwner(player)
				local localCarScript = script.LocalCarScript:Clone()
				localCarScript.Parent = player.PlayerGui
				localCarScript.Car.Value = car
				localCarScript.Disabled = false
			end
		else
			car.DriveSeat:SetNetworkOwnershipAuto()
		end
	end
end)

spawn(function()
	while true do
		game:GetService("RunService").Stepped:wait()
		for i, part in pairs(car:GetChildren()) do
			if part.Name == "Thruster" then
				UpdateThruster(part)
			end
		end
		if car.DriveSeat.Occupant then
			bodyPosition.MaxForce = Vector3.new()
			bodyGyro.MaxTorque = Vector3.new()
		else
			local hit, position, normal = Raycast.new(
				car.Chassis.Position,
				car.Chassis.CFrame:vectorToWorldSpace(Vector3.new(0, -1, 0)) * stats.Height.Value
			)
			if hit and hit.CanCollide then
				bodyPosition.MaxForce = Vector3.new(mass / 5, math.huge, mass / 5)
				bodyPosition.Position = (CFrame.new(position, position + normal) * CFrame.new(
					0,
					0,
					-stats.Height.Value + 0.5
				)).p
				bodyGyro.MaxTorque = Vector3.new(math.huge, 0, math.huge)
				bodyGyro.CFrame = CFrame.new(position, position + normal) * CFrame.Angles(-math.pi / 2, 0, 0)
			else
				bodyPosition.MaxForce = Vector3.new()
				bodyGyro.MaxTorque = Vector3.new()
			end
		end
	end
end)
