Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- MAIN BLACKHOLE v4.33 SCRIPT (Blackhole Classing + New Absorption Customization - Universal Settings) --
- -- Barebones:
- local hole = script.Parent
- -- BLACKHOLE CLASSING --
- -- ↓ Blackhole Class Preset (Set one of them to true!) ↓ --
- local subStellarPreset = true -- Sub-stellar preset (3x weaker than default). Perfect for satisfying simulations
- local stellarPreset = false -- Stellar preset (Default). Somewhat accurate simulations
- local supermassivePreset = false -- Supermassive preset (3x stronger than default). Intense simulations (Requires a beefy computer)
- -- SUB-STELLAR Preset Settings --
- local subStellarGravitationalConstant = 333 -- Gravitational/Pulling strength
- local subStellarEventHorizonDistance = hole.Size.X / 15 -- Event Horizon distance (Prevents objects from going too fast)
- local subStellarSizeIncreaseFactor = 0.003 -- Size increment for each absorbed part
- local subStellarProportionalGravity = true -- Allow gravity to match the black hole's size
- local subStellarAdjustEventHorizon = false -- Allow the Event Horizon distance to match the black hole's size
- local subStellarIsAbsorptionEnabled = true -- Allow the black hole to consume objects
- local subStellarKillPlayers = true -- Allow the black hole to consume players
- local subStellarWeldRemovalZoneSize = hole.Size.X * 2 -- Distance where welds/joints are broken
- -- STELLAR (Default) Preset Settings -- The Default Setting --
- local stellarGravitationalConstant = 1000
- local stellarEventHorizonDistance = hole.Size.X / 5
- local stellarSizeIncreaseFactor = 0.01
- local stellarProportionalGravity = true
- local stellarAdjustEventHorizon = false
- local stellarIsAbsorptionEnabled = true
- local stellarKillPlayers = true
- local stellarWeldRemovalZoneSize = hole.Size.X * 4
- -- SUPERMASSIVE Preset Settings --
- local supermassiveGravitationalConstant = 3000 -- Modify as needed
- local supermassiveEventHorizonDistance = hole.Size.X / 2
- local supermassiveSizeIncreaseFactor = 0.03
- local supermassiveProportionalGravity = true
- local supermassiveAdjustEventHorizon = false
- local supermassiveIsAbsorptionEnabled = true
- local supermassiveKillPlayers = true
- local supermassiveWeldRemovalZoneSize = hole.Size.X * 6
- local absorbedParts = {} -- Store absorbed parts
- -- Determine the class preset based on the chosen presets
- local presetValues = {
- subStellarPreset,
- stellarPreset,
- supermassivePreset,
- }
- local numTruePresets = 0
- local chosenPresetIndex = 2 -- Default to Stellar
- for i, isPresetTrue in ipairs(presetValues) do
- if isPresetTrue then
- numTruePresets = numTruePresets + 1
- chosenPresetIndex = i
- end
- end
- if numTruePresets > 1 then
- -- More than one preset is set to true, choose the lowest classing (Sub-Stellar)
- chosenPresetIndex = 1
- elseif numTruePresets == 0 then
- -- None are set to true, choose the default (Stellar)
- chosenPresetIndex = 2
- end
- subStellarPreset = chosenPresetIndex == 1
- stellarPreset = chosenPresetIndex == 2
- supermassivePreset = chosenPresetIndex == 3
- local gravitationalConstant
- local eventHorizonDistance
- local sizeIncreaseFactor
- local proportionalGravity
- local adjustEventHorizon
- local isAbsorptionEnabled
- local killPlayers
- local weldRemovalZoneSize
- local function SetSubStellarPreset()
- gravitationalConstant = subStellarGravitationalConstant
- eventHorizonDistance = subStellarEventHorizonDistance
- sizeIncreaseFactor = subStellarSizeIncreaseFactor
- proportionalGravity = subStellarProportionalGravity
- adjustEventHorizon = subStellarAdjustEventHorizon
- isAbsorptionEnabled = subStellarIsAbsorptionEnabled
- killPlayers = subStellarKillPlayers
- weldRemovalZoneSize = subStellarWeldRemovalZoneSize
- end
- local function SetStellarPreset()
- gravitationalConstant = stellarGravitationalConstant
- eventHorizonDistance = stellarEventHorizonDistance
- sizeIncreaseFactor = stellarSizeIncreaseFactor
- proportionalGravity = stellarProportionalGravity
- adjustEventHorizon = stellarAdjustEventHorizon
- isAbsorptionEnabled = stellarIsAbsorptionEnabled
- killPlayers = stellarKillPlayers
- weldRemovalZoneSize = stellarWeldRemovalZoneSize
- end
- local function SetSupermassivePreset()
- gravitationalConstant = supermassiveGravitationalConstant
- eventHorizonDistance = supermassiveEventHorizonDistance
- sizeIncreaseFactor = supermassiveSizeIncreaseFactor
- proportionalGravity = supermassiveProportionalGravity
- adjustEventHorizon = supermassiveAdjustEventHorizon
- isAbsorptionEnabled = supermassiveIsAbsorptionEnabled
- killPlayers = supermassiveKillPlayers
- weldRemovalZoneSize = supermassiveWeldRemovalZoneSize
- end
- if subStellarPreset then
- SetSubStellarPreset()
- elseif stellarPreset then
- SetStellarPreset()
- elseif supermassivePreset then
- SetSupermassivePreset()
- end
- -- CLASSIC GRAVITY MODE
- local function ApplyGravity(object)
- local direction = hole.Position - object.Position
- local distance = direction.Magnitude
- local forceMagnitude
- if proportionalGravity then
- forceMagnitude = (gravitationalConstant * hole.Size.X * object.Size.X) / (distance * distance)
- else
- forceMagnitude = gravitationalConstant
- end
- local force = direction.Unit * forceMagnitude
- object.Velocity = object.Velocity + force
- end
- --[[ EXPERIMENTAL GRAVITY (With grouped object/s support)
- function ApplyGravity(object)
- local direction = hole.Position - object.Position
- local distance = direction.Magnitude
- local forceMagnitude
- if proportionalGravity then
- forceMagnitude = (gravitationalConstant * hole.Size.X * object.Size.X) / (distance * distance)
- else
- forceMagnitude = gravitationalConstant -- Use custom gravitational constant
- end
- local force = direction.Unit * forceMagnitude
- -- Apply force using BodyForce instead of setting velocity directly
- local bodyForce = object:FindFirstChildOfClass("BodyForce") or Instance.new("BodyForce")
- bodyForce.Force = force
- bodyForce.Name = "BlackHoleForce"
- -- Attach BodyForce to object
- bodyForce.Parent = object
- end
- --]]
- local function CheckAndApplyGravity(obj)
- 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
- return
- end -- Add more classnames if targeted if not all objects are pulled
- if obj == hole then
- return -- Excludes the black hole itself from gravitational pull
- end
- if obj:IsA("Player") and not killPlayers then
- return -- Exclude players from being affected by the black hole if killing players is disabled
- end
- if obj.Anchored then
- return -- Prevents black hole from applying gravity to anchored objects
- end
- local distanceToHole = (hole.Position - obj.Position).Magnitude
- if distanceToHole < eventHorizonDistance then
- return -- Exclude objects within the event horizon from gravitational pull
- end
- ApplyGravity(obj)
- local distanceToWeldRemovalZone = (hole.Position - obj.Position).Magnitude
- if distanceToWeldRemovalZone < weldRemovalZoneSize then
- obj:BreakJoints() -- Break joints for objects within the weld removal zone
- end
- end
- game:GetService("RunService").Heartbeat:Connect(function()
- for _, object in pairs(game.Workspace:GetDescendants()) do
- CheckAndApplyGravity(object)
- end
- end)
- function onTouch(part)
- local humanoid = part.Parent:FindFirstChild("Humanoid")
- if humanoid then
- humanoid.Health = 0
- end
- part.CanCollide = true
- end
- function onTouched(part)
- if not isAbsorptionEnabled then
- return
- end
- if part.Anchored then
- return
- end
- -- ABSORPTION CUSTOMIZATION (How object will be absorbed)
- part.BrickColor = BrickColor.new(0) -- Color it changes into before getting deleted (White is default)
- part.Material = Enum.Material.Neon -- Material it changes into before getting deleted (Neon is default)
- part.Anchored = true -- Anchor/Unanchor every object that enters the Event Horizon zone
- part.CanCollide = false -- Make object pass through each other (Setting it to true is not recommended!)
- local transparencySteps = {0.25, 0.5, 0.75} -- Transparency changes (Appearing to fade out of reality)
- for _, transparency in ipairs(transparencySteps) do
- part.Transparency = transparency
- wait(0.01) -- How long the fading will last (In seconds) on each transparency increment
- end
- part:Destroy()
- hole.Size = hole.Size + Vector3.new(sizeIncreaseFactor, sizeIncreaseFactor, sizeIncreaseFactor)
- if adjustEventHorizon then
- eventHorizonDistance = hole.Size.X
- end
- end
- local connection = hole.Touched:Connect(onTouched)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement