InfMods

easy walk upside down script for any roblox game

Sep 23rd, 2022
379
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.27 KB | None | 0 0
  1. step 1: make a local script or serverscriptservice script or just plain script
  2.  
  3. step 2: copy script below
  4.  
  5.  
  6. --]]
  7.  
  8. local ZERO = Vector3.new(0, 0, 0)
  9. local UNIT_X = Vector3.new(1, 0, 0)
  10. local UNIT_Y = Vector3.new(0, 1, 0)
  11. local UNIT_Z = Vector3.new(0, 0, 1)
  12. local VEC_XY = Vector3.new(1, 0, 1)
  13.  
  14. local IDENTITYCF = CFrame.new()
  15.  
  16. local TRANSITION = 0.15
  17. local WALKF = 200 / 3
  18.  
  19. local UIS = game:GetService("UserInputService")
  20. local RUNSERVICE = game:GetService("RunService")
  21.  
  22. local InitObjects = require(script:WaitForChild("InitObjects"))
  23. local StateHandler = require(script:WaitForChild("StateHandler"))
  24. local CameraModifier = require(script:WaitForChild("CameraModifier"))
  25.  
  26. -- Class
  27.  
  28. local GravityController = {}
  29. GravityController.__index = GravityController
  30.  
  31. -- Private Functions
  32.  
  33. local function getRotationBetween(u, v, axis)
  34. local dot, uxv = u:Dot(v), u:Cross(v)
  35. if (dot < -0.99999) then return CFrame.fromAxisAngle(axis, math.pi) end
  36. return CFrame.new(0, 0, 0, uxv.x, uxv.y, uxv.z, 1 + dot)
  37. end
  38.  
  39. local function lookAt(pos, forward, up)
  40. local r = forward:Cross(up)
  41. local u = r:Cross(forward)
  42. return CFrame.fromMatrix(pos, r.Unit, u.Unit)
  43. end
  44.  
  45. local function getMass(array)
  46. local mass = 0
  47. for _, part in next, array do
  48. if (part:IsA("BasePart")) then
  49. mass = mass + part:GetMass()
  50. end
  51. end
  52. return mass
  53. end
  54.  
  55. -- Public Constructor
  56.  
  57. function GravityController.new(player)
  58. local self = setmetatable({}, GravityController)
  59.  
  60. -- Player and character
  61. local playerModule = require(player.PlayerScripts:WaitForChild("PlayerModule"))
  62. self.Controls = playerModule:GetControls()
  63. self.Camera = playerModule:GetCameras()
  64.  
  65. self.Player = player
  66. self.Character = player.Character
  67. self.Humanoid = player.Character:WaitForChild("Humanoid")
  68. self.HRP = player.Character:WaitForChild("HumanoidRootPart")
  69.  
  70. -- Animation
  71. self.Humanoid.PlatformStand = true
  72. self.StateHandler = StateHandler.new(self.Humanoid, self.Character:WaitForChild("Animate"))
  73.  
  74. -- Camera
  75. self.CameraModifier = CameraModifier.new(player)
  76.  
  77. -- Collider and forces
  78. local collider, gyro, vForce = InitObjects(self)
  79.  
  80. self.Collider = collider
  81. self.VForce = vForce
  82. self.Gyro = gyro
  83.  
  84. -- Gravity properties
  85. self.GravityUp = UNIT_Y
  86.  
  87. function self.Camera.GetUpVector(this, oldUpVector)
  88. return self.GravityUp
  89. end
  90.  
  91. -- Events etc
  92. self.CharacterMass = getMass(self.Character:GetDescendants())
  93. self.Character.AncestryChanged:Connect(function() self.CharacterMass = getMass(self.Character:GetDescendants()) end)
  94.  
  95. self.JumpCon = UIS.JumpRequest:Connect(function() self:OnJumpRequest() end)
  96. RUNSERVICE:BindToRenderStep("GravityStep", Enum.RenderPriority.Input.Value + 1, function(dt) self:OnGravityStep(dt) end)
  97.  
  98. return self
  99. end
  100.  
  101. -- Public Methods
  102.  
  103. function GravityController:Destroy()
  104. self.JumpCon:Disconnect()
  105.  
  106. RUNSERVICE:UnbindFromRenderStep("GravityStep")
  107.  
  108. self.CameraModifier:Destroy()
  109. self.Collider:Destroy()
  110. self.VForce:Destroy()
  111. self.Gyro:Destroy()
  112. self.Humanoid.PlatformStand = false
  113.  
  114. self.GravityUp = UNIT_Y
  115. end
  116.  
  117. function GravityController:GetGravityUp(oldGravity)
  118. return oldGravity
  119. end
  120.  
  121. function GravityController:IsGrounded()
  122. local colliderCF = self.Collider.CFrame
  123. local ray = Ray.new(colliderCF.p, -1.05*self.GravityUp)
  124. local hit = workspace:FindPartOnRay(ray, self.Character)
  125. return not not hit
  126. end
  127.  
  128. function GravityController:OnJumpRequest()
  129. if (self:IsGrounded()) then
  130. local hrpVel = self.HRP.Velocity
  131. self.HRP.Velocity = hrpVel + self.GravityUp*self.Humanoid.JumpPower
  132. self.StateHandler:SetState(Enum.HumanoidStateType.Jumping, -math.huge)
  133. end
  134. end
  135.  
  136. function GravityController:OnGravityStep(dt)
  137. -- update gravity up vector
  138. local oldGravity = self.GravityUp
  139. local newGravity = self:GetGravityUp(oldGravity)
  140.  
  141. local rotation = getRotationBetween(oldGravity, newGravity, workspace.CurrentCamera.CFrame.RightVector)
  142. rotation = IDENTITYCF:Lerp(rotation, TRANSITION)
  143.  
  144. self.GravityUp = rotation * oldGravity
  145.  
  146. -- get world move vector
  147. local camCF = workspace.CurrentCamera.CFrame
  148. local fDot = camCF.LookVector:Dot(newGravity)
  149. local cForward = math.abs(fDot) > 0.5 and -math.sign(fDot)*camCF.UpVector or camCF.LookVector
  150.  
  151. local left = cForward:Cross(-newGravity).Unit
  152. local forward = -left:Cross(newGravity).Unit
  153.  
  154. local move = self.Controls:GetMoveVector()
  155. local worldMove = forward*move.z - left*move.x
  156. worldMove = worldMove:Dot(worldMove) > 1 and worldMove.Unit or worldMove
  157.  
  158. local isInputMoving = worldMove:Dot(worldMove) > 0
  159.  
  160. -- get the desired character cframe
  161. local hrpCFLook = self.HRP.CFrame.LookVector
  162. local charF = hrpCFLook:Dot(forward)*forward + hrpCFLook:Dot(left)*left
  163. local charR = charF:Cross(newGravity).Unit
  164. local newCharCF = CFrame.fromMatrix(ZERO, charR, newGravity, -charF)
  165.  
  166. local newCharRotation = IDENTITYCF
  167. if (isInputMoving) then
  168. newCharRotation = IDENTITYCF:Lerp(getRotationBetween(charF, worldMove, newGravity), 0.7)
  169. end
  170.  
  171. -- calculate forces
  172. local gForce = workspace.Gravity * self.CharacterMass * (UNIT_Y - newGravity)
  173.  
  174. local cVelocity = self.HRP.Velocity
  175. local tVelocity = self.Humanoid.WalkSpeed * worldMove
  176. local gVelocity = cVelocity:Dot(newGravity)*newGravity
  177. local hVelocity = cVelocity - gVelocity
  178.  
  179. if (hVelocity:Dot(hVelocity) < 1) then
  180. hVelocity = ZERO
  181. end
  182.  
  183. local dVelocity = tVelocity - hVelocity
  184. local walkForceM = math.min(10000, WALKF * self.CharacterMass * dVelocity.Magnitude)
  185. local walkForce = walkForceM > 0 and dVelocity.Unit*walkForceM or ZERO
  186.  
  187. -- mouse lock
  188. local charRotation = newCharRotation * newCharCF
  189. if (self.CameraModifier.IsCamLocked) then
  190. local lv = workspace.CurrentCamera.CFrame.LookVector
  191. local hlv = lv - charRotation.UpVector:Dot(lv)*charRotation.UpVector
  192. charRotation = lookAt(ZERO, hlv, charRotation.UpVector)
  193. end
  194.  
  195. -- get state
  196. local state, speed = Enum.HumanoidStateType.Running, 0
  197. local isGrounded = self:IsGrounded()
  198.  
  199. if (isGrounded) then
  200. speed = hVelocity.Magnitude
  201. elseif (gVelocity.Magnitude > 10) then
  202. state = Enum.HumanoidStateType.Freefall
  203. end
  204.  
  205. speed = speed < 0.75 and 0 or speed
  206. self.StateHandler:SetState(state, speed)
  207.  
  208. -- update values
  209. self.VForce.Force = walkForce + gForce
  210. self.Gyro.CFrame = charRotation
  211. end
  212.  
  213.  
  214. return GravityController
Advertisement
Add Comment
Please, Sign In to add comment