local l=false local w=game:GetService("\085\115\101\114\073\110\112\117\116\083\101\114\118\105\099\101")local Z=0 local M=0 local I=0 local K=0 local G=0 local j=0 local x=0 local R=0 local S=0 local U=0 local F=0 function DealWithInput(w,E)if l then if w.KeyCode==Enum.KeyCode.ButtonX then if w.UserInputState==Enum.UserInputState.Begin then j=1 elseif w.UserInputState==Enum.UserInputState.End then j=0 end elseif w.KeyCode==Enum.KeyCode.ButtonY then if w.UserInputState==Enum.UserInputState.Begin then x=1 elseif w.UserInputState==Enum.UserInputState.End then x=0 end elseif w.KeyCode==Enum.KeyCode.ButtonL1 then if w.UserInputState==Enum.UserInputState.Begin then R=1 elseif w.UserInputState==Enum.UserInputState.End then R=0 end elseif w.KeyCode==Enum.KeyCode.ButtonR1 then if w.UserInputState==Enum.UserInputState.Begin then S=1 elseif w.UserInputState==Enum.UserInputState.End then S=0 end elseif w.KeyCode==Enum.KeyCode.DPadLeft then if w.UserInputState==Enum.UserInputState.Begin then F=1 elseif w.UserInputState==Enum.UserInputState.End then F=0 end elseif w.KeyCode==Enum.KeyCode.ButtonR3 then if w.UserInputState==Enum.UserInputState.Begin then U=1 elseif w.UserInputState==Enum.UserInputState.End then U=0 end end if w.UserInputType.Name:find("\071\097\109\101\112\097\100")then if w.KeyCode==Enum.KeyCode.Thumbstick1 then Z=w.Position.X elseif w.KeyCode==Enum.KeyCode.Thumbstick2 then M=w.Position.X I=w.Position.Y elseif w.KeyCode==Enum.KeyCode.ButtonR2 then K=w.Position.Z elseif w.KeyCode==Enum.KeyCode.ButtonL2 then G=w.Position.Z end end end end w.InputBegan:connect(DealWithInput)w.InputChanged:connect(DealWithInput)w.InputEnded:connect(DealWithInput)car.DriveSeat.ChildRemoved:connect(function(l)if l.Name=="\083\101\097\116\087\101\108\100"then for l,w in pairs(Binded)do run:UnbindFromRenderStep(w)end workspace.CurrentCamera.CameraType=Enum.CameraType.Custom workspace.CurrentCamera.FieldOfView=70 player.CameraMaxZoomDistance=200 end end)function Camera()local l=workspace.CurrentCamera local w=false local Z=0 local K=0 local G=0 local j=0 local x=0 local R=0 local function S()if not pcall(function()if R==0 and F==1 then w=not w end R=F if j==1 then if math.abs(M)>.1 then local l=1 if M<0 then l=-1 end if w then Z=(l*math.abs((math.abs(M)-.1)/.9))*-80 else Z=(l*math.abs((math.abs(M)-.1)/.9))*-90 end else Z=0 end if math.abs(I)>.1 then local l=1 if I<0 then l=-1 end if w then G=(l*math.abs((math.abs(I)-.1)/.9))*30 else G=math.min((l*math.abs((math.abs(I)-.1)/.9))*-75,30)end else G=0 end else if Z>x then Z=math.max(x,Z-20)elseif Z<x then Z=math.min(x,Z+20)end G=0 end if w then K=0 else K=-180*U end if w then l.CameraSubject=player.Character.Humanoid l.CameraType=Enum.CameraType.Scriptable l.FieldOfView=80+car.DriveSeat.Velocity.Magnitude/12 player.CameraMaxZoomDistance=5 local w=car.Body.Cam.CFrame if U==1 then w=car.Body.RCam.CFrame end l.CoordinateFrame=(w*CFrame.Angles(0,math.rad(Z+K),0))*CFrame.Angles(math.rad(G),0,0)else l.CameraSubject=car.DriveSeat l.FieldOfView=70 if j==0 then l.CameraType=Enum.CameraType.Custom player.CameraMaxZoomDistance=400 run:UnbindFromRenderStep("\067\097\109\085\112\100\097\116\101")else l.CameraType="\083\099\114\105\112\116\097\098\108\101"local w=math.min(1,car.DriveSeat.Velocity.Magnitude/500)local M=((car.DriveSeat.Position+Vector3.new(0,8+w*2,0))-(car.DriveSeat.CFrame*CFrame.Angles(math.rad(G),math.rad(Z+K),0)).lookVector*17)+(car.DriveSeat.Velocity.Unit*-7)*w l.CoordinateFrame=CFrame.new(M,car.DriveSeat.Position)end end end)then l.FieldOfView=70 l.CameraSubject=player.Character.Humanoid l.CameraType=Enum.CameraType.Custom player.CameraMaxZoomDistance=400 run:UnbindFromRenderStep("\067\097\109\085\112\100\097\116\101")end end local function E()if GMode~=j then j=GMode run:BindToRenderStep("\067\097\109\085\112\100\097\116\101",Enum.RenderPriority.Camera.Value,S)end end mouse.KeyDown:connect(function(l)if l=="\053"then x=50 elseif l=="\054"then if w then x=-160 else x=-180 end elseif l=="\055"then x=-50 elseif l=="\118"then run:UnbindFromRenderStep("\067\097\109\085\112\100\097\116\101")w=not w run:BindToRenderStep("\067\097\109\085\112\100\097\116\101",Enum.RenderPriority.Camera.Value,S)end end)mouse.KeyUp:connect(function(l)if l=="\053"and x==50 then x=0 elseif l=="\054"and(x==-160 or x==-180)then x=0 elseif l=="\055"and x==-50 then x=0 end end)run:BindToRenderStep("\067\077\067\104\097\110\103\101",Enum.RenderPriority.Camera.Value,E)table.insert(Binded,"\067\097\109\085\112\100\097\116\101")table.insert(Binded,"\067\077\067\104\097\110\103\101")end Camera()mouse.KeyDown:connect(function(w)if w=="\098"then if GMode>=1 then GMode=0 else GMode=GMode+1 end if GMode==1 then l=true else l=false end end end)

