Advertisement
DiscordPastebins

freecam

Nov 13th, 2024
19
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.72 KB | None | 0 0
  1. local pi = math.pi
  2. local abs = math.abs
  3. local clamp = math.clamp
  4. local exp = math.exp
  5. local rad = math.rad
  6. local sign = math.sign
  7. local sqrt = math.sqrt
  8. local tan = math.tan
  9.  
  10. local ContextActionService = game:GetService("ContextActionService")
  11. local Players = game:GetService("Players")
  12. local RunService = game:GetService("RunService")
  13. local StarterGui = game:GetService("StarterGui")
  14. local UserInputService = game:GetService("UserInputService")
  15. local Workspace = game:GetService("Workspace")
  16. local Settings = UserSettings()
  17. local GameSettings = Settings.GameSettings
  18.  
  19. local LocalPlayer = Players.LocalPlayer
  20. if not LocalPlayer then
  21. Players:GetPropertyChangedSignal("LocalPlayer"):Wait()
  22. LocalPlayer = Players.LocalPlayer
  23. end
  24.  
  25. local Camera = Workspace.CurrentCamera
  26. Workspace:GetPropertyChangedSignal("CurrentCamera"):Connect(function()
  27. local newCamera = Workspace.CurrentCamera
  28. if newCamera then
  29. Camera = newCamera
  30. end
  31. end)
  32.  
  33. local FFlagUserExitFreecamBreaksWithShiftlock
  34. do
  35. local success, result = pcall(function()
  36. return UserSettings():IsUserFeatureEnabled("UserExitFreecamBreaksWithShiftlock")
  37. end)
  38. FFlagUserExitFreecamBreaksWithShiftlock = success and result
  39. end
  40.  
  41. ------------------------------------------------------------------------
  42.  
  43. local TOGGLE_INPUT_PRIORITY = Enum.ContextActionPriority.Low.Value
  44. local INPUT_PRIORITY = Enum.ContextActionPriority.High.Value
  45. local FREECAM_MACRO_KB = {Enum.KeyCode.LeftShift, Enum.KeyCode.P}
  46.  
  47. local NAV_GAIN = Vector3.new(1, 1, 1)*64
  48. local PAN_GAIN = Vector2.new(0.75, 1)*8
  49. local FOV_GAIN = 300
  50.  
  51. local PITCH_LIMIT = rad(90)
  52.  
  53. local VEL_STIFFNESS = 1.5
  54. local PAN_STIFFNESS = 1.0
  55. local FOV_STIFFNESS = 4.0
  56.  
  57. ------------------------------------------------------------------------
  58.  
  59. local Spring = {} do
  60. Spring.__index = Spring
  61.  
  62. function Spring.new(freq, pos)
  63. local self = setmetatable({}, Spring)
  64. self.f = freq
  65. self.p = pos
  66. self.v = pos*0
  67. return self
  68. end
  69.  
  70. function Spring:Update(dt, goal)
  71. local f = self.f*2*pi
  72. local p0 = self.p
  73. local v0 = self.v
  74.  
  75. local offset = goal - p0
  76. local decay = exp(-f*dt)
  77.  
  78. local p1 = goal + (v0*dt - offset*(f*dt + 1))*decay
  79. local v1 = (f*dt*(offset*f - v0) + v0)*decay
  80.  
  81. self.p = p1
  82. self.v = v1
  83.  
  84. return p1
  85. end
  86.  
  87. function Spring:Reset(pos)
  88. self.p = pos
  89. self.v = pos*0
  90. end
  91. end
  92.  
  93. ------------------------------------------------------------------------
  94.  
  95. local cameraPos = Vector3.new()
  96. local cameraRot = Vector2.new()
  97. local cameraFov = 0
  98.  
  99. local velSpring = Spring.new(VEL_STIFFNESS, Vector3.new())
  100. local panSpring = Spring.new(PAN_STIFFNESS, Vector2.new())
  101. local fovSpring = Spring.new(FOV_STIFFNESS, 0)
  102.  
  103. ------------------------------------------------------------------------
  104.  
  105. local Input = {} do
  106. local thumbstickCurve do
  107. local K_CURVATURE = 2.0
  108. local K_DEADZONE = 0.15
  109.  
  110. local function fCurve(x)
  111. return (exp(K_CURVATURE*x) - 1)/(exp(K_CURVATURE) - 1)
  112. end
  113.  
  114. local function fDeadzone(x)
  115. return fCurve((x - K_DEADZONE)/(1 - K_DEADZONE))
  116. end
  117.  
  118. function thumbstickCurve(x)
  119. return sign(x)*clamp(fDeadzone(abs(x)), 0, 1)
  120. end
  121. end
  122.  
  123. local gamepad = {
  124. ButtonX = 0,
  125. ButtonY = 0,
  126. DPadDown = 0,
  127. DPadUp = 0,
  128. ButtonL2 = 0,
  129. ButtonR2 = 0,
  130. Thumbstick1 = Vector2.new(),
  131. Thumbstick2 = Vector2.new(),
  132. }
  133.  
  134. local keyboard = {
  135. W = 0,
  136. A = 0,
  137. S = 0,
  138. D = 0,
  139. E = 0,
  140. Q = 0,
  141. U = 0,
  142. H = 0,
  143. J = 0,
  144. K = 0,
  145. I = 0,
  146. Y = 0,
  147. Up = 0,
  148. Down = 0,
  149. LeftShift = 0,
  150. RightShift = 0,
  151. }
  152.  
  153. local mouse = {
  154. Delta = Vector2.new(),
  155. MouseWheel = 0,
  156. }
  157.  
  158. local NAV_GAMEPAD_SPEED = Vector3.new(1, 1, 1)
  159. local NAV_KEYBOARD_SPEED = Vector3.new(1, 1, 1)
  160. local PAN_MOUSE_SPEED = Vector2.new(1, 1)*(pi/64)
  161. local PAN_GAMEPAD_SPEED = Vector2.new(1, 1)*(pi/8)
  162. local FOV_WHEEL_SPEED = 1.0
  163. local FOV_GAMEPAD_SPEED = 0.25
  164. local NAV_ADJ_SPEED = 0.75
  165. local NAV_SHIFT_MUL = 0.25
  166.  
  167. local navSpeed = 1
  168.  
  169. function Input.Vel(dt)
  170. navSpeed = clamp(navSpeed + dt*(keyboard.Up - keyboard.Down)*NAV_ADJ_SPEED, 0.01, 4)
  171.  
  172. local kGamepad = Vector3.new(
  173. thumbstickCurve(gamepad.Thumbstick1.X),
  174. thumbstickCurve(gamepad.ButtonR2) - thumbstickCurve(gamepad.ButtonL2),
  175. thumbstickCurve(-gamepad.Thumbstick1.Y)
  176. )*NAV_GAMEPAD_SPEED
  177.  
  178. local kKeyboard = Vector3.new(
  179. keyboard.D - keyboard.A + keyboard.K - keyboard.H,
  180. keyboard.E - keyboard.Q + keyboard.I - keyboard.Y,
  181. keyboard.S - keyboard.W + keyboard.J - keyboard.U
  182. )*NAV_KEYBOARD_SPEED
  183.  
  184. local shift = UserInputService:IsKeyDown(Enum.KeyCode.LeftShift) or UserInputService:IsKeyDown(Enum.KeyCode.RightShift)
  185.  
  186. return (kGamepad + kKeyboard)*(navSpeed*(shift and NAV_SHIFT_MUL or 1))
  187. end
  188.  
  189. function Input.Pan(dt)
  190. local kGamepad = Vector2.new(
  191. thumbstickCurve(gamepad.Thumbstick2.Y),
  192. thumbstickCurve(-gamepad.Thumbstick2.X)
  193. )*PAN_GAMEPAD_SPEED
  194. local kMouse = mouse.Delta*PAN_MOUSE_SPEED
  195. mouse.Delta = Vector2.new()
  196. return kGamepad + kMouse
  197. end
  198.  
  199. function Input.Fov(dt)
  200. local kGamepad = (gamepad.ButtonX - gamepad.ButtonY)*FOV_GAMEPAD_SPEED
  201. local kMouse = mouse.MouseWheel*FOV_WHEEL_SPEED
  202. mouse.MouseWheel = 0
  203. return kGamepad + kMouse
  204. end
  205.  
  206. do
  207. local function Keypress(action, state, input)
  208. keyboard[input.KeyCode.Name] = state == Enum.UserInputState.Begin and 1 or 0
  209. return Enum.ContextActionResult.Sink
  210. end
  211.  
  212. local function GpButton(action, state, input)
  213. gamepad[input.KeyCode.Name] = state == Enum.UserInputState.Begin and 1 or 0
  214. return Enum.ContextActionResult.Sink
  215. end
  216.  
  217. local function MousePan(action, state, input)
  218. local delta = input.Delta
  219. mouse.Delta = Vector2.new(-delta.y, -delta.x)
  220. return Enum.ContextActionResult.Sink
  221. end
  222.  
  223. local function Thumb(action, state, input)
  224. gamepad[input.KeyCode.Name] = input.Position
  225. return Enum.ContextActionResult.Sink
  226. end
  227.  
  228. local function Trigger(action, state, input)
  229. gamepad[input.KeyCode.Name] = input.Position.z
  230. return Enum.ContextActionResult.Sink
  231. end
  232.  
  233. local function MouseWheel(action, state, input)
  234. mouse[input.UserInputType.Name] = -input.Position.z
  235. return Enum.ContextActionResult.Sink
  236. end
  237.  
  238. local function Zero(t)
  239. for k, v in pairs(t) do
  240. t[k] = v*0
  241. end
  242. end
  243.  
  244. function Input.StartCapture()
  245. ContextActionService:BindActionAtPriority("FreecamKeyboard", Keypress, false, INPUT_PRIORITY,
  246. Enum.KeyCode.W, Enum.KeyCode.U,
  247. Enum.KeyCode.A, Enum.KeyCode.H,
  248. Enum.KeyCode.S, Enum.KeyCode.J,
  249. Enum.KeyCode.D, Enum.KeyCode.K,
  250. Enum.KeyCode.E, Enum.KeyCode.I,
  251. Enum.KeyCode.Q, Enum.KeyCode.Y,
  252. Enum.KeyCode.Up, Enum.KeyCode.Down
  253. )
  254. ContextActionService:BindActionAtPriority("FreecamMousePan", MousePan, false, INPUT_PRIORITY, Enum.UserInputType.MouseMovement)
  255. ContextActionService:BindActionAtPriority("FreecamMouseWheel", MouseWheel, false, INPUT_PRIORITY, Enum.UserInputType.MouseWheel)
  256. ContextActionService:BindActionAtPriority("FreecamGamepadButton", GpButton, false, INPUT_PRIORITY, Enum.KeyCode.ButtonX, Enum.KeyCode.ButtonY)
  257. ContextActionService:BindActionAtPriority("FreecamGamepadTrigger", Trigger, false, INPUT_PRIORITY, Enum.KeyCode.ButtonR2, Enum.KeyCode.ButtonL2)
  258. ContextActionService:BindActionAtPriority("FreecamGamepadThumbstick", Thumb, false, INPUT_PRIORITY, Enum.KeyCode.Thumbstick1, Enum.KeyCode.Thumbstick2)
  259. end
  260.  
  261. function Input.StopCapture()
  262. navSpeed = 1
  263. Zero(gamepad)
  264. Zero(keyboard)
  265. Zero(mouse)
  266. ContextActionService:UnbindAction("FreecamKeyboard")
  267. ContextActionService:UnbindAction("FreecamMousePan")
  268. ContextActionService:UnbindAction("FreecamMouseWheel")
  269. ContextActionService:UnbindAction("FreecamGamepadButton")
  270. ContextActionService:UnbindAction("FreecamGamepadTrigger")
  271. ContextActionService:UnbindAction("FreecamGamepadThumbstick")
  272. end
  273. end
  274. end
  275.  
  276. local function GetFocusDistance(cameraFrame)
  277. local znear = 0.1
  278. local viewport = Camera.ViewportSize
  279. local projy = 2*tan(cameraFov/2)
  280. local projx = viewport.x/viewport.y*projy
  281. local fx = cameraFrame.rightVector
  282. local fy = cameraFrame.upVector
  283. local fz = cameraFrame.lookVector
  284.  
  285. local minVect = Vector3.new()
  286. local minDist = 512
  287.  
  288. for x = 0, 1, 0.5 do
  289. for y = 0, 1, 0.5 do
  290. local cx = (x - 0.5)*projx
  291. local cy = (y - 0.5)*projy
  292. local offset = fx*cx - fy*cy + fz
  293. local origin = cameraFrame.p + offset*znear
  294. local _, hit = Workspace:FindPartOnRay(Ray.new(origin, offset.unit*minDist))
  295. local dist = (hit - origin).magnitude
  296. if minDist > dist then
  297. minDist = dist
  298. minVect = offset.unit
  299. end
  300. end
  301. end
  302.  
  303. return fz:Dot(minVect)*minDist
  304. end
  305.  
  306. ------------------------------------------------------------------------
  307.  
  308. local function StepFreecam(dt)
  309. local vel = velSpring:Update(dt, Input.Vel(dt))
  310. local pan = panSpring:Update(dt, Input.Pan(dt))
  311. local fov = fovSpring:Update(dt, Input.Fov(dt))
  312.  
  313. local zoomFactor = sqrt(tan(rad(70/2))/tan(rad(cameraFov/2)))
  314.  
  315. cameraFov = clamp(cameraFov + fov*FOV_GAIN*(dt/zoomFactor), 1, 120)
  316. cameraRot = cameraRot + pan*PAN_GAIN*(dt/zoomFactor)
  317. cameraRot = Vector2.new(clamp(cameraRot.x, -PITCH_LIMIT, PITCH_LIMIT), cameraRot.y%(2*pi))
  318.  
  319. local cameraCFrame = CFrame.new(cameraPos)*CFrame.fromOrientation(cameraRot.x, cameraRot.y, 0)*CFrame.new(vel*NAV_GAIN*dt)
  320. cameraPos = cameraCFrame.p
  321.  
  322. Camera.CFrame = cameraCFrame
  323. Camera.Focus = cameraCFrame*CFrame.new(0, 0, -GetFocusDistance(cameraCFrame))
  324. Camera.FieldOfView = cameraFov
  325. end
  326.  
  327. local function CheckMouseLockAvailability()
  328. local devAllowsMouseLock = Players.LocalPlayer.DevEnableMouseLock
  329. local devMovementModeIsScriptable = Players.LocalPlayer.DevComputerMovementMode == Enum.DevComputerMovementMode.Scriptable
  330. local userHasMouseLockModeEnabled = GameSettings.ControlMode == Enum.ControlMode.MouseLockSwitch
  331. local userHasClickToMoveEnabled = GameSettings.ComputerMovementMode == Enum.ComputerMovementMode.ClickToMove
  332. local MouseLockAvailable = devAllowsMouseLock and userHasMouseLockModeEnabled and not userHasClickToMoveEnabled and not devMovementModeIsScriptable
  333.  
  334. return MouseLockAvailable
  335. end
  336.  
  337. ------------------------------------------------------------------------
  338.  
  339. local PlayerState = {} do
  340. local mouseBehavior
  341. local mouseIconEnabled
  342. local cameraType
  343. local cameraFocus
  344. local cameraCFrame
  345. local cameraFieldOfView
  346. local screenGuis = {}
  347. local coreGuis = {
  348. Backpack = true,
  349. Chat = true,
  350. Health = true,
  351. PlayerList = true,
  352. }
  353. local setCores = {
  354. BadgesNotificationsActive = true,
  355. PointsNotificationsActive = true,
  356. }
  357.  
  358. -- Save state and set up for freecam
  359. function PlayerState.Push()
  360. for name in pairs(coreGuis) do
  361. coreGuis[name] = StarterGui:GetCoreGuiEnabled(Enum.CoreGuiType[name])
  362. StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType[name], false)
  363. end
  364. for name in pairs(setCores) do
  365. setCores[name] = StarterGui:GetCore(name)
  366. StarterGui:SetCore(name, false)
  367. end
  368. local playergui = LocalPlayer:FindFirstChildOfClass("PlayerGui")
  369. if playergui then
  370. for _, gui in pairs(playergui:GetChildren()) do
  371. if gui:IsA("ScreenGui") and gui.Enabled then
  372. screenGuis[#screenGuis + 1] = gui
  373. gui.Enabled = false
  374. end
  375. end
  376. end
  377.  
  378. cameraFieldOfView = Camera.FieldOfView
  379. Camera.FieldOfView = 70
  380.  
  381. cameraType = Camera.CameraType
  382. Camera.CameraType = Enum.CameraType.Custom
  383.  
  384. cameraCFrame = Camera.CFrame
  385. cameraFocus = Camera.Focus
  386.  
  387. mouseIconEnabled = UserInputService.MouseIconEnabled
  388. UserInputService.MouseIconEnabled = false
  389.  
  390. if FFlagUserExitFreecamBreaksWithShiftlock and CheckMouseLockAvailability() then
  391. mouseBehavior = Enum.MouseBehavior.Default
  392. else
  393. mouseBehavior = UserInputService.MouseBehavior
  394. end
  395. UserInputService.MouseBehavior = Enum.MouseBehavior.Default
  396. end
  397.  
  398. -- Restore state
  399. function PlayerState.Pop()
  400. for name, isEnabled in pairs(coreGuis) do
  401. StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType[name], isEnabled)
  402. end
  403. for name, isEnabled in pairs(setCores) do
  404. StarterGui:SetCore(name, isEnabled)
  405. end
  406. for _, gui in pairs(screenGuis) do
  407. if gui.Parent then
  408. gui.Enabled = true
  409. end
  410. end
  411.  
  412. Camera.FieldOfView = cameraFieldOfView
  413. cameraFieldOfView = nil
  414.  
  415. Camera.CameraType = cameraType
  416. cameraType = nil
  417.  
  418. Camera.CFrame = cameraCFrame
  419. cameraCFrame = nil
  420.  
  421. Camera.Focus = cameraFocus
  422. cameraFocus = nil
  423.  
  424. UserInputService.MouseIconEnabled = mouseIconEnabled
  425. mouseIconEnabled = nil
  426.  
  427. UserInputService.MouseBehavior = mouseBehavior
  428. mouseBehavior = nil
  429. end
  430. end
  431.  
  432. local function StartFreecam()
  433. local cameraCFrame = Camera.CFrame
  434. cameraRot = Vector2.new(cameraCFrame:toEulerAnglesYXZ())
  435. cameraPos = cameraCFrame.p
  436. cameraFov = Camera.FieldOfView
  437.  
  438. velSpring:Reset(Vector3.new())
  439. panSpring:Reset(Vector2.new())
  440. fovSpring:Reset(0)
  441.  
  442. PlayerState.Push()
  443. RunService:BindToRenderStep("Freecam", Enum.RenderPriority.Camera.Value, StepFreecam)
  444. Input.StartCapture()
  445. end
  446.  
  447. local function StopFreecam()
  448. Input.StopCapture()
  449. RunService:UnbindFromRenderStep("Freecam")
  450. PlayerState.Pop()
  451. end
  452.  
  453. do
  454. local enabled = false
  455.  
  456. local function ToggleFreecam()
  457. if enabled then
  458. StopFreecam()
  459. else
  460. StartFreecam()
  461. end
  462. enabled = not enabled
  463. end
  464.  
  465. local function CheckMacro(macro)
  466. for i = 1, #macro - 1 do
  467. if not UserInputService:IsKeyDown(macro[i]) then
  468. return
  469. end
  470. end
  471. ToggleFreecam()
  472. end
  473.  
  474. local function HandleActivationInput(action, state, input)
  475. if state == Enum.UserInputState.Begin then
  476. if input.KeyCode == FREECAM_MACRO_KB[#FREECAM_MACRO_KB] then
  477. CheckMacro(FREECAM_MACRO_KB)
  478. end
  479. end
  480. return Enum.ContextActionResult.Pass
  481. end
  482.  
  483. ContextActionService:BindActionAtPriority("FreecamToggle", HandleActivationInput, false, TOGGLE_INPUT_PRIORITY, FREECAM_MACRO_KB[#FREECAM_MACRO_KB])
  484. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement