Advertisement
1m1m0

Blackhole v4.33

Feb 13th, 2024
1,729
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.43 KB | Source Code | 0 0
  1. -- MAIN BLACKHOLE v4.33 SCRIPT (Blackhole Classing + New Absorption Customization - Universal Settings) --
  2. -- Barebones:
  3.  
  4. local hole = script.Parent
  5.  
  6. -- BLACKHOLE CLASSING --
  7.  
  8. -- ↓ Blackhole Class Preset (Set one of them to true!) ↓ --
  9. local subStellarPreset = true    -- Sub-stellar preset (3x weaker than default). Perfect for satisfying simulations
  10. local stellarPreset = false      -- Stellar preset (Default). Somewhat accurate simulations
  11. local supermassivePreset = false -- Supermassive preset (3x stronger than default). Intense simulations (Requires a beefy computer)
  12.  
  13. -- SUB-STELLAR Preset Settings --
  14. local subStellarGravitationalConstant = 333             -- Gravitational/Pulling strength
  15. local subStellarEventHorizonDistance = hole.Size.X / 15 -- Event Horizon distance (Prevents objects from going too fast)
  16. local subStellarSizeIncreaseFactor = 0.003              -- Size increment for each absorbed part
  17. local subStellarProportionalGravity = true              -- Allow gravity to match the black hole's size
  18. local subStellarAdjustEventHorizon = false              -- Allow the Event Horizon distance to match the black hole's size
  19. local subStellarIsAbsorptionEnabled = true              -- Allow the black hole to consume objects
  20. local subStellarKillPlayers = true                      -- Allow the black hole to consume players
  21. local subStellarWeldRemovalZoneSize = hole.Size.X * 2   -- Distance where welds/joints are broken
  22.  
  23. -- STELLAR (Default) Preset Settings -- The Default Setting --
  24. local stellarGravitationalConstant = 1000
  25. local stellarEventHorizonDistance = hole.Size.X / 5
  26. local stellarSizeIncreaseFactor = 0.01
  27. local stellarProportionalGravity = true
  28. local stellarAdjustEventHorizon = false
  29. local stellarIsAbsorptionEnabled = true
  30. local stellarKillPlayers = true
  31. local stellarWeldRemovalZoneSize = hole.Size.X * 4
  32.  
  33. -- SUPERMASSIVE Preset Settings --
  34. local supermassiveGravitationalConstant = 3000 -- Modify as needed
  35. local supermassiveEventHorizonDistance = hole.Size.X / 2
  36. local supermassiveSizeIncreaseFactor = 0.03
  37. local supermassiveProportionalGravity = true
  38. local supermassiveAdjustEventHorizon = false
  39. local supermassiveIsAbsorptionEnabled = true
  40. local supermassiveKillPlayers = true
  41. local supermassiveWeldRemovalZoneSize = hole.Size.X * 6
  42.  
  43. local absorbedParts = {} -- Store absorbed parts
  44.  
  45. -- Determine the class preset based on the chosen presets
  46. local presetValues = {
  47.     subStellarPreset,
  48.     stellarPreset,
  49.     supermassivePreset,
  50. }
  51.  
  52. local numTruePresets = 0
  53. local chosenPresetIndex = 2 -- Default to Stellar
  54.  
  55. for i, isPresetTrue in ipairs(presetValues) do
  56.     if isPresetTrue then
  57.         numTruePresets = numTruePresets + 1
  58.         chosenPresetIndex = i
  59.     end
  60. end
  61.  
  62. if numTruePresets > 1 then
  63.     -- More than one preset is set to true, choose the lowest classing (Sub-Stellar)
  64.     chosenPresetIndex = 1
  65. elseif numTruePresets == 0 then
  66.     -- None are set to true, choose the default (Stellar)
  67.     chosenPresetIndex = 2
  68. end
  69.  
  70. subStellarPreset = chosenPresetIndex == 1
  71. stellarPreset = chosenPresetIndex == 2
  72. supermassivePreset = chosenPresetIndex == 3
  73.  
  74. local gravitationalConstant
  75. local eventHorizonDistance
  76. local sizeIncreaseFactor
  77. local proportionalGravity
  78. local adjustEventHorizon
  79. local isAbsorptionEnabled
  80. local killPlayers
  81. local weldRemovalZoneSize
  82.  
  83. local function SetSubStellarPreset()
  84.     gravitationalConstant = subStellarGravitationalConstant
  85.     eventHorizonDistance = subStellarEventHorizonDistance
  86.     sizeIncreaseFactor = subStellarSizeIncreaseFactor
  87.     proportionalGravity = subStellarProportionalGravity
  88.     adjustEventHorizon = subStellarAdjustEventHorizon
  89.     isAbsorptionEnabled = subStellarIsAbsorptionEnabled
  90.     killPlayers = subStellarKillPlayers
  91.     weldRemovalZoneSize = subStellarWeldRemovalZoneSize
  92. end
  93.  
  94. local function SetStellarPreset()
  95.     gravitationalConstant = stellarGravitationalConstant
  96.     eventHorizonDistance = stellarEventHorizonDistance
  97.     sizeIncreaseFactor = stellarSizeIncreaseFactor
  98.     proportionalGravity = stellarProportionalGravity
  99.     adjustEventHorizon = stellarAdjustEventHorizon
  100.     isAbsorptionEnabled = stellarIsAbsorptionEnabled
  101.     killPlayers = stellarKillPlayers
  102.     weldRemovalZoneSize = stellarWeldRemovalZoneSize
  103. end
  104.  
  105. local function SetSupermassivePreset()
  106.     gravitationalConstant = supermassiveGravitationalConstant
  107.     eventHorizonDistance = supermassiveEventHorizonDistance
  108.     sizeIncreaseFactor = supermassiveSizeIncreaseFactor
  109.     proportionalGravity = supermassiveProportionalGravity
  110.     adjustEventHorizon = supermassiveAdjustEventHorizon
  111.     isAbsorptionEnabled = supermassiveIsAbsorptionEnabled
  112.     killPlayers = supermassiveKillPlayers
  113.     weldRemovalZoneSize = supermassiveWeldRemovalZoneSize
  114. end
  115.  
  116. if subStellarPreset then
  117.     SetSubStellarPreset()
  118. elseif stellarPreset then
  119.     SetStellarPreset()
  120. elseif supermassivePreset then
  121.     SetSupermassivePreset()
  122. end
  123.  
  124. -- CLASSIC GRAVITY MODE
  125.  
  126. local function ApplyGravity(object)
  127.     local direction = hole.Position - object.Position
  128.     local distance = direction.Magnitude
  129.     local forceMagnitude
  130.  
  131.     if proportionalGravity then
  132.         forceMagnitude = (gravitationalConstant * hole.Size.X * object.Size.X) / (distance * distance)
  133.     else
  134.         forceMagnitude = gravitationalConstant
  135.     end
  136.  
  137.     local force = direction.Unit * forceMagnitude
  138.  
  139.     object.Velocity = object.Velocity + force
  140. end
  141.  
  142. --[[ EXPERIMENTAL GRAVITY (With grouped object/s support)
  143.  
  144. function ApplyGravity(object)
  145.     local direction = hole.Position - object.Position
  146.     local distance = direction.Magnitude
  147.     local forceMagnitude
  148.  
  149.     if proportionalGravity then
  150.         forceMagnitude = (gravitationalConstant * hole.Size.X * object.Size.X) / (distance * distance)
  151.     else
  152.         forceMagnitude = gravitationalConstant -- Use custom gravitational constant
  153.     end
  154.  
  155.     local force = direction.Unit * forceMagnitude
  156.  
  157.     -- Apply force using BodyForce instead of setting velocity directly
  158.     local bodyForce = object:FindFirstChildOfClass("BodyForce") or Instance.new("BodyForce")
  159.     bodyForce.Force = force
  160.     bodyForce.Name = "BlackHoleForce"
  161.  
  162.     -- Attach BodyForce to object
  163.     bodyForce.Parent = object
  164. end
  165.  
  166. --]]
  167.  
  168. local function CheckAndApplyGravity(obj)
  169.     if not obj:IsA("BasePart") or obj:IsA("Model") or obj:IsA("Union") or obj:IsA("UnionOperation") or obj:IsA("Tool") or obj:IsA("MeshPart") or obj:IsA("Mesh") then
  170.         return
  171.     end -- Add more classnames if targeted if not all objects are pulled
  172.  
  173.     if obj == hole then
  174.         return -- Excludes the black hole itself from gravitational pull
  175.     end
  176.  
  177.     if obj:IsA("Player") and not killPlayers then
  178.         return -- Exclude players from being affected by the black hole if killing players is disabled
  179.     end
  180.  
  181.     if obj.Anchored then
  182.         return -- Prevents black hole from applying gravity to anchored objects
  183.     end
  184.  
  185.     local distanceToHole = (hole.Position - obj.Position).Magnitude
  186.     if distanceToHole < eventHorizonDistance then
  187.         return -- Exclude objects within the event horizon from gravitational pull
  188.     end
  189.  
  190.     ApplyGravity(obj)
  191.  
  192.     local distanceToWeldRemovalZone = (hole.Position - obj.Position).Magnitude
  193.     if distanceToWeldRemovalZone < weldRemovalZoneSize then
  194.         obj:BreakJoints() -- Break joints for objects within the weld removal zone
  195.     end
  196. end
  197.  
  198. game:GetService("RunService").Heartbeat:Connect(function()
  199.     for _, object in pairs(game.Workspace:GetDescendants()) do
  200.         CheckAndApplyGravity(object)
  201.     end
  202. end)
  203.  
  204. function onTouch(part)
  205.     local humanoid = part.Parent:FindFirstChild("Humanoid")
  206.     if humanoid then
  207.         humanoid.Health = 0
  208.     end
  209.  
  210.     part.CanCollide = true
  211. end
  212.  
  213. function onTouched(part)
  214.     if not isAbsorptionEnabled then
  215.         return
  216.     end
  217.  
  218.     if part.Anchored then
  219.         return
  220.     end
  221.  
  222.     -- ABSORPTION CUSTOMIZATION (How object will be absorbed)
  223.     part.BrickColor = BrickColor.new(0) -- Color it changes into before getting deleted (White is default)
  224.     part.Material = Enum.Material.Neon  -- Material it changes into before getting deleted (Neon is default)
  225.     part.Anchored = true                -- Anchor/Unanchor every object that enters the Event Horizon zone
  226.     part.CanCollide = false             -- Make object pass through each other (Setting it to true is not recommended!)
  227.  
  228.     local transparencySteps = {0.25, 0.5, 0.75} -- Transparency changes (Appearing to fade out of reality)
  229.     for _, transparency in ipairs(transparencySteps) do
  230.         part.Transparency = transparency
  231.         wait(0.01) -- How long the fading will last (In seconds) on each transparency increment
  232.     end
  233.  
  234.     part:Destroy()
  235.  
  236.     hole.Size = hole.Size + Vector3.new(sizeIncreaseFactor, sizeIncreaseFactor, sizeIncreaseFactor)
  237.  
  238.     if adjustEventHorizon then
  239.         eventHorizonDistance = hole.Size.X
  240.     end
  241. end
  242.  
  243. local connection = hole.Touched:Connect(onTouched)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement