Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local CameraModule = {}
- local runService = game:GetService("RunService")
- local players = game:GetService("Players")
- local isCameraUpdateBound = false
- local isCameraShakeUpdateBound = false
- local uis = game:GetService("UserInputService")
- local canToggleMouse = {allowed = false; activationkey = Enum.KeyCode.F;}
- local canViewBody = true
- local sensitivity = 0.3
- local smoothness = 0.1
- local fieldOfView = 90
- local cam
- local player
- local m
- local character
- local humanoidpart
- local head
- local CamPos, TargetCamPos = Vector3.new(), Vector3.new()
- local AngleX, TargetAngleX = 0, 0
- local AngleY, TargetAngleY = 0, 180
- local running = false
- local freemouse = false
- local shakeDuration = 0
- local fadeInDuration = 0
- local fadeOutDuration = 0
- local initialShakeMagnitude = 0
- local currentShakeMagnitude = 0
- local function initialize()
- player = players.LocalPlayer
- cam = workspace.CurrentCamera
- m = player:GetMouse()
- uis.MouseIconEnabled = false
- character = player.Character or player.CharacterAdded:Wait()
- humanoidpart = character:WaitForChild("HumanoidRootPart")
- head = character:WaitForChild("Head")
- end
- local function updatechar()
- for _, v in pairs(character:GetChildren()) do
- if canViewBody then
- if v.Name == 'Head' then
- v.LocalTransparencyModifier = 1
- v.CanCollide = false
- end
- else
- if v:IsA('Part') or v:IsA('UnionOperation') or v:IsA('MeshPart') then
- v.LocalTransparencyModifier = 1
- v.CanCollide = false
- end
- end
- if v:IsA('Accessory') or v:IsA('Hat') then
- local handle = v:FindFirstChild('Handle')
- if handle then
- handle.LocalTransparencyModifier = 1
- handle.CanCollide = false
- end
- end
- end
- end
- uis.InputChanged:Connect(function(inputObject)
- if inputObject.UserInputType == Enum.UserInputType.MouseMovement then
- local delta = Vector2.new(inputObject.Delta.x / sensitivity, inputObject.Delta.y / sensitivity) * smoothness
- local X = TargetAngleX - delta.y
- TargetAngleX = (X >= 80 and 80) or (X <= -80 and -80) or X
- TargetAngleY = (TargetAngleY - delta.x) % 360
- end
- end)
- uis.InputBegan:Connect(function(inputObject)
- if inputObject.UserInputType == Enum.UserInputType.Keyboard then
- if inputObject.KeyCode == canToggleMouse.activationkey then
- freemouse = not freemouse
- end
- end
- end)
- local function updateCameraShake()
- if shakeDuration > 0 then
- local fadeMultiplier = 1
- if shakeDuration < fadeInDuration then
- fadeMultiplier = shakeDuration / fadeInDuration
- elseif shakeDuration < fadeOutDuration then
- fadeMultiplier = shakeDuration / fadeOutDuration
- end
- currentShakeMagnitude = initialShakeMagnitude * fadeMultiplier
- local shakeOffset = Vector3.new(
- (math.random() - 0.5) * 2 * currentShakeMagnitude,
- (math.random() - 0.5) * 2 * currentShakeMagnitude,
- (math.random() - 0.5) * 2 * currentShakeMagnitude
- )
- shakeDuration = shakeDuration - runService.RenderStepped:Wait()
- else
- runService:UnbindFromRenderStep("CameraShakeUpdate")
- end
- end
- local function onRenderStepped()
- if running then
- updatechar()
- CamPos = CamPos + (TargetCamPos - CamPos) * 0.28
- AngleX = AngleX + (TargetAngleX - AngleX) * 0.35
- local dist = TargetAngleY - AngleY
- dist = math.abs(dist) > 180 and dist - (dist / math.abs(dist)) * 360 or dist
- AngleY = (AngleY + dist * 0.35) % 360
- cam.CameraType = Enum.CameraType.Scriptable
- cam.CFrame = CFrame.new(head.Position)
- * CFrame.Angles(0, math.rad(AngleY), 0)
- * CFrame.Angles(math.rad(AngleX), 0, 0)
- * CFrame.new(0, 0.8, 0)
- humanoidpart.CFrame = CFrame.new(humanoidpart.Position) * CFrame.Angles(0, math.rad(AngleY), 0)
- character.Humanoid.AutoRotate = false
- else
- game:GetService("UserInputService").MouseBehavior = Enum.MouseBehavior.Default
- character.Humanoid.AutoRotate = true
- end
- if (cam.Focus.Position - cam.CFrame.Position).Magnitude < 1 then
- running = false
- else
- running = true
- game:GetService("UserInputService").MouseBehavior = freemouse and Enum.MouseBehavior.Default or Enum.MouseBehavior.LockCenter
- end
- cam.FieldOfView = fieldOfView
- end
- function CameraModule.CameraShake(magnitude, duration, fadeInTime, fadeOutTime)
- initialShakeMagnitude = magnitude
- currentShakeMagnitude = magnitude
- shakeDuration = duration
- fadeInDuration = fadeInTime
- fadeOutDuration = fadeOutTime
- if isCameraShakeUpdateBound then
- runService:UnbindFromRenderStep("CameraShakeUpdate")
- isCameraShakeUpdateBound = false
- end
- if not isCameraShakeUpdateBound then
- runService:BindToRenderStep("CameraShakeUpdate", Enum.RenderPriority.Camera.Value, updateCameraShake)
- isCameraShakeUpdateBound = true
- end
- end
- function CameraModule.reset()
- if uis.TouchEnabled then
- game.Players.LocalPlayer.CameraMaxZoomDistance = 0.5
- elseif uis.MouseEnabled and not uis.GamepadEnabled then
- if not game:GetService("Players").LocalPlayer then return end
- initialize()
- running = true
- game.Players.LocalPlayer.CameraMaxZoomDistance = 16
- if not isCameraUpdateBound then
- runService:BindToRenderStep("CameraUpdate", Enum.RenderPriority.Camera.Value, onRenderStepped)
- isCameraUpdateBound = true
- end
- end
- end
- function CameraModule.unlock()
- running = false
- if isCameraUpdateBound then
- runService:UnbindFromRenderStep("CameraUpdate")
- isCameraUpdateBound = false
- end
- if isCameraShakeUpdateBound then
- runService:UnbindFromRenderStep("CameraShakeUpdate")
- isCameraShakeUpdateBound = false
- end
- end
- return CameraModule
Advertisement
Add Comment
Please, Sign In to add comment