local Controller=false
local UserInputService = game:GetService("UserInputService")
local LStickX = 0
local RStickX = 0
local RStickY = 0
local RTriggerValue = 0
local LTriggerValue = 0

local ButtonX = 0
local ButtonY = 0
local ButtonL1 = 0
local ButtonR1 = 0
local ButtonR3 = 0
local DPadUp = 0
function DealWithInput(input,IsRobloxFunction)
	if Controller then
		if input.KeyCode ==Enum.KeyCode.ButtonX then
			if input.UserInputState == Enum.UserInputState.Begin then
				ButtonX=1
			elseif input.UserInputState == Enum.UserInputState.End then
				ButtonX=0
			end
		elseif input.KeyCode ==Enum.KeyCode.ButtonY then
			if input.UserInputState == Enum.UserInputState.Begin then
				ButtonY=1
			elseif input.UserInputState == Enum.UserInputState.End then
				ButtonY=0
			end
		elseif input.KeyCode ==Enum.KeyCode.ButtonL1 then
			if input.UserInputState == Enum.UserInputState.Begin then
				ButtonL1=1
			elseif input.UserInputState == Enum.UserInputState.End then
				ButtonL1=0
			end
		elseif input.KeyCode ==Enum.KeyCode.ButtonR1 then
			if input.UserInputState == Enum.UserInputState.Begin then
				ButtonR1=1
			elseif input.UserInputState == Enum.UserInputState.End then
				ButtonR1=0
			end
		elseif input.KeyCode ==Enum.KeyCode.DPadLeft then
			if input.UserInputState == Enum.UserInputState.Begin then
				DPadUp=1
			elseif input.UserInputState == Enum.UserInputState.End then
				DPadUp=0
			end
		elseif input.KeyCode ==Enum.KeyCode.ButtonR3 then
			if input.UserInputState == Enum.UserInputState.Begin then
				ButtonR3=1
			elseif input.UserInputState == Enum.UserInputState.End then
				ButtonR3=0
			end
		end
		if input.UserInputType.Name:find("Gamepad") then --it's one of 4 gamepads
			if input.KeyCode == Enum.KeyCode.Thumbstick1 then
				LStickX = input.Position.X
			elseif input.KeyCode == Enum.KeyCode.Thumbstick2 then
				RStickX = input.Position.X
				RStickY = input.Position.Y
			elseif input.KeyCode == Enum.KeyCode.ButtonR2 then--right shoulder
				RTriggerValue = input.Position.Z
			elseif input.KeyCode == Enum.KeyCode.ButtonL2 then--left shoulder
				LTriggerValue = input.Position.Z
			end
		end
	end
end
UserInputService.InputBegan:connect(DealWithInput)
UserInputService.InputChanged:connect(DealWithInput)--keyboards don't activate with Changed, only Begin and Ended. idk if digital controller buttons do too
UserInputService.InputEnded:connect(DealWithInput)

