Guest User

Untitled

a guest
Nov 15th, 2024
19
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.45 KB | None | 0 0
  1. local CameraModule = {}
  2. local runService = game:GetService("RunService")
  3. local players = game:GetService("Players")
  4. local isCameraUpdateBound = false
  5. local isCameraShakeUpdateBound = false
  6. local uis = game:GetService("UserInputService")
  7.  
  8. local canToggleMouse = {allowed = false; activationkey = Enum.KeyCode.F;}
  9. local canViewBody = true
  10. local sensitivity = 0.3
  11. local smoothness = 0.1
  12. local fieldOfView = 90
  13.  
  14. local cam
  15. local player
  16. local m
  17. local character
  18. local humanoidpart
  19. local head
  20.  
  21. local CamPos, TargetCamPos = Vector3.new(), Vector3.new()
  22. local AngleX, TargetAngleX = 0, 0
  23. local AngleY, TargetAngleY = 0, 180
  24.  
  25. local running = false
  26. local freemouse = false
  27. local shakeDuration = 0
  28. local fadeInDuration = 0
  29. local fadeOutDuration = 0
  30. local initialShakeMagnitude = 0
  31. local currentShakeMagnitude = 0
  32.  
  33. local function initialize()
  34.     player = players.LocalPlayer
  35.     cam = workspace.CurrentCamera
  36.     m = player:GetMouse()
  37.     uis.MouseIconEnabled = false
  38.     character = player.Character or player.CharacterAdded:Wait()
  39.     humanoidpart = character:WaitForChild("HumanoidRootPart")
  40.     head = character:WaitForChild("Head")
  41. end
  42.  
  43. local function updatechar()
  44.     for _, v in pairs(character:GetChildren()) do
  45.         if canViewBody then
  46.             if v.Name == 'Head' then
  47.                 v.LocalTransparencyModifier = 1
  48.                 v.CanCollide = false
  49.             end
  50.         else
  51.             if v:IsA('Part') or v:IsA('UnionOperation') or v:IsA('MeshPart') then
  52.                 v.LocalTransparencyModifier = 1
  53.                 v.CanCollide = false
  54.             end
  55.         end
  56.         if v:IsA('Accessory') or v:IsA('Hat') then
  57.             local handle = v:FindFirstChild('Handle')
  58.             if handle then
  59.                 handle.LocalTransparencyModifier = 1
  60.                 handle.CanCollide = false
  61.             end
  62.         end
  63.     end
  64. end
  65.  
  66. uis.InputChanged:Connect(function(inputObject)
  67.     if inputObject.UserInputType == Enum.UserInputType.MouseMovement then
  68.         local delta = Vector2.new(inputObject.Delta.x / sensitivity, inputObject.Delta.y / sensitivity) * smoothness
  69.         local X = TargetAngleX - delta.y
  70.         TargetAngleX = (X >= 80 and 80) or (X <= -80 and -80) or X
  71.         TargetAngleY = (TargetAngleY - delta.x) % 360
  72.     end
  73. end)
  74.  
  75. uis.InputBegan:Connect(function(inputObject)
  76.     if inputObject.UserInputType == Enum.UserInputType.Keyboard then
  77.         if inputObject.KeyCode == canToggleMouse.activationkey then
  78.             freemouse = not freemouse
  79.         end
  80.     end
  81. end)
  82.  
  83. local function updateCameraShake()
  84.     if shakeDuration > 0 then
  85.         local fadeMultiplier = 1
  86.         if shakeDuration < fadeInDuration then
  87.             fadeMultiplier = shakeDuration / fadeInDuration
  88.         elseif shakeDuration < fadeOutDuration then
  89.             fadeMultiplier = shakeDuration / fadeOutDuration
  90.         end
  91.         currentShakeMagnitude = initialShakeMagnitude * fadeMultiplier
  92.  
  93.         local shakeOffset = Vector3.new(
  94.             (math.random() - 0.5) * 2 * currentShakeMagnitude,
  95.             (math.random() - 0.5) * 2 * currentShakeMagnitude,
  96.             (math.random() - 0.5) * 2 * currentShakeMagnitude
  97.         )
  98.  
  99.         shakeDuration = shakeDuration - runService.RenderStepped:Wait()
  100.     else
  101.         runService:UnbindFromRenderStep("CameraShakeUpdate")
  102.     end
  103. end
  104.  
  105. local function onRenderStepped()
  106.     if running then
  107.         updatechar()
  108.         CamPos = CamPos + (TargetCamPos - CamPos) * 0.28
  109.         AngleX = AngleX + (TargetAngleX - AngleX) * 0.35
  110.         local dist = TargetAngleY - AngleY
  111.         dist = math.abs(dist) > 180 and dist - (dist / math.abs(dist)) * 360 or dist
  112.         AngleY = (AngleY + dist * 0.35) % 360
  113.  
  114.         cam.CameraType = Enum.CameraType.Scriptable
  115.         cam.CFrame = CFrame.new(head.Position)
  116.             * CFrame.Angles(0, math.rad(AngleY), 0)
  117.             * CFrame.Angles(math.rad(AngleX), 0, 0)
  118.             * CFrame.new(0, 0.8, 0)
  119.  
  120.         humanoidpart.CFrame = CFrame.new(humanoidpart.Position) * CFrame.Angles(0, math.rad(AngleY), 0)
  121.         character.Humanoid.AutoRotate = false
  122.     else
  123.         game:GetService("UserInputService").MouseBehavior = Enum.MouseBehavior.Default
  124.         character.Humanoid.AutoRotate = true
  125.     end
  126.  
  127.     if (cam.Focus.Position - cam.CFrame.Position).Magnitude < 1 then
  128.         running = false
  129.     else
  130.         running = true
  131.         game:GetService("UserInputService").MouseBehavior = freemouse and Enum.MouseBehavior.Default or Enum.MouseBehavior.LockCenter
  132.     end
  133.  
  134.     cam.FieldOfView = fieldOfView
  135. end
  136.  
  137. function CameraModule.CameraShake(magnitude, duration, fadeInTime, fadeOutTime)
  138.     initialShakeMagnitude = magnitude
  139.     currentShakeMagnitude = magnitude
  140.     shakeDuration = duration
  141.     fadeInDuration = fadeInTime
  142.     fadeOutDuration = fadeOutTime
  143.  
  144.     if isCameraShakeUpdateBound then
  145.         runService:UnbindFromRenderStep("CameraShakeUpdate")
  146.         isCameraShakeUpdateBound = false
  147.     end
  148.  
  149.     if not isCameraShakeUpdateBound then
  150.         runService:BindToRenderStep("CameraShakeUpdate", Enum.RenderPriority.Camera.Value, updateCameraShake)
  151.         isCameraShakeUpdateBound = true
  152.     end
  153. end
  154.  
  155. function CameraModule.reset()
  156.     if uis.TouchEnabled then
  157.         game.Players.LocalPlayer.CameraMaxZoomDistance = 0.5
  158.     elseif uis.MouseEnabled and not uis.GamepadEnabled then
  159.         if not game:GetService("Players").LocalPlayer then return end
  160.         initialize()
  161.         running = true
  162.         game.Players.LocalPlayer.CameraMaxZoomDistance = 16
  163.  
  164.         if not isCameraUpdateBound then
  165.             runService:BindToRenderStep("CameraUpdate", Enum.RenderPriority.Camera.Value, onRenderStepped)
  166.             isCameraUpdateBound = true
  167.         end
  168.     end
  169. end
  170.  
  171. function CameraModule.unlock()
  172.     running = false
  173.     if isCameraUpdateBound then
  174.         runService:UnbindFromRenderStep("CameraUpdate")
  175.         isCameraUpdateBound = false
  176.     end
  177.     if isCameraShakeUpdateBound then
  178.         runService:UnbindFromRenderStep("CameraShakeUpdate")
  179.         isCameraShakeUpdateBound = false
  180.     end
  181. end
  182.  
  183. return CameraModule
  184.  
Advertisement
Add Comment
Please, Sign In to add comment