script.Parent:WaitForChild("\067\097\114")script.Parent:WaitForChild("\073\115\079\110")script.Parent:WaitForChild("\067\111\110\116\114\111\108\115\079\112\101\110")script.Parent:WaitForChild("\086\097\108\117\101\115")local u=game.Players.LocalPlayer local Y=u:GetMouse()local M=game:GetService("\085\115\101\114\073\110\112\117\116\083\101\114\118\105\099\101")local G=script.Parent.Car.Value local r=require(G["\065-\067\104\097\115\115\105\115 \084\117\110\101"])local x=r.WeightScaling*10 local j=r.BrakeForce*r.BrakeBias local k=r.BrakeForce*(1-r.BrakeBias)local y=r.PBrakeForce local o=r.EBrakeForce local f=r.SteerOuter local N=r.SteerInner local A=r.RSteerOuter local P=r.RSteerInner if not workspace:PGSIsEnabled()then error("\080\071\083 \105\115 \110\111\116 \101\110\097\098\108\101\100\058 \065-\067\104\097\115\115\105\115 \119\105\108\108 \110\111\116 \119\111\114\107\046")end local T=r.AutoStart if r.AutoStart and(r.Engine or r.Electric)then script.Parent.IsOn.Value=true end local J=0 local W=0 local p=0 local n=0 local D=r.IdleThrottle/100 local C=0 local Z=0 local w=0 local I=false local X=false local U=0 local S=0 local L=0 local e=0 local a=0 local B=0 local R=0 local Q=R local l=false local z=false local H=false local V=0 local d=0 local h=0 local v=0 local E=0 local K=0 local m=0 local O=0 local s=0 local q=0 local b=0 local i=0 local F=0 local t=0 local c=0 local g=0 local u2=0 local Y2=0 local M2=r.TransModes[1]local G2=false local r2=false local x2=false local j2=false local k2=r.TCSEnabled local y2=false local o2=0 local f2=r.ABSEnabled local N2=false local A2=tick()local P2=false local T2=false G.DriveSeat.ChildRemoved:connect(function(u)if u.Name=="\083\101\097\116\087\101\108\100"and u:IsA("\087\101\108\100")then script.Parent:Destroy()end end)local J2=r.Controls local W2=Instance.new("\070\111\108\100\101\114",script.Parent)W2.Name="\067\111\110\116\114\111\108\115"for u,Y in pairs(J2)do local M=Instance.new("\083\116\114\105\110\103\086\097\108\117\101",W2)M.Name=u M.Value=Y.Name M.Changed:connect(function()if u=="\077\111\117\115\101\084\104\114\111\116\116\108\101"or u=="\077\111\117\115\101\066\114\097\107\101"then if M.Value=="\077\111\117\115\101\066\117\116\116\111\110\049"or M.Value=="\077\111\117\115\101\066\117\116\116\111\110\050"then J2[u]=Enum.UserInputType[M.Value]else J2[u]=Enum.KeyCode[M.Value]end else J2[u]=Enum.KeyCode[M.Value]end end)end local p2=r.Peripherals for u,Y in pairs(p2)do local M=Instance.new("\073\110\116\086\097\108\117\101",W2)M.Name=u M.Value=Y M.Changed:connect(function()M.Value=math.min(100,math.max(0,M.Value))p2[u]=M.Value end)end function DealWithInput(u,Y)if M:GetFocusedTextBox()==nil and not T2 then if(u.KeyCode==J2.ContlrShiftDown or G2 and u.KeyCode==J2.MouseShiftDown or not G2 and u.KeyCode==J2.ShiftDown)and((T and((M2=="\065\117\116\111"and R<=1)and r.AutoShiftVers=="\078\101\119")or M2=="\083\101\109\105"or M2=="\077\097\110\117\097\108")and u.UserInputState==Enum.UserInputState.Begin)then if not z then z=true end elseif(u.KeyCode==J2.ContlrShiftUp or G2 and u.KeyCode==J2.MouseShiftUp or not G2 and u.KeyCode==J2.ShiftUp)and((T and((M2=="\065\117\116\111"and R<1)and r.AutoShiftVers=="\078\101\119")or M2=="\083\101\109\105"or M2=="\077\097\110\117\097\108")and u.UserInputState==Enum.UserInputState.Begin)then if not l then l=true end elseif(u.KeyCode==J2.ContlrClutch or G2 and u.KeyCode==J2.MouseClutch or not G2 and u.KeyCode==J2.Clutch)and M2=="\077\097\110\117\097\108"then if u.UserInputState==Enum.UserInputState.Begin then I=true X=true elseif u.UserInputState==Enum.UserInputState.End then I=false X=false end elseif u.KeyCode==J2.ContlrPBrake or G2 and u.KeyCode==J2.MousePBrake or not G2 and u.KeyCode==J2.PBrake then if u.UserInputState==Enum.UserInputState.Begin then j2=not j2 elseif u.UserInputState==Enum.UserInputState.End then if G.DriveSeat.Velocity.Magnitude>5 then j2=false end end elseif(u.KeyCode==J2.ContlrToggleTMode or u.KeyCode==J2.ToggleTransMode)and u.UserInputState==Enum.UserInputState.Begin then local u=1 for Y,M in pairs(r.TransModes)do if M==M2 then u=Y break end end u=u+1 if u>#r.TransModes then u=1 end M2=r.TransModes[u]elseif not G2 and(u.KeyCode==J2.Throttle or u.KeyCode==J2.Throttle2)or((J2.MouseThrottle==Enum.UserInputType.MouseButton1 or J2.MouseThrottle==Enum.UserInputType.MouseButton2)and u.UserInputType==J2.MouseThrottle or u.KeyCode==J2.MouseThrottle)and G2 then if u.UserInputState==Enum.UserInputState.Begin and T then D=1 else D=r.IdleThrottle/100 end elseif not G2 and(u.KeyCode==J2.Brake or u.KeyCode==J2.Brake2)or((J2.MouseBrake==Enum.UserInputType.MouseButton1 or J2.MouseBrake==Enum.UserInputType.MouseButton2)and u.UserInputType==J2.MouseBrake or u.KeyCode==J2.MouseBrake)and G2 then if u.UserInputState==Enum.UserInputState.Begin then w=1 else w=0 end elseif not G2 and(u.KeyCode==J2.SteerLeft or u.KeyCode==J2.SteerLeft2)then if u.UserInputState==Enum.UserInputState.Begin then J=-1 r2=true else if x2 then J=1 else J=0 end r2=false end elseif not G2 and(u.KeyCode==J2.SteerRight or u.KeyCode==J2.SteerRight2)then if u.UserInputState==Enum.UserInputState.Begin then J=1 x2=true else if r2 then J=-1 else J=0 end x2=false end elseif u.KeyCode==J2.ToggleMouseDrive then if u.UserInputState==Enum.UserInputState.End then G2=not G2 D=r.IdleThrottle/100 w=0 J=0 end elseif r.TCSEnabled and(T and u.KeyCode==J2.ToggleTCS)or u.KeyCode==J2.ContlrToggleTCS then if u.UserInputState==Enum.UserInputState.End then k2=not k2 end elseif r.ABSEnabled and(T and u.KeyCode==J2.ToggleABS)or u.KeyCode==J2.ContlrToggleABS then if u.UserInputState==Enum.UserInputState.End then f2=not f2 end end if u.UserInputType.Name:find("\071\097\109\101\112\097\100")then if u.KeyCode==J2.ContlrSteer then if u.Position.X>=0 then local Y=math.min(.99,r.Peripherals.ControlRDZone/100)if math.abs(u.Position.X)>Y then J=(u.Position.X-Y)/(1-Y)else J=0 end else local Y=math.min(.99,r.Peripherals.ControlLDZone/100)if math.abs(u.Position.X)>Y then J=(u.Position.X+Y)/(1-Y)else J=0 end end elseif u.KeyCode==J2.ContlrThrottle then if T then D=math.max(r.IdleThrottle/100,u.Position.Z)else D=r.IdleThrottle/100 end elseif u.KeyCode==J2.ContlrBrake then w=u.Position.Z end end else D=r.IdleThrottle/100 J=0 w=0 end end M.InputBegan:connect(DealWithInput)M.InputChanged:connect(DealWithInput)M.InputEnded:connect(DealWithInput)local n2={}if r.Config=="\070\087\068"or r.Config=="\065\087\068"then for u,Y in pairs(G.Wheels:GetChildren())do if Y.Name=="\070\076"or Y.Name=="\070\082"or Y.Name=="\070"then table.insert(n2,Y)end end end if r.Config=="\082\087\068"or r.Config=="\065\087\068"then for u,Y in pairs(G.Wheels:GetChildren())do if Y.Name=="\082\076"or Y.Name=="\082\082"or Y.Name=="\082"then table.insert(n2,Y)end end end local D2=0 for u,Y in pairs(n2)do if Y.Size.x>D2 then D2=Y.Size.x end end for u,Y in pairs(G.Wheels:GetChildren())do if math.abs(Y["\035\066\086"].MotorMaxTorque-y)<1 then j2=true end end function Inputs(u)local Y=60/(1/u)if n<=D then n=math.min(D,n+r.ThrotAccel*Y)else n=math.max(D,n-r.ThrotDecel*Y)end if Z<=w then Z=math.min(w,Z+r.BrakeAccel*Y)else Z=math.max(w,Z-r.BrakeDecel*Y)end end if r.SteeringType=="\078\101\119"then f=(r.LockToLock*180)/r.SteerRatio N=math.min(f-f*(1-r.Ackerman),f*1.2)end function Steering(u)local M=60/(1/u)if G2 then local u=math.max(1,(Y.ViewSizeX*r.Peripherals.MSteerWidth)/200)local M=r.Peripherals.MSteerDZone/100 local G=(Y.X-Y.ViewSizeX/2)/u if math.abs(G)<=M then J=0 else J=(math.max(math.min(math.abs(G)-M,1-M),0)/(1-M))^r.MSteerExp*(G/math.abs(G))end end if W<J then if W<0 then W=math.min(J,W+r.ReturnSpeed*M)else W=math.min(J,W+r.SteerSpeed*M)end else if W>0 then W=math.max(J,W-r.ReturnSpeed*M)else W=math.max(J,W-r.SteerSpeed*M)end end local x=1-math.min(G.DriveSeat.Velocity.Magnitude/r.SteerDecay,1-r.MinSteer/100)local j=1-math.min(G.DriveSeat.Velocity.Magnitude/r.RSteerDecay,1-r.MinSteer/100)for u,Y in pairs(G.Wheels:GetChildren())do if Y.Name=="\070"then Y.Arm.Steer.CFrame=G.Wheels.F.Base.CFrame*CFrame.Angles(0,-math.rad((W*r.SteerInner)*x),0)elseif Y.Name=="\070\076"then if W>=0 then Y.Arm.Steer.CFrame=G.Wheels.FL.Base.CFrame*CFrame.Angles(0,-math.rad((W*f)*x),0)else Y.Arm.Steer.CFrame=G.Wheels.FL.Base.CFrame*CFrame.Angles(0,-math.rad((W*N)*x),0)end elseif Y.Name=="\070\082"then if W>=0 then Y.Arm.Steer.CFrame=G.Wheels.FR.Base.CFrame*CFrame.Angles(0,-math.rad((W*N)*x),0)else Y.Arm.Steer.CFrame=G.Wheels.FR.Base.CFrame*CFrame.Angles(0,-math.rad((W*f)*x),0)end elseif Y.Name=="\082"then if r.FWSteer=="\078\111\110\101"then elseif r.FWSteer=="\083\116\097\116\105\099"then Y.Arm.Steer.CFrame=G.Wheels.R.Base.CFrame*CFrame.Angles(0,math.rad(((W*P)*j)*math.min(0,1-G.DriveSeat.Velocity.Magnitude/r.RSteerSpeed)),0)elseif r.FWSteer=="\083\112\101\101\100"then Y.Arm.Steer.CFrame=G.Wheels.R.Base.CFrame*CFrame.Angles(0,-math.rad(((W*P)*j)*math.min(1,G.DriveSeat.Velocity.Magnitude/r.RSteerSpeed)),0)elseif r.FWSteer=="\066\111\116\104"then Y.Arm.Steer.CFrame=G.Wheels.R.Base.CFrame*CFrame.Angles(0,math.rad(((W*P)*j)*math.max(-1,1-G.DriveSeat.Velocity.Magnitude/r.RSteerSpeed)),0)end elseif Y.Name=="\082\076"then if r.FWSteer=="\078\111\110\101"then elseif r.FWSteer=="\083\116\097\116\105\099"then if W>=0 then Y.Arm.Steer.CFrame=G.Wheels.RL.Base.CFrame*CFrame.Angles(0,math.rad(((W*A)*j)*math.min(0,1-G.DriveSeat.Velocity.Magnitude/r.RSteerSpeed)),0)else Y.Arm.Steer.CFrame=G.Wheels.RL.Base.CFrame*CFrame.Angles(0,math.rad(((W*P)*j)*math.min(0,1-G.DriveSeat.Velocity.Magnitude/r.RSteerSpeed)),0)end elseif r.FWSteer=="\083\112\101\101\100"then if W>=0 then Y.Arm.Steer.CFrame=G.Wheels.RL.Base.CFrame*CFrame.Angles(0,-math.rad(((W*A)*j)*math.min(1,G.DriveSeat.Velocity.Magnitude/r.RSteerSpeed)),0)else Y.Arm.Steer.CFrame=G.Wheels.RL.Base.CFrame*CFrame.Angles(0,-math.rad(((W*P)*j)*math.min(1,G.DriveSeat.Velocity.Magnitude/r.RSteerSpeed)),0)end elseif r.FWSteer=="\066\111\116\104"then if W>=0 then Y.Arm.Steer.CFrame=G.Wheels.RL.Base.CFrame*CFrame.Angles(0,math.rad(((W*A)*j)*math.max(-1,1-G.DriveSeat.Velocity.Magnitude/r.RSteerSpeed)),0)else Y.Arm.Steer.CFrame=G.Wheels.RL.Base.CFrame*CFrame.Angles(0,math.rad(((W*P)*j)*math.max(-1,1-G.DriveSeat.Velocity.Magnitude/r.RSteerSpeed)),0)end end elseif Y.Name=="\082\082"then if r.FWSteer=="\078\111\110\101"then elseif r.FWSteer=="\083\116\097\116\105\099"then if W>=0 then Y.Arm.Steer.CFrame=G.Wheels.RR.Base.CFrame*CFrame.Angles(0,math.rad(((W*P)*j)*math.min(0,1-G.DriveSeat.Velocity.Magnitude/r.RSteerSpeed)),0)else Y.Arm.Steer.CFrame=G.Wheels.RR.Base.CFrame*CFrame.Angles(0,math.rad(((W*A)*j)*math.min(0,1-G.DriveSeat.Velocity.Magnitude/r.RSteerSpeed)),0)end elseif r.FWSteer=="\083\112\101\101\100"then if W>=0 then Y.Arm.Steer.CFrame=G.Wheels.RR.Base.CFrame*CFrame.Angles(0,-math.rad(((W*P)*j)*math.min(1,G.DriveSeat.Velocity.Magnitude/r.RSteerSpeed)),0)else Y.Arm.Steer.CFrame=G.Wheels.RR.Base.CFrame*CFrame.Angles(0,-math.rad(((W*A)*j)*math.min(1,G.DriveSeat.Velocity.Magnitude/r.RSteerSpeed)),0)end elseif r.FWSteer=="\066\111\116\104"then if W>=0 then Y.Arm.Steer.CFrame=G.Wheels.RR.Base.CFrame*CFrame.Angles(0,math.rad(((W*P)*j)*math.max(-1,1-G.DriveSeat.Velocity.Magnitude/r.RSteerSpeed)),0)else Y.Arm.Steer.CFrame=G.Wheels.RR.Base.CFrame*CFrame.Angles(0,math.rad(((W*A)*j)*math.max(-1,1-G.DriveSeat.Velocity.Magnitude/r.RSteerSpeed)),0)end end end end end local C2=r.FinalDrive*r.FDMult local Z2=(C2*30)/math.pi local w2=(workspace.Gravity*r.InclineComp)/32.2 local I2=(D2*math.pi)/60 local X2=CFrame.Angles(math.pi/2,-math.pi/2,0)local U2=CFrame.Angles(0,math.pi,0)if not r.Engine and r.Electric then r.Redline=r.E_Redline r.PeakRPM=r.E_Trans2 r.Turbochargers=0 r.Superchargers=0 r.Clutch=false r.IdleRPM=0 r.ClutchType="\067\108\117\116\099\104"r.AutoShiftType="\068\067\084"r.ShiftUpTime=.1 r.ShiftDnTime=.1 end h=r.Turbochargers v=r.T_Boost*r.Turbochargers K=r.Superchargers m=r.S_Boost*r.Superchargers local S2=r.Horsepower/100 local L2=(((r.Horsepower*(v*(r.T_Efficiency/10)))/7.5)/2)/100 local e2=(((r.Horsepower*(m*(r.S_Efficiency/10)))/7.5)/2)/100 local a2=r.PeakRPM/1000 local B2=r.PeakSharpness local R2=r.CurveMult local Q2=r.EqPoint/1000 function CurveN(u)u=u/1000 return(-(u-a2)^2*math.min(S2/a2^2,R2^(a2/S2))+S2)*(u-u^B2/(B2*a2^(B2-1)))end local l2=CurveN(r.PeakRPM)function CurveT(u)u=u/1000 return(-(u-a2)^2*math.min(L2/a2^2,R2^(a2/L2))+L2)*(u-u^B2/(B2*a2^(B2-1)))end local z2=CurveT(r.PeakRPM)function CurveS(u)u=u/1000 return(-(u-a2)^2*math.min(e2/a2^2,R2^(a2/e2))+e2)*(u-u^B2/(B2*a2^(B2-1)))end local H2=CurveS(r.PeakRPM)local V2=r.E_Horsepower/100 local d2=r.E_Torque/100 local h2=r.E_Trans1/1000 local v2=r.E_Trans2/1000 local E2=r.E_Redline/1000 function elecHP(u)u=u/1000 local Y=1e-09 if u<=h2 then Y=((u/h2)^r.EH_FrontMult/(1/V2))*(u/h2)+((u/h2)^(1/r.EH_FrontMult)/(1/V2))*(1-u/h2)elseif h2<u and u<v2 then Y=V2 elseif v2<=u then Y=V2-((u-v2)/(E2-v2))^r.EH_EndMult/(1/(V2*(r.EH_EndPercent/100)))else error("\n\t \091\065\067\054\067\093\058 \068\114\105\118\101 \105\110\105\116\105\097\108\105\122\097\116\105\111\110 \102\097\105\108\101\100\033"..("\n\t    \065\110 \117\110\107\110\111\119\110 \101\114\114\111\114 \111\099\099\117\114\101\100 \119\104\101\110 \105\110\105\116\105\097\108\105\122\105\110\103 \101\108\101\099\116\114\105\099 \104\111\114\115\101\112\111\119\101\114\046"..("\n\t    \080\108\101\097\115\101 \115\101\110\100 \097 \115\099\114\101\101\110\115\104\111\116 \111\102 \116\104\105\115 \109\101\115\115\097\103\101 \116\111 \065\118\120\110\116\117\114\097\100\111\114\046"..("\n\t    \082\058 "..(u..("\044 \084\049\058 "..(h2("\044 \084\050\058 ")..(v2("\044 \076\058 ")..E2("\046")))))))))end return Y end function elecTQ(u)u=u/1000 local Y=1e-09 if u<h2 then Y=d2 elseif h2<=u then Y=d2-((u-h2)/(E2-h2))^r.ET_EndMult/(1/(d2*(r.ET_EndPercent/100)))else error("\n\t \091\065\067\054\067\093\058 \068\114\105\118\101 \105\110\105\116\105\097\108\105\122\097\116\105\111\110 \102\097\105\108\101\100\033"..("\n\t    \065\110 \117\110\107\110\111\119\110 \101\114\114\111\114 \111\099\099\117\114\101\100 \119\104\101\110 \105\110\105\116\105\097\108\105\122\105\110\103 \101\108\101\099\116\114\105\099 \116\111\114\113\117\101\046"..("\n\t    \080\108\101\097\115\101 \115\101\110\100 \097 \115\099\114\101\101\110\115\104\111\116 \111\102 \116\104\105\115 \109\101\115\115\097\103\101 \116\111 \065\118\120\110\116\117\114\097\100\111\114\046"..("\n\t    \082\058 "..(u..("\044 \084\049\058 "..(h2("\044 \084\050\058 ")..(v2("\044 \076\058 ")..E2("\046")))))))))end return Y end function GetNCurve(u,Y)local M=math.max(CurveN(u)/(l2/S2),0)*100 return M,((((M*(Q2/u))*r.Ratios[Y+2])*C2)*x)*1000 end function GetECurve(u,Y)local M=math.max(elecHP(u),0)*100 local G=math.max(elecTQ(u),0)*100 if Y~=0 then return M,math.max(((G*r.Ratios[Y+2])*C2)*x,0)else return 0,0 end end function GetTCurve(u,Y)local M=math.max(CurveT(u)/(z2/L2),0)*100 return M,((((M*(Q2/u))*r.Ratios[Y+2])*C2)*x)*1000 end function GetSCurve(u,Y)local M=math.max(CurveS(u)/(H2/e2),0)*100 return M,((((M*(Q2/u))*r.Ratios[Y+2])*C2)*x)*1000 end local K2={}local m2={}local O2={}local s2={}for u,Y in pairs(r.Ratios)do local M={}local G={}local x={}local j={}for Y=0,math.ceil((r.Redline+100)/100),1 do local k={}local y={}local o={}local f={}if Y~=0 then if r.Engine then k.Horsepower,k.Torque=GetNCurve(Y*100,u-2)if h~=0 then o.Horsepower,o.Torque=GetTCurve(Y*100,u-2)else o.Horsepower,o.Torque=0,0 end if K~=0 then f.Horsepower,f.Torque=GetSCurve(Y*100,u-2)else f.Horsepower,f.Torque=0,0 end else k.Horsepower,k.Torque=0,0 o.Horsepower,o.Torque=0,0 f.Horsepower,f.Torque=0,0 end if r.Electric then y.Horsepower,y.Torque=GetECurve(Y*100,u-2)else y.Horsepower,y.Torque=0,0 end else k.Horsepower,k.Torque=0,0 y.Horsepower,y.Torque=0,0 o.Horsepower,o.Torque=0,0 f.Horsepower,f.Torque=0,0 end if r.Engine then nhp,ntq=GetNCurve((Y+1)*100,u-2)if h~=0 then thp,ttq=GetTCurve((Y+1)*100,u-2)else thp,ttq=0,0 end if K~=0 then shp,stq=GetSCurve((Y+1)*100,u-2)else shp,stq=0,0 end else nhp,ntq=0,0 thp,ttq=0,0 shp,stq=0,0 end if r.Electric then ehp,etq=GetECurve((Y+1)*100,u-2)else ehp,etq=0,0 end k.HpSlope,k.TqSlope=nhp-k.Horsepower,ntq-k.Torque y.HpSlope,y.TqSlope=ehp-y.Horsepower,etq-y.Torque o.HpSlope,o.TqSlope=thp-o.Horsepower,ttq-o.Torque f.HpSlope,f.TqSlope=shp-f.Horsepower,stq-f.Torque M[Y]=k G[Y]=y x[Y]=o j[Y]=f end table.insert(K2,M)table.insert(m2,G)table.insert(O2,x)table.insert(s2,j)end wait()function Auto()local u=0 for Y,M in pairs(n2)do if M.RotVelocity.Magnitude>u then u=M.RotVelocity.Magnitude end end if T then if r.AutoShiftVers=="\079\108\100"and R==0 then R=1 I=false end if R>=1 then if(R==1 and(Z>0 and G.DriveSeat.Velocity.Magnitude<5))and r.AutoShiftVers=="\079\108\100"then R=-1 I=false elseif G.DriveSeat.Velocity.Magnitude>5 then if r.AutoShiftMode=="\082\080\077"then if e>r.PeakRPM+r.AutoUpThresh then if not l and not H then l=true end elseif math.max(math.min((u*r.Ratios[R+1])*Z2,r.Redline+100),r.IdleRPM)<r.PeakRPM-r.AutoDownThresh and R>1 then if not z and not H then z=true end end else if G.DriveSeat.Velocity.Magnitude>math.ceil(((I2*(r.PeakRPM+r.AutoUpThresh))/r.Ratios[R+2])/C2)then if not l and not H then l=true end elseif G.DriveSeat.Velocity.Magnitude<math.ceil(((I2*(r.PeakRPM-r.AutoDownThresh))/r.Ratios[R+1])/C2)and R>1 then if not z and not H then z=true end end end end else if(n-r.IdleThrottle/100>0 and G.DriveSeat.Velocity.Magnitude<5)and r.AutoShiftVers=="\079\108\100"then R=1 I=false end end end end function Gear()local u=0 for Y,M in pairs(n2)do if M.RotVelocity.Magnitude>u then u=M.RotVelocity.Magnitude end end if l and not H then if M2=="\077\097\110\117\097\108"and not I or M2=="\077\097\110\117\097\108"and(r.ClutchRel and n-r.IdleThrottle/100>0)or R==#r.Ratios-2 or M2~="\077\097\110\117\097\108"and not T then l=false return end local Y=math.min(R+3,#r.Ratios)if M2~="\077\097\110\117\097\108"then H=true if R>0 then if r.AutoShiftType=="\068\067\084"then wait(r.ShiftUpTime)elseif r.AutoShiftType=="\082\101\118"then repeat wait()until e<=math.max(math.min((u*r.Ratios[Y])*Z2,r.Redline-r.RevBounce),r.IdleRPM)or not T or z end end end l=false H=false if M2~="\077\097\110\117\097\108"and not T then return end R=math.min(R+1,#r.Ratios-2)if M2~="\077\097\110\117\097\108"or(M2=="\077\097\110\117\097\108"and R==1)and T then I=false end end if z and not H then if M2=="\077\097\110\117\097\108"and not I or R==-1 or M2~="\077\097\110\117\097\108"and not T then z=false return end local Y=math.min(R+1,#r.Ratios)if M2~="\077\097\110\117\097\108"then H=true if R>1 then if r.AutoShiftType=="\068\067\084"then wait(r.ShiftDnTime)elseif r.AutoShiftType=="\082\101\118"then repeat wait()until e>=math.max(math.min((u*r.Ratios[Y])*Z2,r.Redline-r.RevBounce),r.IdleRPM)or not T or l end end end z=false H=false if M2~="\077\097\110\117\097\108"and not T then return end R=math.max(R-1,-1)if M2~="\077\097\110\117\097\108"or(M2=="\077\097\110\117\097\108"and R==-1)and T then I=false end end end local q2=0 local b2=1 local i2=0 local F2=false local t2=tick()function Engine(u)local Y=60/(1/u)if(R==0 or H)and T then I=true U=1 F2=false end local M=r.IdleRPM local x=r.IdleRPM local f=r.Redline if r.Stall and r.Clutch then M=0 end if H and l then p=0 elseif H and z then p=r.ShiftThrot/100 else if r.AutoShiftVers=="\079\108\100"and(R==-1 and M2=="\065\117\116\111")then p=Z else p=n end end if r.AutoShiftVers=="\079\108\100"and(R==-1 and M2=="\065\117\116\111")then C=n-r.IdleThrottle/100 else C=Z end if not T then t2=tick()M=0 x=0 p=r.IdleThrottle/100 if M2~="\077\097\110\117\097\108"then R=0 I=true U=1 end end if(I and R==0 or X and R~=0)and r.NeutralLimit then if R==0 and not r.LimitClutch or r.LimitClutch then f=r.NeutralRevRPM end end local N=0 local A=0 local P=p for u,Y in pairs(n2)do N=N+Y.RotVelocity.Magnitude A=A+1 end N=N/A if q2>f+100 then P=r.IdleThrottle/100 end if r.Engine or r.Electric then q2=math.clamp((e-r.RevDecay*Y)+((r.RevDecay+r.RevAccel)*P)*Y,x,r.Redline+100)end if q2>r.Redline then if R<#r.Ratios-2 then q2=q2-r.RevBounce else q2=q2-r.RevBounce*.5 end end local J=(N*r.Ratios[R+2])*Z2 if r.Clutch then if script.Parent.Values.AutoClutch.Value and T then if r.ClutchType=="\067\108\117\116\099\104"then if I then S=1 end S=S*(r.ClutchEngage/100)local u=math.max(((e-r.IdleRPM)*r.ClutchRPMMult)/(r.Redline-r.IdleRPM),0)if r.ClutchMode=="\078\101\119"then u=0 end L=math.min(((script.Parent.Values.Velocity.Value.Magnitude/r.SpeedEngage)/math.abs(R)+u)-S,1)elseif r.ClutchType=="\067\086\084"or r.ClutchType=="\084\111\114\113\117\101\067\111\110\118\101\114\116\101\114"and r.TQLock then if p-r.IdleThrottle/100==0 and script.Parent.Values.Velocity.Value.Magnitude<r.SpeedEngage or p-r.IdleThrottle/100~=0 and(e<r.RPMEngage and J<r.RPMEngage)then L=math.min(L*(r.ClutchEngage/100),1)else L=math.min(L*(r.ClutchEngage/100)+(1-r.ClutchEngage/100),1)end elseif r.ClutchType=="\084\111\114\113\117\101\067\111\110\118\101\114\116\101\114"and not r.TQLock then L=math.min((e/r.Redline)*.7,1)end if not I then U=math.min(1-L,1)else U=1 end F2=U<=.01 or F2 else F2=r.Stall U=script.Parent.Values.Clutch.Value end else F2=false if not I and not H then U=0 else U=1 end end local W=math.max(math.min(q2*U+J*(1-U),r.Redline+100),M)local D=math.min(math.abs(W-e)/(r.Flywheel*Y),.9)if I then D=0 end e=e*D+W*(1-D)if e<=r.IdleRPM/4 and(F2 and tick()-t2>=.2)then script.Parent.IsOn.Value=not r.Stall end V=(r.Redline+100)/(Z2*r.Ratios[R+2])if e>r.Redline then if R<#r.Ratios-2 then e=e-r.RevBounce else e=e-r.RevBounce*.5 end end local w=v/h local Q=p if r.Engine then if h~=0 then E=E+(((((a*(Q*1.2))/r.Horsepower)/8-(E/w)*(w/15))*((8/(r.T_Size/Y))*2))/w)*15 if E<.05 then E=.05 elseif E>2 then E=2 end else E=0 end if K~=0 then if Q>i2 then i2=math.min(Q,i2+r.S_Sensitivity*Y)elseif Q<i2 then i2=math.max(Q,i2-r.S_Sensitivity*Y)end O=(e/r.Redline)*(.5+1.5*i2)else O=0 end else E=0 O=0 end if r.Engine then local u=K2[R+2][math.floor(math.min(r.Redline,math.max(0,e))/100)]s=u.Horsepower+u.HpSlope*(((e-math.floor(e/100))/100)%1)q=u.Torque+u.TqSlope*(((e-math.floor(e/100))/100)%1)if h~=0 then local u=O2[R+2][math.floor(math.min(r.Redline,math.max(0,e))/100)]F=(u.Horsepower+u.HpSlope*(((e-math.floor(e/100))/100)%1))*(E/2)t=(u.Torque+u.TqSlope*(((e-math.floor(e/100))/100)%1))*(E/2)else F,t=0,0 end if K~=0 then local u=s2[R+2][math.floor(math.min(r.Redline,math.max(0,e))/100)]c=(u.Horsepower+u.HpSlope*(((e-math.floor(e/100))/100)%1))*(O/2)g=(u.Torque+u.TqSlope*(((e-math.floor(e/100))/100)%1))*(O/2)else c,g=0,0 end u2=F+c Y2=t+g else s,q=0,0 F,t=0,0 c,g=0,0 u2,Y2=0,0 end if r.Electric and R~=0 then local u=m2[R+2][math.floor(math.min(r.Redline,math.max(100,e))/100)]b=u.Horsepower+u.HpSlope*(((e-math.floor(e/100))/100)%1)i=u.Torque+u.TqSlope*(((e-math.floor(e/100))/100)%1)else b,i=0,0 end a=(s+u2)+b B=(q+Y2)+i local d=G.DriveSeat.CFrame.lookVector.y*w2 if R==-1 then d=-d end B=B*math.max(1,1+d)local m=0 local G2=0 local r2=0 local x2=0 for u,Y in pairs(G.Wheels:GetChildren())do if Y.Name=="\070\076"or Y.Name=="\070\082"or Y.Name=="\070"then m=m+Y.RotVelocity.Magnitude G2=G2+1 elseif Y.Name=="\082\076"or Y.Name=="\082\082"or Y.Name=="\082"then r2=r2+Y.RotVelocity.Magnitude x2=x2+1 end end m=m/G2 r2=r2/x2 local A2=(m+r2)/2 for u,Y in pairs(G.Wheels:GetChildren())do local M=(CFrame.new(Y.Position-(Y.Arm.CFrame*X2).lookVector,Y.Position)*U2).lookVector local x=1 local f=1 local N=1 local A=1 local P=1 local T=1 if Y.Name=="\070\076"or Y.Name=="\082\076"then x=-1 end if r.DifferentialType=="\079\108\100"then if Y.Name=="\070\076"or Y.Name=="\070\082"then f=math.max(0,math.min(1,1+(((Y.RotVelocity.Magnitude-m)/m)/(math.max(r.FDiffSlipThres,1)/100))*((r.FDiffLockThres-50)/50)))if r.Config=="\065\087\068"then f=math.max(0,math.min(1,f*(1+(((m-A2)/A2)/(math.max(r.CDiffSlipThres,1)/100))*((r.CDiffLockThres-50)/50))))end elseif Y.Name=="\082\076"or Y.Name=="\082\082"then f=math.max(0,math.min(1,1+(((Y.RotVelocity.Magnitude-r2)/r2)/(math.max(r.RDiffSlipThres,1)/100))*((r.RDiffLockThres-50)/50)))if r.Config=="\065\087\068"then f=math.max(0,math.min(1,f*(1+(((r2-A2)/A2)/(math.max(r.CDiffSlipThres,1)/100))*((r.CDiffLockThres-50)/50))))end end else if Y.Name=="\070\082"then local u=(Y.RotVelocity.Magnitude/G.Wheels.FL.RotVelocity.Magnitude-1)*(r.FDiffPreload/10)P=math.ceil(math.max(0,math.min(2,1-(((r.FDiffPower/100)*u)*p+((r.FDiffCoast/100)*u)*(1-p))))*100)/100 T=2-P elseif Y.Name=="\070\076"then local u=(Y.RotVelocity.Magnitude/G.Wheels.FR.RotVelocity.Magnitude-1)*(r.FDiffPreload/10)T=math.ceil(math.max(0,math.min(2,1-(((r.FDiffPower/100)*u)*p+((r.FDiffCoast/100)*u)*(1-p))))*100)/100 P=2-T elseif Y.Name=="\082\082"then local u=(Y.RotVelocity.Magnitude/G.Wheels.RL.RotVelocity.Magnitude-1)*(r.RDiffPreload/10)N=math.ceil(math.max(0,math.min(2,1-(((r.RDiffPower/100)*u)*p+((r.RDiffCoast/100)*u)*(1-p))))*100)/100 A=2-N elseif Y.Name=="\082\076"then local u=(Y.RotVelocity.Magnitude/G.Wheels.RR.RotVelocity.Magnitude-1)*(r.RDiffPreload/10)A=math.ceil(math.max(0,math.min(2,1-(((r.RDiffPower/100)*u)*p+((r.RDiffCoast/100)*u)*(1-p))))*100)/100 N=2-A end end y2=false N2=false local J=1 if not script.Parent.IsOn.Value then J=0 end local W=p local n=C local D=1 if I then D=0 end local Z=B local w=1 if f2 and(n>0 and math.abs(Y.RotVelocity.Magnitude*(Y.Size.x/2)-Y.Velocity.Magnitude)-r.ABSThreshold>0)then w=0 end N2=w<1 local X=0 if j2==true then X=1 else X=0 end local U=false for u,M in pairs(n2)do if M==Y then U=true end end if U then if r.Config=="\065\087\068"then local u=(r.TorqueVector+1)/2 if string.find(Y.Name,"\070")then Z=Z*(1-u)elseif string.find(Y.Name,"\082")then Z=Z*u end end b2=1 if k2 and W>0 then b2=1-math.min(math.max(0,math.abs(Y.RotVelocity.Magnitude*(Y.Size.x/2)-Y.Velocity.Magnitude)-r.TCSThreshold)/r.TCSGradient,1)*(1-r.TCSLimit/100)end if b2<1 then o2=b2 y2=true end local u=1 if R==-1 then u=-1 end if r.ClutchKick and(G.DriveSeat.Velocity.Magnitude<r.KickSpeedThreshold and(e>r.Redline-r.KickRPMThreshold and Y["\035\066\086"].MotorMaxTorque<1))then Z=Z*r.KickMult end local M=(((((Z*(60/workspace:GetRealPhysicsFPS()))*(1+(Y.RotVelocity.Magnitude/(120-workspace:GetRealPhysicsFPS()))^(1.15+.07*(1-60/workspace:GetRealPhysicsFPS()))))*W)*b2)*J)*D if Y.Name=="\082\082"then Y["\035\065\086"].MotorMaxTorque=(M*N)*f elseif Y.Name=="\082\076"then Y["\035\065\086"].MotorMaxTorque=(M*A)*f elseif Y.Name=="\070\082"then Y["\035\065\086"].MotorMaxTorque=(M*P)*f elseif Y.Name=="\070\076"then Y["\035\065\086"].MotorMaxTorque=(M*T)*f else Y["\035\065\086"].MotorMaxTorque=M*f end Y["\035\065\086"].AngularVelocity=V*u if string.find(Y.Name,"\070")then Y["\035\066\086"].MotorMaxTorque=((j*(60/workspace:GetRealPhysicsFPS()))*n)*w+o*((1-W)*(e/r.Redline))else Y["\035\066\086"].MotorMaxTorque=(((k*(60/workspace:GetRealPhysicsFPS()))*n)*w+o*((1-W)*(e/r.Redline)))+y*X end else Y["\035\065\086"].MotorMaxTorque=0 Y["\035\065\086"].AngularVelocity=0 if string.find(Y.Name,"\070")then Y["\035\066\086"].MotorMaxTorque=((j*(60/workspace:GetRealPhysicsFPS()))*n)*w else Y["\035\066\086"].MotorMaxTorque=((k*(60/workspace:GetRealPhysicsFPS()))*n)*w+y*X end end end end function Flip()if(G.DriveSeat.CFrame*CFrame.Angles(math.pi/2,0,0)).lookVector.y>.1 or P2 then A2=tick()else if tick()-A2>=3 then P2=true local u=G.DriveSeat.Flip u.maxTorque=Vector3.new(10000,0,10000)u.P=3000 u.D=500 wait(1)u.maxTorque=Vector3.new(0,0,0)u.P=0 u.D=0 P2=false end end end local c2=require(G["\065-\067\104\097\115\115\105\115 \084\117\110\101"].README)print("\078\111\118\101\110\097\058 \065\067\054\067 \076\111\097\100\101\100 - \086\101\114\115\105\111\110 "..(c2 ..("\044 \085\112\100\097\116\101 "..script.Parent.Version.Value)))game["\082\117\110 \083\101\114\118\105\099\101"].Heartbeat:connect(function(u)T=script.Parent.IsOn.Value T2=script.Parent.ControlsOpen.Value Inputs(u)Steering(u)Gear()Engine(u)script.Parent.Values.Gear.Value=R script.Parent.Values.RPM.Value=e script.Parent.Values.Boost.Value=(E/2)*v+(O/2)*m script.Parent.Values.BoostTurbo.Value=(E/2)*v script.Parent.Values.BoostSuper.Value=(O/2)*m script.Parent.Values.HpNatural.Value=s script.Parent.Values.HpElectric.Value=b script.Parent.Values.HpTurbo.Value=F script.Parent.Values.HpSuper.Value=c script.Parent.Values.HpBoosted.Value=u2 script.Parent.Values.Horsepower.Value=a script.Parent.Values.TqNatural.Value=((q/r.Ratios[R+2])/C2)/x script.Parent.Values.TqElectric.Value=((i/r.Ratios[R+2])/C2)/x script.Parent.Values.TqTurbo.Value=((t/r.Ratios[R+2])/C2)/x script.Parent.Values.TqSuper.Value=((g/r.Ratios[R+2])/C2)/x script.Parent.Values.TqBoosted.Value=script.Parent.Values.TqTurbo.Value+script.Parent.Values.TqSuper.Value script.Parent.Values.Torque.Value=(script.Parent.Values.TqNatural.Value+script.Parent.Values.TqElectric.Value)+script.Parent.Values.TqBoosted.Value script.Parent.Values.TransmissionMode.Value=M2 script.Parent.Values.Throttle.Value=p script.Parent.Values.Brake.Value=C if script.Parent.Values.AutoClutch.Value then script.Parent.Values.Clutch.Value=U end script.Parent.Values.SteerC.Value=W script.Parent.Values.SteerT.Value=J script.Parent.Values.PBrake.Value=j2 script.Parent.Values.TCS.Value=k2 script.Parent.Values.TCSActive.Value=y2 script.Parent.Values.TCSAmt.Value=1-o2 script.Parent.Values.ABS.Value=f2 script.Parent.Values.ABSActive.Value=N2 script.Parent.Values.MouseSteerOn.Value=G2 script.Parent.Values.Velocity.Value=G.DriveSeat.Velocity end)while wait(.0667)do if M2=="\065\117\116\111"then Auto()end if r.AutoFlip then Flip()end end
--
	
	--[[START]]
	
	script.Parent:WaitForChild("Car")
	script.Parent:WaitForChild("IsOn")
	script.Parent:WaitForChild("ControlsOpen")
	script.Parent:WaitForChild("Values")
	
	--[[Dependencies]]
	
	local player = game.Players.LocalPlayer
	local mouse = player:GetMouse()
	local UserInputService = game:GetService("UserInputService")
	local car = script.Parent.Car.Value
	local _Tune = require(car["A-Chassis Tune"])
	
	--[[Output Scaling Factor]]
	
	local hpScaling = _Tune.WeightScaling*10
	local FBrakeForce = _Tune.BrakeForce*_Tune.BrakeBias--luaint edit
	local RBrakeForce = _Tune.BrakeForce*(1-_Tune.BrakeBias)--luaint edit
	local PBrakeForce = _Tune.PBrakeForce
	local EBrakeForce = _Tune.EBrakeForce
	local SteerOuter  = _Tune.SteerOuter--luaint edit
	local SteerInner  = _Tune.SteerInner--luaint edit
	local RSteerOuter = _Tune.RSteerOuter
	local RSteerInner = _Tune.RSteerInner
	
	if not workspace:PGSIsEnabled() then
		error("PGS is not enabled: A-Chassis will not work.")
	end
	
	--[[Status Vars]]
	
	local _IsOn = _Tune.AutoStart
	if _Tune.AutoStart and (_Tune.Engine or _Tune.Electric) then script.Parent.IsOn.Value=true end
	
	local _GSteerT=0
	local _GSteerC=0
	local _GThrot=0
	local _InThrot=0
	local _IThrot=_Tune.IdleThrottle/100
	local _GBrake=0
	local _InBrake=0
	local _IBrake=0
	
	local _ClPressing = false
	local _PlayerClutch = false
	local _Clutch = 0
	local _ClutchKick = 0
	local _ClutchModulate = 0
	local _RPM = 0
	local _HP = 0
	local _OutTorque = 0
	local _CGear = 0
	local _PGear = _CGear
	local _ShiftUp = false
	local _ShiftDn = false
	local _Shifting = false
	local _spLimit = 0
	
	local _Boost = 0
	local _TCount = 0
	local _TPsi = 0
	local _TBoost = 0
	local _SCount = 0
	local _SPsi = 0
	local _SBoost = 0
	local _NH = 0
	local _NT = 0
	local _EH = 0
	local _ET = 0
	local _TH = 0
	local _TT = 0
	local _SH = 0
	local _ST = 0
	local _BH = 0
	local _BT = 0
	
	local _TMode = _Tune.TransModes[1]
	
	local _MSteer = false
	local _SteerL = false
	local _SteerR = false
	local _PBrake = false
	local _TCS = _Tune.TCSEnabled
	local _TCSActive = false
	local _TCSAmt = 0
	local _ABS = _Tune.ABSEnabled
	local _ABSActive = false
	
	local FlipWait=tick()
	local FlipDB=false
	
	local _InControls = false
	
	
	--[[Shutdown]]
	
	car.DriveSeat.ChildRemoved:connect(function(child) if child.Name=="SeatWeld" and child:IsA("Weld") then script.Parent:Destroy() end end)
	
	--[[Controls]]
	
	local _CTRL = _Tune.Controls
	local Controls = Instance.new("Folder",script.Parent)
	Controls.Name = "Controls"
	for i,v in pairs(_CTRL) do
		local a=Instance.new("StringValue",Controls)
		a.Name=i
		a.Value=v.Name
		a.Changed:connect(function()
			if i=="MouseThrottle" or i=="MouseBrake" then
				if a.Value == "MouseButton1" or a.Value == "MouseButton2" then
					_CTRL[i]=Enum.UserInputType[a.Value]
				else
					_CTRL[i]=Enum.KeyCode[a.Value]
				end
			else
				_CTRL[i]=Enum.KeyCode[a.Value]
			end
		end)
	end
	
	--Deadzone Adjust
	local _PPH = _Tune.Peripherals
		for i,v in pairs(_PPH) do
		local a = Instance.new("IntValue",Controls)
		a.Name = i
		a.Value = v
		a.Changed:connect(function() 
			a.Value=math.min(100,math.max(0,a.Value))
			_PPH[i] = a.Value
		end)
	end
	
	--Input Handler
	function DealWithInput(input,IsRobloxFunction)
		if (UserInputService:GetFocusedTextBox()==nil) and not _InControls then --Ignore when UI Focus
			--Shift Down [Manual Transmission]
			if (input.KeyCode ==_CTRL["ContlrShiftDown"] or (_MSteer and input.KeyCode==_CTRL["MouseShiftDown"]) or ((not _MSteer) and input.KeyCode==_CTRL["ShiftDown"])) and ((_IsOn and ((_TMode=="Auto" and _CGear<=1) and _Tune.AutoShiftVers == "New") or _TMode=="Semi") or _TMode=="Manual") and input.UserInputState == Enum.UserInputState.Begin then
				if not _ShiftDn then _ShiftDn = true end
				
			--Shift Up [Manual Transmission]
			elseif (input.KeyCode ==_CTRL["ContlrShiftUp"] or (_MSteer and input.KeyCode==_CTRL["MouseShiftUp"]) or ((not _MSteer) and input.KeyCode==_CTRL["ShiftUp"])) and ((_IsOn and ((_TMode=="Auto" and _CGear<1) and _Tune.AutoShiftVers == "New") or _TMode=="Semi") or _TMode=="Manual") and input.UserInputState == Enum.UserInputState.Begin then
				if not _ShiftUp then _ShiftUp = true end
				
			--Toggle Clutch
			elseif (input.KeyCode ==_CTRL["ContlrClutch"] or (_MSteer and input.KeyCode==_CTRL["MouseClutch"]) or ((not _MSteer) and input.KeyCode==_CTRL["Clutch"])) and _TMode=="Manual" then
				if input.UserInputState == Enum.UserInputState.Begin then
					_ClPressing = true
					_PlayerClutch = true
				elseif input.UserInputState == Enum.UserInputState.End then
					_ClPressing = false
					_PlayerClutch = false
				end
				
			--Toggle PBrake
			elseif input.KeyCode ==_CTRL["ContlrPBrake"] or (_MSteer and input.KeyCode==_CTRL["MousePBrake"]) or ((not _MSteer) and input.KeyCode==_CTRL["PBrake"]) then
				if input.UserInputState == Enum.UserInputState.Begin then
					_PBrake = not _PBrake
				elseif input.UserInputState == Enum.UserInputState.End then
					if car.DriveSeat.Velocity.Magnitude>5 then _PBrake = false end
				end
				
			--Toggle Transmission Mode
			elseif (input.KeyCode == _CTRL["ContlrToggleTMode"] or input.KeyCode==_CTRL["ToggleTransMode"]) and input.UserInputState == Enum.UserInputState.Begin then
				local n=1
				for i,v in pairs(_Tune.TransModes) do
					if v==_TMode then n=i break end
				end
				n=n+1
				if n>#_Tune.TransModes then n=1 end
				_TMode = _Tune.TransModes[n]
				
			--Throttle
			elseif ((not _MSteer) and (input.KeyCode==_CTRL["Throttle"] or input.KeyCode == _CTRL["Throttle2"])) or ((((_CTRL["MouseThrottle"]==Enum.UserInputType.MouseButton1 or _CTRL["MouseThrottle"]==Enum.UserInputType.MouseButton2) and input.UserInputType == _CTRL["MouseThrottle"]) or input.KeyCode == _CTRL["MouseThrottle"])and _MSteer) then
				if input.UserInputState == Enum.UserInputState.Begin and _IsOn then
					_IThrot = 1
				else
					_IThrot = _Tune.IdleThrottle/100
				end
				
			--Brake
			elseif ((not _MSteer) and (input.KeyCode==_CTRL["Brake"] or input.KeyCode == _CTRL["Brake2"])) or ((((_CTRL["MouseBrake"]==Enum.UserInputType.MouseButton1 or _CTRL["MouseBrake"]==Enum.UserInputType.MouseButton2) and input.UserInputType == _CTRL["MouseBrake"]) or input.KeyCode == _CTRL["MouseBrake"])and _MSteer) then
				if input.UserInputState == Enum.UserInputState.Begin then
					_IBrake = 1
				else
					_IBrake = 0
				end
				
			--Steer Left
			elseif (not _MSteer) and (input.KeyCode==_CTRL["SteerLeft"] or input.KeyCode == _CTRL["SteerLeft2"]) then
				if input.UserInputState == Enum.UserInputState.Begin then
					_GSteerT = -1
					_SteerL = true
				else
					if _SteerR then
						_GSteerT = 1
					else
						_GSteerT = 0
					end
					_SteerL = false
				end
				
			--Steer Right
			elseif (not _MSteer) and (input.KeyCode==_CTRL["SteerRight"] or input.KeyCode == _CTRL["SteerRight2"]) then
				if input.UserInputState == Enum.UserInputState.Begin then
					_GSteerT = 1
					_SteerR = true
				else
					if _SteerL then
						_GSteerT = -1
					else
						_GSteerT = 0
					end
					_SteerR = false
				end
				
			--Toggle Mouse Controls
			elseif input.KeyCode ==_CTRL["ToggleMouseDrive"] then
				if input.UserInputState == Enum.UserInputState.End then
					_MSteer = not _MSteer
					_IThrot = _Tune.IdleThrottle/100
					_IBrake = 0
					_GSteerT = 0
				end
				
			--Toggle TCS
			elseif _Tune.TCSEnabled and _IsOn and input.KeyCode == _CTRL["ToggleTCS"] or input.KeyCode == _CTRL["ContlrToggleTCS"] then
				if input.UserInputState == Enum.UserInputState.End then _TCS = not _TCS end
			
			--Toggle ABS
			elseif _Tune.ABSEnabled and _IsOn and input.KeyCode == _CTRL["ToggleABS"] or input.KeyCode == _CTRL["ContlrToggleABS"] then
				if input.UserInputState == Enum.UserInputState.End then _ABS = not _ABS end
				
			end
			
			--Variable Controls
			if input.UserInputType.Name:find("Gamepad") then
				--Gamepad Steering
				if input.KeyCode == _CTRL["ContlrSteer"] then
					if input.Position.X>= 0 then
						local cDZone = math.min(.99,_Tune.Peripherals.ControlRDZone/100)
						if math.abs(input.Position.X)>cDZone then
							_GSteerT = (input.Position.X-cDZone)/(1-cDZone)
						else
							_GSteerT = 0
						end
					else
						local cDZone = math.min(.99,_Tune.Peripherals.ControlLDZone/100)
						if math.abs(input.Position.X)>cDZone then
							_GSteerT = (input.Position.X+cDZone)/(1-cDZone)
						else
							_GSteerT = 0
						end
					end
					
				--Gamepad Throttle
				elseif input.KeyCode == _CTRL["ContlrThrottle"] then
					if _IsOn then
						_IThrot = math.max(_Tune.IdleThrottle/100,input.Position.Z)
					else
						_IThrot = _Tune.IdleThrottle/100
					end
					
				--Gamepad Brake
				elseif input.KeyCode == _CTRL["ContlrBrake"] then
					_IBrake = input.Position.Z
				end
			end
		else
			_IThrot = _Tune.IdleThrottle/100
			_GSteerT = 0
			_IBrake = 0
		end
	end
	UserInputService.InputBegan:connect(DealWithInput)
	UserInputService.InputChanged:connect(DealWithInput)
	UserInputService.InputEnded:connect(DealWithInput)
	
	
	
	--[[Drivetrain Initialize]]
	
	local Drive={}
	
	--Power Front Wheels
		if _Tune.Config == "FWD" or _Tune.Config == "AWD" then for i,v in pairs(car.Wheels:GetChildren()) do if v.Name=="FL" or v.Name=="FR" or v.Name=="F" then table.insert(Drive,v) end end end
	
	--Power Rear Wheels
		if _Tune.Config == "RWD" or _Tune.Config == "AWD" then for i,v in pairs(car.Wheels:GetChildren()) do if v.Name=="RL" or v.Name=="RR" or v.Name=="R" then table.insert(Drive,v) end end end
	
	--Determine Wheel Size
	local wDia = 0 for i,v in pairs(Drive) do if v.Size.x>wDia then wDia = v.Size.x end end
	
	--Pre-Toggled PBrake
	for i,v in pairs(car.Wheels:GetChildren()) do if math.abs(v["#BV"].MotorMaxTorque-PBrakeForce)<1 then _PBrake=true end end
	
	--[[Throttle and Brake Input Smoothening]]
	
	function Inputs(dt)
		local deltaTime = (60/(1/dt))
		if _InThrot <= _IThrot then
			_InThrot = math.min(_IThrot,_InThrot+(_Tune.ThrotAccel*deltaTime))
		else
			_InThrot = math.max(_IThrot,_InThrot-(_Tune.ThrotDecel*deltaTime))
		end
		if _InBrake <= _IBrake then
			_InBrake = math.min(_IBrake,_InBrake+(_Tune.BrakeAccel*deltaTime))
		else
			_InBrake = math.max(_IBrake,_InBrake-(_Tune.BrakeDecel*deltaTime))
		end
	end
	
	--[[Steering]]
	
	if _Tune.SteeringType == 'New' then--luaint edit
		SteerOuter = (_Tune.LockToLock*180)/_Tune.SteerRatio
		SteerInner = math.min(SteerOuter-(SteerOuter*(1-_Tune.Ackerman)),SteerOuter*1.2)
	end
	
	function Steering(dt)
		local deltaTime = (60/(1/dt))
		--Mouse Steer
		if _MSteer then
			local msWidth = math.max(1,mouse.ViewSizeX*_Tune.Peripherals.MSteerWidth/200)
			local mdZone = _Tune.Peripherals.MSteerDZone/100
			local mST = ((mouse.X-mouse.ViewSizeX/2)/msWidth)
			if math.abs(mST)<=mdZone then
				_GSteerT = 0
			else
				_GSteerT = (math.max(math.min((math.abs(mST)-mdZone),(1-mdZone)),0)/(1-mdZone))^_Tune.MSteerExp * (mST / math.abs(mST))
			end
		end
		
		--Interpolate Steering
		if _GSteerC < _GSteerT then
			if _GSteerC<0 then
				_GSteerC = math.min(_GSteerT,_GSteerC+(_Tune.ReturnSpeed*deltaTime))
			else
				_GSteerC = math.min(_GSteerT,_GSteerC+(_Tune.SteerSpeed*deltaTime))
			end
		else
			if _GSteerC>0 then
				_GSteerC = math.max(_GSteerT,_GSteerC-(_Tune.ReturnSpeed*deltaTime))
			else
				_GSteerC = math.max(_GSteerT,_GSteerC-(_Tune.SteerSpeed*deltaTime))
			end
		end
		
		--Steer Decay Multiplier
		local sDecay = (1-math.min(car.DriveSeat.Velocity.Magnitude/_Tune.SteerDecay,1-(_Tune.MinSteer/100)))
		local rsDecay = (1-math.min(car.DriveSeat.Velocity.Magnitude/_Tune.RSteerDecay,1-(_Tune.MinSteer/100)))
		
		--Apply Steering
		for i,v in pairs(car.Wheels:GetChildren()) do
			if v.Name=="F" then
				v.Arm.Steer.CFrame=car.Wheels.F.Base.CFrame*CFrame.Angles(0,-math.rad(_GSteerC*_Tune.SteerInner*sDecay),0)
			elseif v.Name=="FL" then
				if _GSteerC>= 0 then
					v.Arm.Steer.CFrame=car.Wheels.FL.Base.CFrame*CFrame.Angles(0,-math.rad(_GSteerC*SteerOuter*sDecay),0)--luaint edit
				else
					v.Arm.Steer.CFrame=car.Wheels.FL.Base.CFrame*CFrame.Angles(0,-math.rad(_GSteerC*SteerInner*sDecay),0)--luaint edit
				end	
			elseif v.Name=="FR" then
				if _GSteerC>= 0 then
					v.Arm.Steer.CFrame=car.Wheels.FR.Base.CFrame*CFrame.Angles(0,-math.rad(_GSteerC*SteerInner*sDecay),0)--luaint edit
				else
					v.Arm.Steer.CFrame=car.Wheels.FR.Base.CFrame*CFrame.Angles(0,-math.rad(_GSteerC*SteerOuter*sDecay),0)--luaint edit
			end
			elseif v.Name=='R' then
				if _Tune.FWSteer=='None' then
				elseif _Tune.FWSteer=='Static' then
					v.Arm.Steer.CFrame=car.Wheels.R.Base.CFrame*CFrame.Angles(0,math.rad(_GSteerC*RSteerInner*rsDecay*math.min(0,1-(car.DriveSeat.Velocity.Magnitude/_Tune.RSteerSpeed))),0)--luaint edit
				elseif _Tune.FWSteer=='Speed' then
					v.Arm.Steer.CFrame=car.Wheels.R.Base.CFrame*CFrame.Angles(0,-math.rad(_GSteerC*RSteerInner*rsDecay*math.min(1,(car.DriveSeat.Velocity.Magnitude/_Tune.RSteerSpeed))),0)--luaint edit
				elseif _Tune.FWSteer=='Both' then
					v.Arm.Steer.CFrame=car.Wheels.R.Base.CFrame*CFrame.Angles(0,math.rad(_GSteerC*RSteerInner*rsDecay*math.max(-1,1-(car.DriveSeat.Velocity.Magnitude/_Tune.RSteerSpeed))),0)--luaint edit
				end
			elseif v.Name=='RL' then
				if _Tune.FWSteer=='None' then
				elseif _Tune.FWSteer=='Static' then
					if _GSteerC>= 0 then
						v.Arm.Steer.CFrame=car.Wheels.RL.Base.CFrame*CFrame.Angles(0,math.rad(_GSteerC*RSteerOuter*rsDecay*math.min(0,1-(car.DriveSeat.Velocity.Magnitude/_Tune.RSteerSpeed))),0)--luaint edit
					else
						v.Arm.Steer.CFrame=car.Wheels.RL.Base.CFrame*CFrame.Angles(0,math.rad(_GSteerC*RSteerInner*rsDecay*math.min(0,1-(car.DriveSeat.Velocity.Magnitude/_Tune.RSteerSpeed))),0)--luaint edit
					end
				elseif _Tune.FWSteer=='Speed' then
					if _GSteerC>= 0 then
						v.Arm.Steer.CFrame=car.Wheels.RL.Base.CFrame*CFrame.Angles(0,-math.rad(_GSteerC*RSteerOuter*rsDecay*math.min(1,(car.DriveSeat.Velocity.Magnitude/_Tune.RSteerSpeed))),0)--luaint edit
					else
						v.Arm.Steer.CFrame=car.Wheels.RL.Base.CFrame*CFrame.Angles(0,-math.rad(_GSteerC*RSteerInner*rsDecay*math.min(1,(car.DriveSeat.Velocity.Magnitude/_Tune.RSteerSpeed))),0)--luaint edit
					end
				elseif _Tune.FWSteer=='Both' then
					if _GSteerC>= 0 then
						v.Arm.Steer.CFrame=car.Wheels.RL.Base.CFrame*CFrame.Angles(0,math.rad(_GSteerC*RSteerOuter*rsDecay*math.max(-1,1-(car.DriveSeat.Velocity.Magnitude/_Tune.RSteerSpeed))),0)--luaint edit
					else
						v.Arm.Steer.CFrame=car.Wheels.RL.Base.CFrame*CFrame.Angles(0,math.rad(_GSteerC*RSteerInner*rsDecay*math.max(-1,1-(car.DriveSeat.Velocity.Magnitude/_Tune.RSteerSpeed))),0)--luaint edit
					end
				end
			elseif v.Name=='RR' then
				if _Tune.FWSteer=='None' then
				elseif _Tune.FWSteer=='Static' then
					if _GSteerC>= 0 then
						v.Arm.Steer.CFrame=car.Wheels.RR.Base.CFrame*CFrame.Angles(0,math.rad(_GSteerC*RSteerInner*rsDecay*math.min(0,1-(car.DriveSeat.Velocity.Magnitude/_Tune.RSteerSpeed))),0)--luaint edit
					else
						v.Arm.Steer.CFrame=car.Wheels.RR.Base.CFrame*CFrame.Angles(0,math.rad(_GSteerC*RSteerOuter*rsDecay*math.min(0,1-(car.DriveSeat.Velocity.Magnitude/_Tune.RSteerSpeed))),0)--luaint edit
					end
				elseif _Tune.FWSteer=='Speed' then
					if _GSteerC>= 0 then
						v.Arm.Steer.CFrame=car.Wheels.RR.Base.CFrame*CFrame.Angles(0,-math.rad(_GSteerC*RSteerInner*rsDecay*math.min(1,(car.DriveSeat.Velocity.Magnitude/_Tune.RSteerSpeed))),0)--luaint edit
					else
						v.Arm.Steer.CFrame=car.Wheels.RR.Base.CFrame*CFrame.Angles(0,-math.rad(_GSteerC*RSteerOuter*rsDecay*math.min(1,(car.DriveSeat.Velocity.Magnitude/_Tune.RSteerSpeed))),0)--luaint edit
					end
				elseif _Tune.FWSteer=='Both' then
					if _GSteerC>= 0 then
						v.Arm.Steer.CFrame=car.Wheels.RR.Base.CFrame*CFrame.Angles(0,math.rad(_GSteerC*RSteerInner*rsDecay*math.max(-1,1-(car.DriveSeat.Velocity.Magnitude/_Tune.RSteerSpeed))),0)--luaint edit
					else
						v.Arm.Steer.CFrame=car.Wheels.RR.Base.CFrame*CFrame.Angles(0,math.rad(_GSteerC*RSteerOuter*rsDecay*math.max(-1,1-(car.DriveSeat.Velocity.Magnitude/_Tune.RSteerSpeed))),0)--luaint edit
					end
				end
			end
		end
	end
	
	
	
	--[[Engine]]
	
	local fFD = _Tune.FinalDrive*_Tune.FDMult
	local fFDr = fFD*30/math.pi
	local cGrav = workspace.Gravity*_Tune.InclineComp/32.2
	local wDRatio = wDia*math.pi/60
	local cfWRot = CFrame.Angles(math.pi/2,-math.pi/2,0)
	local cfYRot = CFrame.Angles(0,math.pi,0)
	
	--Electric Only Setup
	
	if not _Tune.Engine and _Tune.Electric then 
		_Tune.Redline = _Tune.E_Redline 
		_Tune.PeakRPM = _Tune.E_Trans2 
		_Tune.Turbochargers = 0
		_Tune.Superchargers = 0
		_Tune.Clutch = false 
		_Tune.IdleRPM = 0 
		_Tune.ClutchType = "Clutch" 
		_Tune.AutoShiftType = "DCT" 
		_Tune.ShiftUpTime = 0.1 
		_Tune.ShiftDnTime = 0.1 
	end
	
	--Aspiration Setup
	
	_TCount = _Tune.Turbochargers
	_TPsi = _Tune.T_Boost*_Tune.Turbochargers
	
	_SCount = _Tune.Superchargers
	_SPsi = _Tune.S_Boost*_Tune.Superchargers
	
	--Engine Curve
	
	local HP=_Tune.Horsepower/100
	local HP_T=((_Tune.Horsepower*((_TPsi)*(_Tune.T_Efficiency/10))/7.5)/2)/100
	local HP_S=((_Tune.Horsepower*((_SPsi)*(_Tune.S_Efficiency/10))/7.5)/2)/100
	
	local Peak=_Tune.PeakRPM/1000
	local Sharpness=_Tune.PeakSharpness
	local CurveMult=_Tune.CurveMult
	local EQ=_Tune.EqPoint/1000
	
	function CurveN(RPM)
		RPM=RPM/1000
		return ((-(RPM-Peak)^2)*math.min(HP/(Peak^2),CurveMult^(Peak/HP))+HP)*(RPM-((RPM^Sharpness)/(Sharpness*Peak^(Sharpness-1))))
	end
	local PeakCurveN = CurveN(_Tune.PeakRPM)
	
	function CurveT(RPM)
		RPM=RPM/1000
		return ((-(RPM-Peak)^2)*math.min(HP_T/(Peak^2),CurveMult^(Peak/HP_T))+HP_T)*(RPM-((RPM^Sharpness)/(Sharpness*Peak^(Sharpness-1))))
	end
	local PeakCurveT = CurveT(_Tune.PeakRPM)
	
	function CurveS(RPM)
		RPM=RPM/1000
		return ((-(RPM-Peak)^2)*math.min(HP_S/(Peak^2),CurveMult^(Peak/HP_S))+HP_S)*(RPM-((RPM^Sharpness)/(Sharpness*Peak^(Sharpness-1))))
	end
	local PeakCurveS = CurveS(_Tune.PeakRPM)
	
	--Electric Curve
	
	local EHP=_Tune.E_Horsepower/100
	local ETQ=_Tune.E_Torque/100
	local ETrans1=_Tune.E_Trans1/1000
	local ETrans2=_Tune.E_Trans2/1000
	local ELimit=_Tune.E_Redline/1000 
	
	function elecHP(RPM)
		RPM=RPM/1000
		local retVal=1e-9
		if RPM<=ETrans1 then
			retVal=((((RPM/ETrans1)^_Tune.EH_FrontMult)/(1/EHP))*(RPM/ETrans1))+((((RPM/ETrans1)^(1/_Tune.EH_FrontMult))/(1/EHP))*(1-(RPM/ETrans1)))
		elseif ETrans1<RPM and RPM<ETrans2 then
			retVal=EHP
		elseif ETrans2<=RPM then
			retVal=EHP-(((RPM-ETrans2)/(ELimit-ETrans2))^_Tune.EH_EndMult)/(1/(EHP*(_Tune.EH_EndPercent/100)))
		else
			error( "\n\t [AC6C]: Drive initialization failed!"
			.."\n\t    An unknown error occured when initializing electric horsepower."
			.."\n\t    Please send a screenshot of this message to Avxnturador."
			.."\n\t    R: "..RPM..", T1: "..ETrans1", T2: "..ETrans2", L: "..ELimit".")
		end
		return retVal
	end
	
	function elecTQ(RPM)
		RPM=RPM/1000
		local retVal=1e-9
		if RPM<ETrans1 then
			retVal=ETQ
		elseif ETrans1<=RPM then
			retVal=ETQ-(((RPM-ETrans1)/(ELimit-ETrans1))^_Tune.ET_EndMult)/(1/(ETQ*(_Tune.ET_EndPercent/100)))
		else
			error( "\n\t [AC6C]: Drive initialization failed!"
			.."\n\t    An unknown error occured when initializing electric torque."
			.."\n\t    Please send a screenshot of this message to Avxnturador."
			.."\n\t    R: "..RPM..", T1: "..ETrans1", T2: "..ETrans2", L: "..ELimit".")
		end
		return retVal
	end
	
	--Plot Current Naturally Aspirated Engine Horsepower
	function GetNCurve(x,gear)
		local hp=(math.max(CurveN(x)/(PeakCurveN/HP),0))*100
		return hp,((hp*(EQ/x))*_Tune.Ratios[gear+2]*fFD*hpScaling)*1000
	end
	
	--Plot Current Electric Horsepower
	function GetECurve(x,gear)
		local hp=(math.max(elecHP(x),0))*100
		local tq=(math.max(elecTQ(x),0))*100
		if gear~=0 then
			return hp,math.max(tq*_Tune.Ratios[gear+2]*fFD*hpScaling,0)
		else
			return 0,0
		end
	end
	
	--Plot Current Turbocharger Horsepower 
	function GetTCurve(x,gear)
		local hp=(math.max(CurveT(x)/(PeakCurveT/HP_T),0))*100
		return hp,((hp*(EQ/x))*_Tune.Ratios[gear+2]*fFD*hpScaling)*1000
	end	
	
	--Plot Current Supercharger Horsepower 
	function GetSCurve(x,gear)
		local hp=(math.max(CurveS(x)/(PeakCurveS/HP_S),0))*100
		return hp,((hp*(EQ/x))*_Tune.Ratios[gear+2]*fFD*hpScaling)*1000
	end	
	
	
	--Output Cache	
	local NCache = {}
	local ECache = {}
	local TCache = {}
	local SCache = {}
	
	for gear,ratio in pairs(_Tune.Ratios) do
		local nhpPlot = {}
		local ehpPlot = {}
		local thpPlot = {}
		local shpPlot = {}
		for rpm = 0, math.ceil((_Tune.Redline+100)/100) do
			local ntqPlot = {}
			local etqPlot = {}
			local ttqPlot = {}
			local stqPlot = {}
			if rpm~=0 then
				if _Tune.Engine then
					ntqPlot.Horsepower,ntqPlot.Torque = GetNCurve(rpm*100,gear-2)
					if _TCount~=0 then
						ttqPlot.Horsepower,ttqPlot.Torque = GetTCurve(rpm*100,gear-2)
					else
						ttqPlot.Horsepower,ttqPlot.Torque = 0,0
					end
					if _SCount~=0 then
						stqPlot.Horsepower,stqPlot.Torque = GetSCurve(rpm*100,gear-2)
					else
						stqPlot.Horsepower,stqPlot.Torque = 0,0
					end
				else
					ntqPlot.Horsepower,ntqPlot.Torque = 0,0
					ttqPlot.Horsepower,ttqPlot.Torque = 0,0
					stqPlot.Horsepower,stqPlot.Torque = 0,0
				end
				if _Tune.Electric then
					etqPlot.Horsepower,etqPlot.Torque = GetECurve(rpm*100,gear-2)
				else
					etqPlot.Horsepower,etqPlot.Torque = 0,0
				end
			else
				ntqPlot.Horsepower,ntqPlot.Torque = 0,0
				etqPlot.Horsepower,etqPlot.Torque = 0,0
				ttqPlot.Horsepower,ttqPlot.Torque = 0,0
				stqPlot.Horsepower,stqPlot.Torque = 0,0
			end
			if _Tune.Engine then
				nhp,ntq = GetNCurve((rpm+1)*100,gear-2)
				if _TCount~=0 then
					thp,ttq = GetTCurve((rpm+1)*100,gear-2)
				else
					thp,ttq = 0,0
				end
				if _SCount~=0 then
					shp,stq = GetSCurve((rpm+1)*100,gear-2)
				else
					shp,stq = 0,0
				end
			else
				nhp,ntq = 0,0
				thp,ttq = 0,0
				shp,stq = 0,0
			end
			if _Tune.Electric then
				ehp,etq = GetECurve((rpm+1)*100,gear-2)
			else
				ehp,etq = 0,0
			end
			ntqPlot.HpSlope,ntqPlot.TqSlope = (nhp-ntqPlot.Horsepower),(ntq-ntqPlot.Torque)
			etqPlot.HpSlope,etqPlot.TqSlope = (ehp-etqPlot.Horsepower),(etq-etqPlot.Torque)
			ttqPlot.HpSlope,ttqPlot.TqSlope = (thp-ttqPlot.Horsepower),(ttq-ttqPlot.Torque)
			stqPlot.HpSlope,stqPlot.TqSlope = (shp-stqPlot.Horsepower),(stq-stqPlot.Torque)
			nhpPlot[rpm] = ntqPlot
			ehpPlot[rpm] = etqPlot
			thpPlot[rpm] = ttqPlot
			shpPlot[rpm] = stqPlot
		end
		table.insert(NCache,nhpPlot)
		table.insert(ECache,ehpPlot)
		table.insert(TCache,thpPlot)
		table.insert(SCache,shpPlot)
	end
	
	--Powertrain
	wait()
	
	--Automatic Transmission
	function Auto()
		local maxSpin=0
		for i,v in pairs(Drive) do if v.RotVelocity.Magnitude>maxSpin then maxSpin = v.RotVelocity.Magnitude end end
		if _IsOn then
			if _Tune.AutoShiftVers == "Old" and _CGear == 0 then _CGear = 1 _ClPressing = false end
			if _CGear >= 1 then
				if (_CGear==1 and _InBrake > 0 and car.DriveSeat.Velocity.Magnitude < 5) and _Tune.AutoShiftVers == "Old" then
					_CGear = -1 _ClPressing = false
				elseif car.DriveSeat.Velocity.Magnitude > 5 then
					if _Tune.AutoShiftMode == "RPM" then
						if _RPM>(_Tune.PeakRPM+_Tune.AutoUpThresh) then
							if not _ShiftUp and not _Shifting then _ShiftUp = true end
						elseif math.max(math.min(maxSpin*_Tune.Ratios[_CGear+1]*fFDr,_Tune.Redline+100),_Tune.IdleRPM)<(_Tune.PeakRPM-_Tune.AutoDownThresh) and _CGear>1 then
							if not _ShiftDn and not _Shifting then _ShiftDn = true end 
						end
					else
						if car.DriveSeat.Velocity.Magnitude > math.ceil(wDRatio*(_Tune.PeakRPM+_Tune.AutoUpThresh)/_Tune.Ratios[_CGear+2]/fFD) then
							if not _ShiftUp and not _Shifting then _ShiftUp = true end
						elseif car.DriveSeat.Velocity.Magnitude < math.ceil(wDRatio*(_Tune.PeakRPM-_Tune.AutoDownThresh)/_Tune.Ratios[_CGear+1]/fFD) and _CGear>1 then
							if not _ShiftDn and not _Shifting then _ShiftDn = true end
						end
					end
				end
			else
				if (_InThrot-(_Tune.IdleThrottle/100) > 0 and car.DriveSeat.Velocity.Magnitude < 5) and _Tune.AutoShiftVers == "Old" then
					_CGear = 1 _ClPressing = false
				end
			end
		end 
	end
	
	function Gear()
		local maxSpin=0
		for i,v in pairs(Drive) do if v.RotVelocity.Magnitude>maxSpin then maxSpin = v.RotVelocity.Magnitude end end
		if _ShiftUp and not _Shifting then
			if (_TMode == "Manual" and not _ClPressing) or (_TMode == "Manual" and _Tune.ClutchRel and (_InThrot-(_Tune.IdleThrottle/100)>0)) or _CGear == #_Tune.Ratios-2 or (_TMode ~= "Manual" and not _IsOn) then _ShiftUp = false return end
			local NextGear = math.min(_CGear+3,#_Tune.Ratios)
			if _TMode~="Manual" then
				_Shifting = true
				if _CGear>0 then 
					if _Tune.AutoShiftType=="DCT" then 
						wait(_Tune.ShiftUpTime)
					elseif _Tune.AutoShiftType=="Rev" then
						repeat wait() until _RPM<=math.max(math.min(maxSpin*_Tune.Ratios[NextGear]*fFDr,_Tune.Redline-_Tune.RevBounce),_Tune.IdleRPM) or not _IsOn or _ShiftDn 
					end
				end
			end
			_ShiftUp = false
			_Shifting = false
			if _TMode ~= "Manual" and not _IsOn then return end
			_CGear = math.min(_CGear+1,#_Tune.Ratios-2)
			if _TMode ~= "Manual" or (_TMode == "Manual" and _CGear == 1) and _IsOn then _ClPressing = false end
		end
		if _ShiftDn and not _Shifting then
			if (_TMode == "Manual" and not _ClPressing) or _CGear == -1 or (_TMode ~= "Manual" and not _IsOn) then _ShiftDn = false return end
			local PrevGear = math.min(_CGear+1,#_Tune.Ratios)
			if _TMode~="Manual" then
				_Shifting = true
				if _CGear>1 then 
					if _Tune.AutoShiftType=="DCT" then 
						wait(_Tune.ShiftDnTime)
					elseif _Tune.AutoShiftType=="Rev" then
						repeat wait() until _RPM>=math.max(math.min(maxSpin*_Tune.Ratios[PrevGear]*fFDr,_Tune.Redline-_Tune.RevBounce),_Tune.IdleRPM) or not _IsOn or _ShiftUp
					end
				end
			end
			_ShiftDn = false
			_Shifting = false
			if _TMode ~= "Manual" and not _IsOn then return end
			_CGear = math.max(_CGear-1,-1)
			if _TMode ~= "Manual" or (_TMode == "Manual" and _CGear == -1) and _IsOn then _ClPressing = false end
		end
	end
	
	local _GoalRPM=0
	local tqTCS = 1
	local sthrot = 0
	local _StallOK = false
	local ticc = tick()
	--Apply Power
	function Engine(dt)
		local deltaTime = (60/(1/dt))
		--Neutral Gear
		if ((_CGear == 0 or _Shifting) and _IsOn) then 
			_ClPressing = true
			_Clutch = 1
			_StallOK = false
		end
		
		local revMin = _Tune.IdleRPM 
		local goalMin = _Tune.IdleRPM 
		local goalMax = _Tune.Redline
		if _Tune.Stall and _Tune.Clutch then revMin = 0 end
		
		if _Shifting and _ShiftUp then 
			_GThrot = 0
		elseif _Shifting and _ShiftDn then
			_GThrot = (_Tune.ShiftThrot/100)
		else
			if (_Tune.AutoShiftVers == "Old" and _CGear==-1 and _TMode=="Auto") then
				_GThrot = _InBrake
			else
				_GThrot = _InThrot
			end
		end
		
		if (_Tune.AutoShiftVers == "Old" and _CGear==-1 and _TMode=="Auto") then
			_GBrake = _InThrot-(_Tune.IdleThrottle/100)
		else
			_GBrake = _InBrake
		end
		
		if not _IsOn then 
			ticc = tick()
			revMin = 0 
			goalMin = 0
			_GThrot = _Tune.IdleThrottle/100
			if _TMode~="Manual" then 
				_CGear = 0 
				_ClPressing = true 
				_Clutch = 1 
			end
		end
		
		if ((_ClPressing and _CGear == 0) or (_PlayerClutch and _CGear ~= 0)) and _Tune.NeutralLimit then
			if (_CGear == 0 and not _Tune.LimitClutch) or _Tune.LimitClutch then
				goalMax = _Tune.NeutralRevRPM
			end
		end
		
		--Determine RPM
		local maxSpin=0
		local maxCount=0
		local revThrot=_GThrot
		for i,v in pairs(Drive) do maxSpin = maxSpin + v.RotVelocity.Magnitude maxCount = maxCount + 1 end
		maxSpin=maxSpin/maxCount
		
		if _GoalRPM>goalMax+100 then 
			revThrot = _Tune.IdleThrottle/100
		end
		
		if _Tune.Engine or _Tune.Electric then
			_GoalRPM = math.clamp((_RPM-_Tune.RevDecay*deltaTime)+((_Tune.RevDecay+_Tune.RevAccel)*revThrot*deltaTime),goalMin,_Tune.Redline+100)
		end
		
		if _GoalRPM>_Tune.Redline then 
			if _CGear<#_Tune.Ratios-2 then
				_GoalRPM = _GoalRPM-_Tune.RevBounce
			else
				_GoalRPM = _GoalRPM-_Tune.RevBounce*.5
			end
		end
		
		local _WheelRPM = maxSpin*_Tune.Ratios[_CGear+2]*fFDr
		
		if _Tune.Clutch then
			if script.Parent.Values.AutoClutch.Value and _IsOn then
				if _Tune.ClutchType == "Clutch" then
					if _ClPressing then _ClutchKick = 1 end
					_ClutchKick = _ClutchKick*(_Tune.ClutchEngage/100)		
					local ClRPMInfluence = math.max((_RPM-_Tune.IdleRPM)*_Tune.ClutchRPMMult/(_Tune.Redline-_Tune.IdleRPM),0)
					if _Tune.ClutchMode == "New" then ClRPMInfluence = 0 end
					_ClutchModulate = math.min(((((script.Parent.Values.Velocity.Value.Magnitude/_Tune.SpeedEngage)/math.abs(_CGear)) + ClRPMInfluence) - _ClutchKick), 1)
				elseif _Tune.ClutchType == "CVT" or (_Tune.ClutchType == "TorqueConverter" and _Tune.TQLock) then
					if (_GThrot-(_Tune.IdleThrottle/100)==0 and script.Parent.Values.Velocity.Value.Magnitude<_Tune.SpeedEngage) or (_GThrot-(_Tune.IdleThrottle/100)~=0 and (_RPM < _Tune.RPMEngage and _WheelRPM < _Tune.RPMEngage)) then
						_ClutchModulate = math.min(_ClutchModulate*(_Tune.ClutchEngage/100), 1)
					else
						_ClutchModulate = math.min(_ClutchModulate*(_Tune.ClutchEngage/100)+(1-(_Tune.ClutchEngage/100)), 1)
					end
				elseif _Tune.ClutchType == "TorqueConverter" and not _Tune.TQLock then
					_ClutchModulate = math.min((_RPM/_Tune.Redline)*0.7, 1)
				end
				if not _ClPressing then _Clutch = math.min(1-_ClutchModulate,1) else _Clutch = 1 end
				_StallOK = (_Clutch<=0.01) or _StallOK
			else
				_StallOK = _Tune.Stall
				_Clutch = script.Parent.Values.Clutch.Value
			end
		else
			_StallOK = false
			if not _ClPressing and not _Shifting then _Clutch = 0 else _Clutch = 1 end
		end
		
		local aRPM = math.max(math.min((_GoalRPM*_Clutch) + (_WheelRPM*(1-_Clutch)),_Tune.Redline+100),revMin)
		local clutchP = math.min(math.abs(aRPM-_RPM)/(_Tune.Flywheel*deltaTime),.9)
		if _ClPressing then clutchP = 0 end
		_RPM = _RPM*clutchP  +  aRPM*(1-clutchP)
		
		if _RPM<=(_Tune.IdleRPM/4) and _StallOK and (tick()-ticc>=0.2) then script.Parent.IsOn.Value = not _Tune.Stall end
		
		--Rev Limiter
		_spLimit = (_Tune.Redline+100)/(fFDr*_Tune.Ratios[_CGear+2])
		if _RPM>_Tune.Redline then 
			if _CGear<#_Tune.Ratios-2 then
				_RPM = _RPM-_Tune.RevBounce
			else
				_RPM = _RPM-_Tune.RevBounce*.5
			end
		end
		
		--Aspiration
		local TPsi = _TPsi/_TCount
		
		local _BThrot = _GThrot
		
		if _Tune.Engine then
			if _TCount~=0 then
				_TBoost = _TBoost + ((((((_HP*(_BThrot*1.2)/_Tune.Horsepower)/8)-(((_TBoost/TPsi*(TPsi/15)))))*((8/(_Tune.T_Size/(deltaTime)))*2))/TPsi)*15)
				if _TBoost < 0.05 then _TBoost = 0.05 elseif _TBoost > 2 then _TBoost = 2 end
			else
				_TBoost = 0
			end
			if _SCount~=0 then
				if _BThrot>sthrot then
					sthrot=math.min(_BThrot,sthrot+_Tune.S_Sensitivity*deltaTime)
				elseif _BThrot<sthrot then
					sthrot=math.max(_BThrot,sthrot-_Tune.S_Sensitivity*deltaTime)
				end
				_SBoost = (_RPM/_Tune.Redline)*(.5+(1.5*sthrot))
			else
				_SBoost = 0
			end
		else
			_TBoost = 0
			_SBoost = 0
		end
		
		--Torque calculations
		if _Tune.Engine then
			local cTq = NCache[_CGear+2][math.floor(math.min(_Tune.Redline,math.max(0,_RPM))/100)]
			_NH = cTq.Horsepower+(cTq.HpSlope*(((_RPM-math.floor(_RPM/100))/100)%1))
			_NT = cTq.Torque+(cTq.TqSlope*(((_RPM-math.floor(_RPM/100))/100)%1))
			if _TCount~=0 then
				local tTq = TCache[_CGear+2][math.floor(math.min(_Tune.Redline,math.max(0,_RPM))/100)]
				_TH = (tTq.Horsepower+(tTq.HpSlope*(((_RPM-math.floor(_RPM/100))/100)%1)))*(_TBoost/2)
				_TT = (tTq.Torque+(tTq.TqSlope*(((_RPM-math.floor(_RPM/100))/100)%1)))*(_TBoost/2)
			else
				_TH,_TT = 0,0
			end
			if _SCount~=0 then
				local sTq = SCache[_CGear+2][math.floor(math.min(_Tune.Redline,math.max(0,_RPM))/100)]
				_SH = (sTq.Horsepower+(sTq.HpSlope*(((_RPM-math.floor(_RPM/100))/100)%1)))*(_SBoost/2)
				_ST = (sTq.Torque+(sTq.TqSlope*(((_RPM-math.floor(_RPM/100))/100)%1)))*(_SBoost/2)
			else
				_SH,_ST = 0,0
			end
			_BH = _TH+_SH
			_BT = _TT+_ST
		else
			_NH,_NT = 0,0
			_TH,_TT = 0,0
			_SH,_ST = 0,0
			_BH,_BT = 0,0
		end
		
		if _Tune.Electric and _CGear~=0 then
			local eTq = ECache[_CGear+2][math.floor(math.min(_Tune.Redline,math.max(100,_RPM))/100)]
			_EH = eTq.Horsepower+(eTq.HpSlope*(((_RPM-math.floor(_RPM/100))/100)%1))
			_ET = eTq.Torque+(eTq.TqSlope*(((_RPM-math.floor(_RPM/100))/100)%1))
		else
			_EH,_ET = 0,0
		end
		
		_HP = _NH + _BH + _EH
		_OutTorque = _NT + _BT + _ET
		
		local iComp =(car.DriveSeat.CFrame.lookVector.y)*cGrav
		if _CGear==-1 then iComp=-iComp end
		_OutTorque = _OutTorque*math.max(1,(1+iComp))
		
		--Average Rotational Speed Calculation
		local fwspeed=0
		local fwcount=0
		local rwspeed=0
		local rwcount=0
		
		for i,v in pairs(car.Wheels:GetChildren()) do
			if v.Name=="FL" or v.Name=="FR" or v.Name == "F" then
				fwspeed=fwspeed+v.RotVelocity.Magnitude
				fwcount=fwcount+1
			elseif v.Name=="RL" or v.Name=="RR" or v.Name == "R" then
				rwspeed=rwspeed+v.RotVelocity.Magnitude
				rwcount=rwcount+1
			end
		end
		fwspeed=fwspeed/fwcount
		rwspeed=rwspeed/rwcount	
		local cwspeed=(fwspeed+rwspeed)/2
		
		--Update Wheels
		for i,v in pairs(car.Wheels:GetChildren()) do
			--Reference Wheel Orientation
			local Ref=(CFrame.new(v.Position-((v.Arm.CFrame*cfWRot).lookVector),v.Position)*cfYRot).lookVector
			local aRef=1
			local diffMult=1
			local RRdiffMult=1
			local RLdiffMult=1
			local FRdiffMult=1
			local FLdiffMult=1
			if v.Name=="FL" or v.Name=="RL" then aRef=-1 end
			
			--Differential/Torque-Vectoring
			if _Tune.DifferentialType=='Old' then
				if v.Name=="FL" or v.Name=="FR" then
					diffMult=math.max(0,math.min(1,1+((((v.RotVelocity.Magnitude-fwspeed)/fwspeed)/(math.max(_Tune.FDiffSlipThres,1)/100))*((_Tune.FDiffLockThres-50)/50))))
					if _Tune.Config == "AWD" then
						diffMult=math.max(0,math.min(1,diffMult*(1+((((fwspeed-cwspeed)/cwspeed)/(math.max(_Tune.CDiffSlipThres,1)/100))*((_Tune.CDiffLockThres-50)/50)))))
					end
				elseif v.Name=="RL" or v.Name=="RR" then
					diffMult=math.max(0,math.min(1,1+((((v.RotVelocity.Magnitude-rwspeed)/rwspeed)/(math.max(_Tune.RDiffSlipThres,1)/100))*((_Tune.RDiffLockThres-50)/50))))
					if _Tune.Config == "AWD" then
						diffMult=math.max(0,math.min(1,diffMult*(1+((((rwspeed-cwspeed)/cwspeed)/(math.max(_Tune.CDiffSlipThres,1)/100))*((_Tune.CDiffLockThres-50)/50)))))
					end
				end
			else
				if v.Name=="FR" then
					local avg=((v.RotVelocity.Magnitude/car.Wheels.FL.RotVelocity.Magnitude)-1)*(_Tune.FDiffPreload/10)
					FRdiffMult=math.ceil(math.max(0,math.min(2,1-( ((_Tune.FDiffPower/100)*avg*_GThrot) + ((_Tune.FDiffCoast/100)*avg*(1-_GThrot)))))*100)/100
					FLdiffMult=2-FRdiffMult
				elseif v.Name=="FL" then
					local avg=((v.RotVelocity.Magnitude/car.Wheels.FR.RotVelocity.Magnitude)-1)*(_Tune.FDiffPreload/10)
					FLdiffMult=math.ceil(math.max(0,math.min(2,1-( ((_Tune.FDiffPower/100)*avg*_GThrot) + ((_Tune.FDiffCoast/100)*avg*(1-_GThrot)))))*100)/100
					FRdiffMult=2-FLdiffMult
				elseif v.Name=="RR" then
					local avg=((v.RotVelocity.Magnitude/car.Wheels.RL.RotVelocity.Magnitude)-1)*(_Tune.RDiffPreload/10)
					RRdiffMult=math.ceil(math.max(0,math.min(2,1-( ((_Tune.RDiffPower/100)*avg*_GThrot) + ((_Tune.RDiffCoast/100)*avg*(1-_GThrot)))))*100)/100
					RLdiffMult=2-RRdiffMult
				elseif v.Name=="RL" then
					local avg=((v.RotVelocity.Magnitude/car.Wheels.RR.RotVelocity.Magnitude)-1)*(_Tune.RDiffPreload/10)
					RLdiffMult=math.ceil(math.max(0,math.min(2,1-( ((_Tune.RDiffPower/100)*avg*_GThrot) + ((_Tune.RDiffCoast/100)*avg*(1-_GThrot)))))*100)/100
					RRdiffMult=2-RLdiffMult
				end
			end
			
			_TCSActive = false
			_ABSActive = false
			--Output
		
			--Apply Power
			local on=1
			if not script.Parent.IsOn.Value then on=0 end
			local throt = _GThrot
			local brake = _GBrake
			local clutch=1
			if _ClPressing then clutch=0 end
			local tq = _OutTorque
			
			--Apply ABS
			local tqABS = 1
			if _ABS and brake>0 and math.abs(v.RotVelocity.Magnitude*(v.Size.x/2) - v.Velocity.Magnitude)-_Tune.ABSThreshold>0 then
				tqABS = 0
			end
			_ABSActive = (tqABS<1)
		
			local PBrakeV=0
			if _PBrake==true then PBrakeV=1 else PBrakeV=0 end
			
			local driven = false
			for _,a in pairs(Drive) do if a==v then driven = true end end
			if driven then
				--Apply AWD Vectoring
				if _Tune.Config == "AWD" then
					local bias = (_Tune.TorqueVector+1)/2
					if string.find(v.Name,"F") then
						tq = tq*(1-bias)
					elseif string.find(v.Name,"R") then
						tq = tq*bias
					end
				end
				
				--Apply TCS
				tqTCS = 1
				if _TCS and throt>0 then
					tqTCS = 1-(math.min(math.max(0,math.abs(v.RotVelocity.Magnitude*(v.Size.x/2) - v.Velocity.Magnitude)-_Tune.TCSThreshold)/_Tune.TCSGradient,1)*(1-(_Tune.TCSLimit/100)))
				end
				if tqTCS < 1 then
					_TCSAmt = tqTCS
					_TCSActive = true
				end
				
				--Update Forces
				local dir=1
				if _CGear==-1 then dir = -1 end--luaint edit
				
				if _Tune.ClutchKick and car.DriveSeat.Velocity.Magnitude<_Tune.KickSpeedThreshold and _RPM>_Tune.Redline-_Tune.KickRPMThreshold and v["#BV"].MotorMaxTorque<1 then 
					tq = (tq*_Tune.KickMult)
				end
				
				local tqOUT = tq*(60/workspace:GetRealPhysicsFPS())*(1+(v.RotVelocity.Magnitude/(120-workspace:GetRealPhysicsFPS()))^(1.15+(.07*(1-(60/workspace:GetRealPhysicsFPS())))))*throt*tqTCS*on*clutch
				
				if v.Name=='RR' then
					v["#AV"].MotorMaxTorque=tqOUT*RRdiffMult*diffMult
				elseif v.Name=='RL' then
					v["#AV"].MotorMaxTorque=tqOUT*RLdiffMult*diffMult
				elseif v.Name=='FR' then
					v["#AV"].MotorMaxTorque=tqOUT*FRdiffMult*diffMult
				elseif v.Name=='FL' then
					v["#AV"].MotorMaxTorque=tqOUT*FLdiffMult*diffMult
				else
					v["#AV"].MotorMaxTorque=tqOUT*diffMult
				end
				v["#AV"].AngularVelocity=_spLimit*dir
			
				if string.find(v.Name,"F") then
					v["#BV"].MotorMaxTorque=(FBrakeForce*(60/workspace:GetRealPhysicsFPS())*brake*tqABS)+(EBrakeForce*((1-throt)*(_RPM/_Tune.Redline)))
				else
					v["#BV"].MotorMaxTorque=(RBrakeForce*(60/workspace:GetRealPhysicsFPS())*brake*tqABS)+(EBrakeForce*((1-throt)*(_RPM/_Tune.Redline)))+(PBrakeForce*PBrakeV)
				end
			else--luaint edit
				v["#AV"].MotorMaxTorque=0
				v["#AV"].AngularVelocity=0
				if string.find(v.Name,"F") then
					v["#BV"].MotorMaxTorque=(FBrakeForce*(60/workspace:GetRealPhysicsFPS())*brake*tqABS)
				else
					v["#BV"].MotorMaxTorque=(RBrakeForce*(60/workspace:GetRealPhysicsFPS())*brake*tqABS)+(PBrakeForce*PBrakeV)
				end
			end
		end
	end
	
	
	
	--[[Flip]]
	
	function Flip()
		--Detect Orientation
		if (car.DriveSeat.CFrame*CFrame.Angles(math.pi/2,0,0)).lookVector.y > .1 or FlipDB then
			FlipWait=tick()
			
		--Apply Flip
		else
			if tick()-FlipWait>=3 then
				FlipDB=true
				local gyro = car.DriveSeat.Flip
				gyro.maxTorque = Vector3.new(10000,0,10000)
				gyro.P=3000
				gyro.D=500
				wait(1)
				gyro.maxTorque = Vector3.new(0,0,0)
				gyro.P=0
				gyro.D=0
				FlipDB=false
			end
		end
	end
	
	
	--[[Run]]
	
	--Print Version
	local ver=require(car["A-Chassis Tune"].README)
	print("Novena: AC6C Loaded - Version "..ver..", Update "..script.Parent.Version.Value)
	
	--Runtime Loops
	
	-- ~60 c/s
	game["Run Service"].Heartbeat:connect(function(dt)
		--Update Internal Values
		_IsOn = script.Parent.IsOn.Value
		_InControls = script.Parent.ControlsOpen.Value
		
		--Inputs
		Inputs(dt)
		
		--Steering
		Steering(dt)
		
		--Gear
		Gear()
		
		--Power
		Engine(dt)
		
		--Update External Values
		script.Parent.Values.Gear.Value = _CGear
		script.Parent.Values.RPM.Value = _RPM
		script.Parent.Values.Boost.Value = ((_TBoost/2)*_TPsi)+((_SBoost/2)*_SPsi)
		script.Parent.Values.BoostTurbo.Value = (_TBoost/2)*_TPsi
		script.Parent.Values.BoostSuper.Value = (_SBoost/2)*_SPsi
		script.Parent.Values.HpNatural.Value = _NH
		script.Parent.Values.HpElectric.Value = _EH
		script.Parent.Values.HpTurbo.Value = _TH
		script.Parent.Values.HpSuper.Value = _SH
		script.Parent.Values.HpBoosted.Value = _BH
		script.Parent.Values.Horsepower.Value = _HP
		script.Parent.Values.TqNatural.Value = _NT/_Tune.Ratios[_CGear+2]/fFD/hpScaling
		script.Parent.Values.TqElectric.Value = _ET/_Tune.Ratios[_CGear+2]/fFD/hpScaling
		script.Parent.Values.TqTurbo.Value = _TT/_Tune.Ratios[_CGear+2]/fFD/hpScaling
		script.Parent.Values.TqSuper.Value = _ST/_Tune.Ratios[_CGear+2]/fFD/hpScaling
		script.Parent.Values.TqBoosted.Value = script.Parent.Values.TqTurbo.Value+script.Parent.Values.TqSuper.Value
		script.Parent.Values.Torque.Value = script.Parent.Values.TqNatural.Value+script.Parent.Values.TqElectric.Value+script.Parent.Values.TqBoosted.Value
		script.Parent.Values.TransmissionMode.Value = _TMode
		script.Parent.Values.Throttle.Value = _GThrot
		script.Parent.Values.Brake.Value = _GBrake
		if script.Parent.Values.AutoClutch.Value then
			script.Parent.Values.Clutch.Value = _Clutch
		end
		script.Parent.Values.SteerC.Value = _GSteerC
		script.Parent.Values.SteerT.Value = _GSteerT
		script.Parent.Values.PBrake.Value = _PBrake
		script.Parent.Values.TCS.Value = _TCS
		script.Parent.Values.TCSActive.Value = _TCSActive
		script.Parent.Values.TCSAmt.Value = 1-_TCSAmt
		script.Parent.Values.ABS.Value = _ABS
		script.Parent.Values.ABSActive.Value = _ABSActive
		script.Parent.Values.MouseSteerOn.Value = _MSteer
		script.Parent.Values.Velocity.Value = car.DriveSeat.Velocity
	end)
	
	--15 c/s
	while wait(.0667) do
		--Automatic Transmission
		if _TMode == "Auto" then Auto() end
		
		--Flip
		if _Tune.AutoFlip then Flip() end
	end