car.DriveSeat.ChildRemoved:connect(function(child)
	if child.Name=="SeatWeld" then
		for i,v in pairs(Binded) do
			run:UnbindFromRenderStep(v)
		end 
		workspace.CurrentCamera.CameraType=Enum.CameraType.Custom
		workspace.CurrentCamera.FieldOfView=70
		player.CameraMaxZoomDistance=200
	end
end)

function Camera()
	local cam=workspace.CurrentCamera
	local intcam=false
	local CRot=0
	local CBack=0
	local CUp=0
	local mode=0
	local look=0
	local camChange = 0
	local function CamUpdate()
		if not pcall (function()
			if camChange==0 and DPadUp==1 then
				intcam = not intcam
			end
			camChange=DPadUp
			if mode==1 then
				if math.abs(RStickX)>.1 then
					local sPos=1
					if RStickX<0 then sPos=-1 end
					if intcam then
						CRot=sPos*math.abs(((math.abs(RStickX)-.1)/(.9)))*-80
					else
						CRot=sPos*math.abs(((math.abs(RStickX)-.1)/(.9)))*-90
					end
				else
					CRot=0
				end
				if math.abs(RStickY)>.1 then
					local sPos=1
					if RStickY<0 then sPos=-1 end
					if intcam then
						CUp=sPos*math.abs(((math.abs(RStickY)-.1)/(.9)))*30
					else
						CUp=math.min(sPos*math.abs(((math.abs(RStickY)-.1)/(.9)))*-75,30)
					end
				else
					CUp=0
				end
			else
				if CRot>look then
					CRot=math.max(look,CRot-20)
				elseif CRot<look then
					CRot=math.min(look,CRot+20)
				end
				CUp=0
			end
			if intcam then
				CBack=0
			else
				CBack=-180*ButtonR3
			end
			if intcam then
				cam.CameraSubject=player.Character.Humanoid
				cam.CameraType=Enum.CameraType.Scriptable
				cam.FieldOfView=80 + car.DriveSeat.Velocity.Magnitude/12
				player.CameraMaxZoomDistance=5
				local cf=car.Body.Cam.CFrame
				if ButtonR3==1 then
					cf=car.Body.RCam.CFrame
				end
				cam.CoordinateFrame=cf*CFrame.Angles(0,math.rad(CRot+CBack),0)*CFrame.Angles(math.rad(CUp),0,0)
			else
				cam.CameraSubject=car.DriveSeat
				cam.FieldOfView=70
				if mode==0 then
					cam.CameraType=Enum.CameraType.Custom
					player.CameraMaxZoomDistance=400
					run:UnbindFromRenderStep("CamUpdate")
				else
					cam.CameraType = "Scriptable"
					local pspeed = math.min(1,car.DriveSeat.Velocity.Magnitude/500)
					local cc = car.DriveSeat.Position+Vector3.new(0,8+(pspeed*2),0)-((car.DriveSeat.CFrame*CFrame.Angles(math.rad(CUp),math.rad(CRot+CBack),0)).lookVector*17)+(car.DriveSeat.Velocity.Unit*-7*pspeed)
					cam.CoordinateFrame = CFrame.new(cc,car.DriveSeat.Position)
				end
			end
		end) then
			cam.FieldOfView=70
			cam.CameraSubject=player.Character.Humanoid
			cam.CameraType=Enum.CameraType.Custom
			player.CameraMaxZoomDistance=400
			run:UnbindFromRenderStep("CamUpdate")
		end
	end
	local function ModeChange()
		if GMode~=mode then
			mode=GMode
			run:BindToRenderStep("CamUpdate",Enum.RenderPriority.Camera.Value,CamUpdate)
		end
	end
	mouse.KeyDown:connect(function(key)
		if key=="5" then
			look=50
		elseif key=="6" then
			if intcam then
				look=-160
			else
				look=-180
			end
		elseif key=="7" then
			look=-50
		elseif key=="v" then
			run:UnbindFromRenderStep("CamUpdate")
			intcam=not intcam
			run:BindToRenderStep("CamUpdate",Enum.RenderPriority.Camera.Value,CamUpdate)
		end
	end)
	mouse.KeyUp:connect(function(key)
		if key=="5" and look==50 then
			look=0
		elseif key=="6" and (look==-160 or look==-180) then
			look=0
		elseif key=="7" and look==-50 then
			look=0
		end
	end)
	run:BindToRenderStep("CMChange",Enum.RenderPriority.Camera.Value,ModeChange)
	table.insert(Binded,"CamUpdate")
	table.insert(Binded,"CMChange")
end
Camera()

mouse.KeyDown:connect(function(key)
	if key=="b" then
		if GMode>=1 then
			GMode=0
		else
			GMode=GMode+1
		end
		if GMode==1 then
			Controller=true
		else
			Controller=false
		end
	end
end)
