Advertisement
connor123456700

walking upside down script

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