local F=_Tune.Controls local Q=Instance.new("\070\111\108\100\101\114",script.Parent)Q.Name="\067\111\110\116\114\111\108\115"for h,q in pairs(F)do local z=Instance.new("\083\116\114\105\110\103\086\097\108\117\101",Q)z.Name=h z.Value=q.Name z.Changed:connect(function()if h=="\077\111\117\115\101\084\104\114\111\116\116\108\101"or h=="\077\111\117\115\101\066\114\097\107\101"then if z.Value=="\077\111\117\115\101\066\117\116\116\111\110\049"or z.Value=="\077\111\117\115\101\066\117\116\116\111\110\050"then F[h]=Enum.UserInputType[z.Value]else F[h]=Enum.KeyCode[z.Value]end else F[h]=Enum.KeyCode[z.Value]end end)end local h=_Tune.Peripherals for F,q in pairs(h)do local z=Instance.new("\073\110\116\086\097\108\117\101",Q)z.Name=F z.Value=q z.Changed:connect(function()z.Value=math.min(100,math.max(0,z.Value))h[F]=z.Value end)end function DealWithInput(Q,h)if UserInputService:GetFocusedTextBox()==nil and not _InControls then if _IsOn and((Q.KeyCode==F.ContlrShiftDown or _MSteer and Q.KeyCode==F.MouseShiftDown or not _MSteer and Q.KeyCode==F.ShiftDown)and((_TMode=="\083\101\109\105"or _TMode=="\077\097\110\117\097\108"and not _ClutchOn)and Q.UserInputState==Enum.UserInputState.Begin))then if _CGear==0 and(_TMode=="\065\117\116\111"or not _ClPressing)then _ClutchOn=true end _CGear=math.max(_CGear-1,-1)car.DriveSeat.Filter:FireServer("\115\104\105\102\116",false)elseif _IsOn and((Q.KeyCode==F.ContlrShiftUp or _MSteer and Q.KeyCode==F.MouseShiftUp or not _MSteer and Q.KeyCode==F.ShiftUp)and((_TMode=="\083\101\109\105"or _TMode=="\077\097\110\117\097\108"and not _ClutchOn)and Q.UserInputState==Enum.UserInputState.Begin))then if _CGear==0 and(_TMode=="\065\117\116\111"or not _ClPressing)then _ClutchOn=true end _CGear=math.min(_CGear+1,#_Tune.Ratios-2)car.DriveSeat.Filter:FireServer("\115\104\105\102\116",true)elseif _IsOn and((Q.KeyCode==F.ContlrClutch or _MSteer and Q.KeyCode==F.MouseClutch or not _MSteer and Q.KeyCode==F.Clutch)and _TMode=="\077\097\110\117\097\108")then if Q.UserInputState==Enum.UserInputState.Begin then _ClutchOn=false _ClPressing=true elseif Q.UserInputState==Enum.UserInputState.End then _ClutchOn=true _ClPressing=false end elseif _IsOn and Q.KeyCode==F.ContlrPBrake or _MSteer and Q.KeyCode==F.MousePBrake or not _MSteer and Q.KeyCode==F.PBrake then if Q.UserInputState==Enum.UserInputState.Begin then _PBrake=not _PBrake elseif Q.UserInputState==Enum.UserInputState.End then if car.DriveSeat.Velocity.Magnitude>5 then _PBrake=false end end elseif(Q.KeyCode==F.ContlrToggleTMode or Q.KeyCode==F.ToggleTransMode)and Q.UserInputState==Enum.UserInputState.Begin then local F=1 for Q,h in pairs(_Tune.TransModes)do if h==_TMode then F=Q break end end F=F+1 if F>#_Tune.TransModes then F=1 end _TMode=_Tune.TransModes[F]elseif _IsOn and(not _MSteer and(Q.KeyCode==F.Throttle or Q.KeyCode==F.Throttle2))or((F.MouseThrottle==Enum.UserInputType.MouseButton1 or F.MouseThrottle==Enum.UserInputType.MouseButton2)and Q.UserInputType==F.MouseThrottle or Q.KeyCode==F.MouseThrottle)and _MSteer then if Q.UserInputState==Enum.UserInputState.Begin then _GThrot=1 else _GThrot=_Tune.IdleThrottle/100 end elseif not _MSteer and(Q.KeyCode==F.Brake or Q.KeyCode==F.Brake2)or((F.MouseBrake==Enum.UserInputType.MouseButton1 or F.MouseBrake==Enum.UserInputType.MouseButton2)and Q.UserInputType==F.MouseBrake or Q.KeyCode==F.MouseBrake)and _MSteer then if Q.UserInputState==Enum.UserInputState.Begin then _GBrake=1 else _GBrake=0 end elseif not _MSteer and(Q.KeyCode==F.SteerLeft or Q.KeyCode==F.SteerLeft2)then if Q.UserInputState==Enum.UserInputState.Begin then _GSteerT=-1 _SteerL=true else if _SteerR then _GSteerT=1 else _GSteerT=0 end _SteerL=false end elseif not _MSteer and(Q.KeyCode==F.SteerRight or Q.KeyCode==F.SteerRight2)then if Q.UserInputState==Enum.UserInputState.Begin then _GSteerT=1 _SteerR=true else if _SteerL then _GSteerT=-1 else _GSteerT=0 end _SteerR=false end elseif Q.KeyCode==F.ToggleMouseDrive then if Q.UserInputState==Enum.UserInputState.End then _MSteer=not _MSteer _GThrot=_Tune.IdleThrottle/100 _GBrake=0 _GSteerT=0 _ClutchOn=true end elseif _Tune.TCSEnabled and(_IsOn and Q.KeyCode==F.ToggleTCS)or Q.KeyCode==F.ContlrToggleTCS then if Q.UserInputState==Enum.UserInputState.End then if script.Parent.DriveMode.Value~="\083\112\111\114\116\080\108\117\115"then _TCS=not _TCS end end elseif _Tune.ABSEnabled and(_IsOn and Q.KeyCode==F.ToggleABS)or Q.KeyCode==F.ContlrToggleABS then if Q.UserInputState==Enum.UserInputState.End then _ABS=not _ABS end end if Q.UserInputType.Name:find("\071\097\109\101\112\097\100")then if Q.KeyCode==F.ContlrSteer then if Q.Position.X>=0 then local F=math.min(.99,_Tune.Peripherals.ControlRDZone/100)if math.abs(Q.Position.X)>F then _GSteerT=(Q.Position.X-F)/(1-F)else _GSteerT=0 end else local F=math.min(.99,_Tune.Peripherals.ControlLDZone/100)if math.abs(Q.Position.X)>F then _GSteerT=(Q.Position.X+F)/(1-F)else _GSteerT=0 end end elseif _IsOn and Q.KeyCode==F.ContlrThrottle then _GThrot=math.max(_Tune.IdleThrottle/100,Q.Position.Z)elseif Q.KeyCode==F.ContlrBrake then _GBrake=Q.Position.Z end end else _GThrot=_Tune.IdleThrottle/100 _GSteerT=0 _GBrake=0 if _CGear~=0 then _ClutchOn=true end end end UserInputService.InputBegan:connect(DealWithInput)UserInputService.InputChanged:connect(DealWithInput)UserInputService.InputEnded:connect(DealWithInput)


	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 _IsOn and  (input.KeyCode ==_CTRL["ContlrShiftDown"] or (_MSteer and input.KeyCode==_CTRL["MouseShiftDown"]) or ((not _MSteer) and input.KeyCode==_CTRL["ShiftDown"])) and (_TMode=="Semi" or (_TMode=="Manual" and (not _ClutchOn))) and input.UserInputState == Enum.UserInputState.Begin then
				if _CGear == 0 and (_TMode=="Auto" or not _ClPressing) then _ClutchOn = true end
				_CGear = math.max(_CGear-1,-1)
				car.DriveSeat.Filter:FireServer('shift',false)
				
			--Shift Up [Manual Transmission]
			elseif _IsOn and  (input.KeyCode ==_CTRL["ContlrShiftUp"] or (_MSteer and input.KeyCode==_CTRL["MouseShiftUp"]) or ((not _MSteer) and input.KeyCode==_CTRL["ShiftUp"])) and (_TMode=="Semi" or (_TMode=="Manual" and (not _ClutchOn))) and input.UserInputState == Enum.UserInputState.Begin then
				if _CGear == 0 and (_TMode=="Auto" or not _ClPressing) then _ClutchOn = true end
				_CGear = math.min(_CGear+1,#_Tune.Ratios-2)
				car.DriveSeat.Filter:FireServer('shift',true)
				
			--Toggle Clutch
			elseif _IsOn and  (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
					_ClutchOn = false
					_ClPressing = true
				elseif input.UserInputState == Enum.UserInputState.End then
					_ClutchOn = true
					_ClPressing = false
				end
				
			--Toggle PBrake
			elseif _IsOn and  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 _IsOn and ((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 then
					_GThrot = 1
				else
					_GThrot = _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
					_GBrake = 1
				else
					_GBrake = 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
					_GThrot = _Tune.IdleThrottle/100
					_GBrake = 0
					_GSteerT = 0
					_ClutchOn = true
				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 
					if script.Parent.DriveMode.Value ~= "SportPlus" then
						_TCS = not _TCS
					end 
				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 _IsOn and input.KeyCode == _CTRL["ContlrThrottle"] then
					_GThrot = math.max(_Tune.IdleThrottle/100,input.Position.Z)
					
				--Gamepad Brake
				elseif input.KeyCode == _CTRL["ContlrBrake"] then
					_GBrake = input.Position.Z
				end
			end
		else
			_GThrot = _Tune.IdleThrottle/100
			_GSteerT = 0
			_GBrake = 0
			if _CGear~=0 then _ClutchOn = true end
		end
	end
	UserInputService.InputBegan:connect(DealWithInput)
	UserInputService.InputChanged:connect(DealWithInput)
	UserInputService.InputEnded:connect(DealWithInput)


