Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --- Minimic2002s Gravity Script
- function CalcGrav(Object1,Object2,Constant)
- local Data1 = GetMassData(Object1)
- local Data2 = GetMassData(Object2)
- local D = (Object1.Position-Object2.Position).Magnitude
- local F = Constant * ((Data1[1]*Data2[1]) / (D*D)) -- Should Give The Force.
- local Accel1 = F / Data1[1]
- local Accel2 = F / Data2[1]
- local GPE1 = Data1[1] * D * Accel1
- local GPE2 = Data2[1] * D * Accel2
- --- Put Results Into A List
- local Data1 = {Accel1,GPE1} --Object1
- local Data2 = {Accel2,GPE2} -- Object2
- -- Put Both Lists In Another List
- local Data = {Data1,Data2}
- return Data
- end
- function MassCheck(Object)
- if Object:IsA("BasePart") then
- local M = Object:GetMass()
- local CM = Object.CenterOfMass
- local Result = {M,CM}
- return Result
- else
- local M = 0
- local COM = Vector3.new(0,0,0)
- local Result = {M,COM}
- return Result
- end
- end
- function GetMassData(Object)
- if Object:GetDescendants() then
- local DM = DescendantsMass(Object)
- local OM = MassCheck(Object)
- local M = DM[1] + OM[1]
- local COM = DM[2] + OM[2]
- local Result = {M,COM}
- return Result
- else
- local Result = MassCheck(Object)
- return Result
- end
- end
- function DescendantsMass(Object)
- local D = Object:GetDescendants()
- local TM = 0
- local TCOM = Vector3.new(0,0,0)
- for i = 1,#D do
- local Mass = MassCheck(Object)
- if Mass == nil then
- -- Has No Mass
- else
- local M = Object:GetMass()
- local COM = Object.CenterOfMass
- TM = TM + M
- TCOM = TCOM + COM
- end
- end
- local Result = {TM,TCOM}
- return Result
- end
- function CreateGravityObject(Object,Range,Constant,EffectsObject)
- local ObjectGrav = coroutine.wrap(function(Object,Range,Constant,EffectsObject)
- local Grav = Instance.new("Part")
- Grav.Name = "GravArea"
- Grav.Parent = Object
- Grav.Anchored = true
- Grav.CanCollide = false
- Grav.Size = Vector3.new(Range,Range,Range)
- Grav.CFrame = Object.CFrame
- Grav.Shape = Enum.PartType.Ball
- Grav.Transparency = 0.95
- Grav.CastShadow = false
- while true do
- wait(.1)
- Grav.CanCollide = true
- local Touching = Grav:GetTouchingParts()
- Grav.Velocity = Vector3.new(0,0,0)
- Grav.CanCollide = false
- for i = 1,#Touching do
- local P = Touching[i]
- if P:IsDescendantOf(Object) then
- -- Its The Object
- else
- -- Its Not The Object
- local CalcG = CalcGrav(P,Object,Constant)
- local PData = CalcG[1]
- local OData = CalcG[2]
- local PAccel = PData[1]
- local OAccel = OData[1]
- P.Velocity = P.Velocity + GetV3Vel(P,Object,PAccel)
- if EffectsObject == true then
- Object.Velocity = Object.Velocity + GetV3Vel(Object,P,OAccel)
- end
- end
- end
- end
- end)
- ObjectGrav(Object,Range,Constant,EffectsObject)
- end
- function GetV3Vel(Object1,Object2,Accel)
- local Distance = Object2.Position - Object1.Position
- local Tot = (Object2.Position-Object1.Position).Magnitude
- local Factor = Tot/Accel
- local V3V = Vector3.new(Factor * Distance.X, Factor * Distance.Y, Factor * Distance.Z)
- local Result = V3V / 10
- return Result
- end
- game.Workspace.Gravity = 0
- -- Object, Range, Constant, EffectsObject
- CreateGravityObject(game.Workspace.Planet,1000,1,false)
Add Comment
Please, Sign In to add comment