minimic2002

Gravity Script

Jun 25th, 2020
931
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.29 KB | None | 0 0
  1. --- Minimic2002s Gravity Script
  2.  
  3.  
  4. function CalcGrav(Object1,Object2,Constant)
  5. local Data1 = GetMassData(Object1)
  6. local Data2 = GetMassData(Object2)
  7.  
  8. local D = (Object1.Position-Object2.Position).Magnitude
  9.  
  10. local F = Constant * ((Data1[1]*Data2[1]) / (D*D)) -- Should Give The Force.
  11. local Accel1 = F / Data1[1]
  12. local Accel2 = F / Data2[1]
  13. local GPE1 = Data1[1] * D * Accel1
  14. local GPE2 = Data2[1] * D * Accel2
  15.  
  16. --- Put Results Into A List
  17. local Data1 = {Accel1,GPE1} --Object1
  18. local Data2 = {Accel2,GPE2} -- Object2
  19. -- Put Both Lists In Another List
  20. local Data = {Data1,Data2}
  21. return Data
  22. end
  23.  
  24. function MassCheck(Object)
  25. if Object:IsA("BasePart") then
  26. local M = Object:GetMass()
  27. local CM = Object.CenterOfMass
  28. local Result = {M,CM}
  29. return Result
  30. else
  31. local M = 0
  32. local COM = Vector3.new(0,0,0)
  33. local Result = {M,COM}
  34. return Result
  35. end
  36. end
  37.  
  38.  
  39.  
  40. function GetMassData(Object)
  41. if Object:GetDescendants() then
  42. local DM = DescendantsMass(Object)
  43. local OM = MassCheck(Object)
  44. local M = DM[1] + OM[1]
  45. local COM = DM[2] + OM[2]
  46. local Result = {M,COM}
  47. return Result
  48. else
  49. local Result = MassCheck(Object)
  50. return Result
  51. end
  52. end
  53.  
  54.  
  55.  
  56. function DescendantsMass(Object)
  57. local D = Object:GetDescendants()
  58. local TM = 0
  59. local TCOM = Vector3.new(0,0,0)
  60. for i = 1,#D do
  61. local Mass = MassCheck(Object)
  62. if Mass == nil then
  63. -- Has No Mass
  64. else
  65. local M = Object:GetMass()
  66. local COM = Object.CenterOfMass
  67. TM = TM + M
  68. TCOM = TCOM + COM
  69. end
  70. end
  71. local Result = {TM,TCOM}
  72. return Result
  73. end
  74.  
  75. function CreateGravityObject(Object,Range,Constant,EffectsObject)
  76. local ObjectGrav = coroutine.wrap(function(Object,Range,Constant,EffectsObject)
  77.  
  78. local Grav = Instance.new("Part")
  79. Grav.Name = "GravArea"
  80. Grav.Parent = Object
  81. Grav.Anchored = true
  82. Grav.CanCollide = false
  83. Grav.Size = Vector3.new(Range,Range,Range)
  84. Grav.CFrame = Object.CFrame
  85. Grav.Shape = Enum.PartType.Ball
  86. Grav.Transparency = 0.95
  87. Grav.CastShadow = false
  88.  
  89.  
  90. while true do
  91. wait(.1)
  92.  
  93. Grav.CanCollide = true
  94.  
  95. local Touching = Grav:GetTouchingParts()
  96. Grav.Velocity = Vector3.new(0,0,0)
  97. Grav.CanCollide = false
  98. for i = 1,#Touching do
  99. local P = Touching[i]
  100. if P:IsDescendantOf(Object) then
  101. -- Its The Object
  102. else
  103.  
  104. -- Its Not The Object
  105. local CalcG = CalcGrav(P,Object,Constant)
  106.  
  107. local PData = CalcG[1]
  108. local OData = CalcG[2]
  109.  
  110. local PAccel = PData[1]
  111. local OAccel = OData[1]
  112.  
  113. P.Velocity = P.Velocity + GetV3Vel(P,Object,PAccel)
  114.  
  115.  
  116. if EffectsObject == true then
  117. Object.Velocity = Object.Velocity + GetV3Vel(Object,P,OAccel)
  118.  
  119. end
  120. end
  121. end
  122. end
  123.  
  124.  
  125. end)
  126. ObjectGrav(Object,Range,Constant,EffectsObject)
  127. end
  128.  
  129.  
  130. function GetV3Vel(Object1,Object2,Accel)
  131. local Distance = Object2.Position - Object1.Position
  132. local Tot = (Object2.Position-Object1.Position).Magnitude
  133. local Factor = Tot/Accel
  134.  
  135.  
  136. local V3V = Vector3.new(Factor * Distance.X, Factor * Distance.Y, Factor * Distance.Z)
  137. local Result = V3V / 10
  138. return Result
  139.  
  140.  
  141. end
  142.  
  143. game.Workspace.Gravity = 0
  144. -- Object, Range, Constant, EffectsObject
  145. CreateGravityObject(game.Workspace.Planet,1000,1,false)
Add Comment
Please, Sign In to add comment