View difference between Paste ID: QVB7d9Ph and kuJ2nSaT
SHOW: | | - or go back to the newest paste.
1
wait(2)
2
3
local InputService=game:GetService("UserInputService")
4
local Camera=game.Workspace.CurrentCamera
5
local Player=game.Players.LocalPlayer
6
local Character=Player.Character
7
local Head=Character.Head
8
local Torso=Character.Torso
9
local RootPart=Character.HumanoidRootPart
10
local RootJoint=RootPart.RootJoint
11
local Neck=Torso.Neck
12
Camera.FieldOfView=90
13
Camera.CameraType="Scriptable"
14
InputService.MouseBehavior=Enum.MouseBehavior.LockCenter
15-
port = Instance.new("Part", game.Players.LocalPlayer.Character)
15+
16-
port.Transparency = 1
16+
17-
port.CanCollide = false
17+
18-
port.Anchored = true
18+
19-
port.Name = ("parted")
19+
20
local components=cf().components
21-
local plr = game.Players.LocalPlayer
21+
22-
plr.Changed:connect(function(change)
22+
23-
if (change == "Character.parted") then
23+
24-
plr.CameraMode = "Classic"
24+
25-
script.Disabled = true	
25+
26-
script:Destroy()
26+
27
	local z=v.z
28
	return z*z<0.99999 and v3(v.y,-v.x,0).unit*acos(-z) or v3()
29
end
30
31
local function AxisAngleLookOrientation(c,v,t)--CFrame,Vector,Tween
32
	local c=c-c.p
33
	local rv=(inverse(c)*v).unit
34
	local rz=rv.z
35
	return rz*rz<0.99999 and c*fromAxisAngle(v3(rv.y,-rv.x,0),acos(-rz)*(t or 1)) or c
36
end
37
38
local function AxisAngleLookNew(v,t)--CFrame,Vector,Tween
39
	local rv=v.unit
40
	local rz=rv.z
41
	return rz*rz<0.99999 and fromAxisAngle(v3(rv.y,-rv.x,0),acos(-rz)*(t or 1)) or cf()
42
end
43
44
local function AxisAngleLook(c,v,t)--CFrame,Vector,Tween
45
	local rv=(inverse(c)*v).unit
46
	local rz=rv.z
47
	return rz*rz<0.99999 and c*fromAxisAngle(v3(rv.y,-rv.x,0),acos(-rz)*(t or 1)) or c
48
end
49
50
51
52
53
local Sensitivity=0.005
54
55
56
local CameraDirection=Vector3.new(0,0,1)
57
58
local function EulerAnglesYX(l)
59
	local x,z=l.x,l.z
60
	return atan(l.y/(x*x+z*z)^0.5),-atan2(x,-z)
61
end
62
63
local function AnglesXY(l)
64
	local z=l.z
65
	return atan2(l.y,-z),-atan2(l.x,-z)
66
end
67
68
local function MouseMoved(Input)
69
	if Input.UserInputType==Enum.UserInputType.MouseMovement then
70
		local dx,dy=Input.Delta.x*Sensitivity,Input.Delta.y*Sensitivity
71
		local m2=dx*dx+dy*dy
72
		if m2>0 then
73
			CameraDirection=(AxisAngleLookOrientation(RootPart.CFrame,CameraDirection)*fromAxisAngle(v3(-dy,-dx,0),m2^0.5)).lookVector
74
		end
75
		local RootOrientation=RootPart.CFrame-RootPart.Position
76
		local RelativeDirection=RootOrientation:inverse()*CameraDirection
77
		local AngX,AngY=AnglesXY(RelativeDirection)--RootOrientation:inverse()*
78
		if AngX<-1.57*11/12 then
79
			local y,z,c,s=RelativeDirection.y,RelativeDirection.z,math.cos(-1.57*11/12-AngX),-math.sin(-1.57*11/12-AngX)
80
			z,y=z*c-y*s,z*s+y*c
81
			CameraDirection=RootOrientation*v3(RelativeDirection.x<0 and -(1-y*y-z*z)^0.5 or (1-y*y-z*z)^0.5,y,z)
82
		elseif AngX>1.57*11/12 then
83
			local y,z,c,s=RelativeDirection.y,RelativeDirection.z,math.cos(1.57*11/12-AngX),-math.sin(1.57*11/12-AngX)
84
			z,y=z*c-y*s,z*s+y*c
85
			CameraDirection=RootOrientation*v3(RelativeDirection.x<0 and -(1-y*y-z*z)^0.5 or (1-y*y-z*z)^0.5,y,z)
86
		end
87
	end
88
end
89
90
local Mouse=Player:GetMouse()
91
92
local Zoom=-0.5
93
94
Mouse.KeyDown:connect(function(k) 
95
	if k=="j" then 	
96
		Zoom=-0.5
97
	elseif k=="l" then
98
		Zoom=8
99
	end
100
end)
101
102
InputService.InputChanged:connect(MouseMoved)
103
104
Neck.C1=cf()
105
106
local _
107
local DirectionBound=3.14159/3
108
local CurrentAngY=0
109
110
local function CameraUpdate()
111
	Camera.CameraType="Scriptable"
112
	local cx,cz=CameraDirection.x,CameraDirection.z
113
	local rvx,rvz=RootPart.Velocity.x,RootPart.Velocity.z
114
	if rvx*rvx+rvz*rvz>4 and cx*rvx+cz*rvz<-0.5*(cx*cx+cz*cz)^0.5*(rvx*rvx+rvz*rvz)^0.5 then
115
		DirectionBound=math.min(DirectionBound*0.9,math.abs(CurrentAngY*0.9))
116
	else
117
		DirectionBound=DirectionBound*0.1+3.14159/3*0.9
118
	end
119
	local AngX,AngY=EulerAnglesYX((RootPart.CFrame-RootPart.Position):inverse()*CameraDirection)
120
	if AngY>DirectionBound then
121
		RootPart.CFrame=RootPart.CFrame*CFrame.Angles(0,AngY-DirectionBound,0)
122
	elseif AngY<-DirectionBound then
123
		RootPart.CFrame=RootPart.CFrame*CFrame.Angles(0,AngY+DirectionBound,0)
124
	end
125
	_,CurrentAngY=EulerAnglesYX((RootPart.CFrame-RootPart.Position):inverse()*CameraDirection)
126
	local CameraOrientation=AxisAngleLookNew((RootPart.CFrame-RootPart.Position):inverse()*CameraDirection,1)
127
	Neck.C0=CFrame.new(0,-1,0)*CameraOrientation*CFrame.new(0,-0.5,0)
128
	local PreCam=AxisAngleLook(RootPart.CFrame*cf(0,0.5,0),RootPart.CFrame*v3(0,0.5,0)+CameraDirection)*CFrame.new(0,-0.325,0)
129
	if Zoom==8 then
130
		local Part,Position=Workspace:findPartOnRay(Ray.new(PreCam.p,PreCam.lookVector*-8),Character)
131
		Camera.CoordinateFrame=PreCam*CFrame.new(0,0,(Position-PreCam.p).magnitude)
132
	else
133
		Camera.CoordinateFrame=PreCam*CFrame.new(0,0,Zoom)
134
	end
135
end
136
137
game:GetService("RunService").RenderStepped:connect(CameraUpdate)