-- [[ Rscripts Risk Notice ]]
-- This script is not verified by rscripts.net. Deal with caution.
--
-- Stay safe:
-- • Never log in on unofficial Roblox sites or lookalike domains.
-- • Real Roblox links use roblox.com (check the .com ending).
-- • Treat fake Roblox login / "claim reward" pages as phishing.
-- [[ End Rscripts Risk Notice ]]
local Config = {
MinCrystalValue = "2m",
SpeedBoost = 35,
NormalSpeed = 16,
FlySpeed = 100,
AutoRejoinBoulders = false,
AutoBuyBombs = false,
RuneGrabRange = 20,
PickRange = 13,
PickBurst = 8,
AutoSellThreshold = 0.5,
MountainCenter = Vector3.new(42.67, 1066.7, 102.2),
MountainRadius = 862.7,
RemotesFolder = "Remotes",
KeybindMenu = "RightControl",
KeybindAimTp = "F",
}
if getgenv().UniverseLoaded then
if getgenv().UniverseUnload then
pcall(getgenv().UniverseUnload)
end
end
getgenv().UniverseLoaded = true
local Services = {
Players = game:GetService("Players"),
CoreGui = game:GetService("CoreGui"),
RunService = game:GetService("RunService"),
Workspace = game:GetService("Workspace"),
ReplicatedStorage = game:GetService("ReplicatedStorage"),
UserInputService = game:GetService("UserInputService"),
HttpService = game:GetService("HttpService"),
TeleportService = game:GetService("TeleportService"),
GuiService = game:GetService("GuiService"),
VirtualUser = game:GetService("VirtualUser"),
}
local LocalPlayer = Services.Players.LocalPlayer
local Mouse = LocalPlayer:GetMouse()
local State = {
afkRunning = true,
espActive = false,
playerEspActive = false,
aimTpEnabled = false,
speedActive = false,
autoPickupActive = false,
instantPromptActive = false,
autoBuyBombs = false,
minValue = 2000000,
valueFilter = true,
espScale = 0.7,
playerScale = 0.6,
boulderScale = 0.6,
rootPart = nil,
lastReport = 0,
tpState = nil,
sweepAccumulator = math.huge,
statsDirty = true,
statsAccumulator = 0,
distanceAccumulator = math.huge,
lastPickup = 0,
lastBagWarn = 0,
instantAccumulator = math.huge,
registryCount = 0,
espCount = 0,
containerClock = 0,
streamMark = 0,
streamSpot = nil,
speedHooked = nil,
}
local Storage = {
afkConns = {},
registry = {},
candidates = {},
dirty = {},
espCache = {},
containerConns = {},
playerCache = {},
containerList = {},
sweepSeen = {},
lastDistanceOrigin = nil,
pendingActions = {},
promptRestores = {},
claimed = {},
promptCache = setmetatable({}, { __mode = "k" }),
instantPatched = {},
netConns = {},
}
local Connections = {}
do
local function silenceIdle()
local ok, list = pcall(function()
return getconnections(LocalPlayer.Idled)
end)
if not ok or type(list) ~= "table" then
return
end
for _, connection in ipairs(list) do
pcall(function()
connection:Disable()
end)
end
end
local function nudge()
pcall(function()
Services.VirtualUser:CaptureController()
Services.VirtualUser:ClickButton2(Vector3.new())
end)
end
silenceIdle()
Storage.afkConns[#Storage.afkConns + 1] = LocalPlayer.Idled:Connect(nudge)
task.spawn(function()
while State.afkRunning do
task.wait(60)
if not State.afkRunning or not LocalPlayer.Parent then
break
end
silenceIdle()
nudge()
end
end)
end
local function resolveGuiRoot()
local ok, hidden = pcall(function()
return gethui()
end)
if ok and typeof(hidden) == "Instance" then
return hidden
end
local playerGui = LocalPlayer:FindFirstChildOfClass("PlayerGui")
if playerGui then
return playerGui
end
return LocalPlayer:WaitForChild("PlayerGui", 10) or Services.CoreGui
end
local GuiRoot = resolveGuiRoot()
for _, container in ipairs({ GuiRoot, Services.CoreGui }) do
for _, name in ipairs({ "UniverseESPGui", "UniverseCrystalEsp" }) do
pcall(function()
local existing = container:FindFirstChild(name)
if existing then
existing:Destroy()
end
end)
end
end
local function findRemote(name)
local folder = Services.ReplicatedStorage:FindFirstChild(Config.RemotesFolder) or Services.ReplicatedStorage:WaitForChild(Config.RemotesFolder, 10)
if not folder then
return nil
end
return folder:FindFirstChild(name) or folder:WaitForChild(name, 5)
end
local Remotes = {
SellRequest = findRemote("SellRequest"),
GoHome = findRemote("GoHome"),
HoldComplete = findRemote("CrystalHoldComplete"),
ToggleFavorite = findRemote("ToggleFavorite"),
DigRequest = findRemote("DigRequest"),
BombShopQuery = findRemote("BombShopQuery"),
BombBuyRequest = findRemote("BombBuyRequest"),
BombShopRestocked = findRemote("BombShopRestocked"),
PlotPlaceRequest = findRemote("PlotPlaceRequest"),
}
local ESP = {
font = Enum.Font.GothamBold,
sweep = 0.5,
budget = 0.005,
offset = Vector3.new(0, 3, 0),
width = 250,
height = 66,
text = 16,
ttl = 5,
}
pcall(function()
ESP.font = Enum.Font.LuckiestGuy
end)
local PLAYER = {
offset = Vector3.new(0, -8, 0),
width = 220,
height = 44,
text = 15,
}
local PACE = {
boost = Config.SpeedBoost,
normal = Config.NormalSpeed,
stats = 0.25,
distance = 0.05,
}
local TP = {
offset = Vector3.new(0, 4.5, 0),
hold = 0.35,
clear = {
Vector3.new(0, 0, 0),
Vector3.new(0, 3, 0),
Vector3.new(0, 7, 0),
Vector3.new(5, 3, 0),
Vector3.new(-5, 3, 0),
Vector3.new(0, 3, 5),
Vector3.new(0, 3, -5),
Vector3.new(0, 12, 0),
Vector3.new(9, 6, 0),
Vector3.new(-9, 6, 0),
Vector3.new(0, 6, 9),
Vector3.new(0, 6, -9),
Vector3.new(0, 20, 0),
},
}
local PICK = {
aimRange = 5000,
aimDot = 0.995,
range = Config.PickRange,
cooldown = 0.04,
restore = 0.2,
burst = Config.PickBurst,
retry = 0.15,
forget = 5,
pad = 4,
instantRadius = 60,
instantTick = 0.25,
}
local COLORS = {
money = Color3.fromRGB(60, 255, 90),
default = Color3.fromRGB(0, 225, 255),
extra = Color3.fromRGB(255, 255, 255),
player = Color3.fromRGB(255, 40, 140),
stroke = Color3.fromRGB(0, 0, 0),
hexDistance = "00E5FF",
hexLuck = "FFC400",
}
local TIER_NAMES = { "Common", "Uncommon", "Rare", "Epic", "Legendary", "Mythic" }
local LUCK = {
rarity = { 1, 1.6, 2.6, 4.2, 7, 12 },
base = 0.00045,
exponent = 0.5,
cap = 500,
bomb = 3,
blood = 4,
}
local MUTATION_LUCK = {
Verdant = 15,
Voltaic = 20,
Gilded = 18,
Onyx = 28,
Terminus = 40,
Frost = 1.4,
Fire = 1.4,
Thunder = 1.5,
Starfall = 1.3,
Aurora = 2.2,
Radioactive = 2,
Poison = 1.5,
Wet = 1,
}
local WATCHED_ATTRIBUTES = {
"Value",
"Collected",
"WeightKg",
"Tier",
"TierName",
"CrystalName",
"Mutation",
"ExtraMutations",
}
local SUFFIXES = { "", "k", "M", "B", "T", "Qa" }
local PARSE_MULTIPLIERS = { k = 1e3, m = 1e6, b = 1e9, t = 1e12, qa = 1e15 }
local CONTAINER_NAMES = { "DroppedCrystals", "Crystals" }
local repo = "https://raw.githubusercontent.com/deividcomsono/Obsidian/main/"
local Library = loadstring(game:HttpGet(repo .. "Library.lua"))()
local SaveManager = loadstring(game:HttpGet(repo .. "addons/SaveManager.lua"))()
local ThemeManager = loadstring(game:HttpGet(repo .. "addons/ThemeManager.lua"))()
Library.ForceCheckbox = false
Library.ShowToggleFrameInKeybinds = true
local Window = Library:CreateWindow({
Title = "Mine a Mountain",
Footer = "Mine a Mountain | Made by DonnieAzoff",
AutoShow = true,
NotifySide = "Right",
ShowCustomCursor = false,
})
local Tabs = {
crystals = Window:AddTab("Crystals", "gem"),
players = Window:AddTab("Players", "users"),
boulders = Window:AddTab("Boulders", "mountain"),
teleports = Window:AddTab("Teleports", "crosshair"),
farming = Window:AddTab("Farming", "pickaxe"),
movement = Window:AddTab("Movement", "zap"),
}
local SettingsTab = Window:AddTab("Settings", "sliders-horizontal")
local EspHolder = Instance.new("Folder")
EspHolder.Name = "UniverseCrystalEsp"
EspHolder.Parent = GuiRoot
local function reportError(context, err)
local now = os.clock()
if now - State.lastReport < 5 then
return
end
State.lastReport = now
warn(string.format("[Mine a Mountain] %s: %s", context, tostring(err)))
end
local function formatShort(n, prefix)
n = tonumber(n) or 0
prefix = prefix or ""
local sign = n < 0 and "-" or ""
n = math.abs(n)
if n < 1000 then
return string.format("%s%s%d", sign, prefix, math.floor(n + 0.5))
end
local index = 0
while n >= 1000 and index < #SUFFIXES - 1 do
n /= 1000
index += 1
end
return string.format("%s%s%.2f%s", sign, prefix, n, SUFFIXES[index + 1])
end
local function formatWeight(kg)
kg = tonumber(kg) or 0
if kg >= 1000 then
return formatShort(kg) .. "kg"
end
return string.format("%.1fkg", kg)
end
local function formatDistance(studs)
studs = tonumber(studs) or 0
if studs >= 1000 then
return string.format("%.1fkm", studs / 1000)
end
return string.format("%dm", math.floor(studs + 0.5))
end
local function formatLuck(score)
local pct = (tonumber(score) or 0) * 100
if pct <= 0 then
return "+0%"
end
if pct < 1 then
return string.format("+%.2f%%", pct)
end
if pct < 10 then
return string.format("+%.1f%%", pct)
end
return string.format("+%.0f%%", pct)
end
local function parseValue(text)
if type(text) ~= "string" then
return nil
end
local cleaned = text:lower():gsub("[%s,%$_]", "")
if cleaned == "" then
return 0
end
local number, suffix = cleaned:match("^(%d*%.?%d+)(%a*)$")
if not number then
return nil
end
local base = tonumber(number)
if not base then
return nil
end
if suffix == "" then
return base
end
local multiplier = PARSE_MULTIPLIERS[suffix]
if not multiplier then
return nil
end
return base * multiplier
end
local function bindCharacter(character)
if not character then
State.rootPart = nil
return
end
State.rootPart = character:FindFirstChild("HumanoidRootPart")
end
bindCharacter(LocalPlayer.Character)
Connections.characterConn = LocalPlayer.CharacterAdded:Connect(function(character)
State.rootPart = nil
State.tpState = nil
local waiter
waiter = character.ChildAdded:Connect(function(child)
if child.Name == "HumanoidRootPart" then
State.rootPart = child
waiter:Disconnect()
end
end)
bindCharacter(character)
if State.rootPart then
waiter:Disconnect()
end
end)
local function getRoot()
if State.rootPart and State.rootPart.Parent then
return State.rootPart
end
bindCharacter(LocalPlayer.Character)
return State.rootPart
end
local function getAttr(inst, name)
if not inst then
return nil
end
local ok, value = pcall(inst.GetAttribute, inst, name)
if ok then
return value
end
return nil
end
local function crystalValue(inst)
return tonumber(getAttr(inst, "Value")) or 0
end
local function crystalWeight(inst)
return tonumber(getAttr(inst, "WeightKg")) or 0
end
local function crystalTier(inst)
return tonumber(getAttr(inst, "Tier")) or 0
end
local function crystalRarity(inst)
local name = getAttr(inst, "TierName")
if type(name) == "string" and name ~= "" then
return name
end
return TIER_NAMES[crystalTier(inst)] or "Unknown"
end
local function crystalName(inst)
local name = getAttr(inst, "CrystalName")
if type(name) == "string" and name ~= "" then
return name
end
return inst and inst.Name or "Crystal"
end
local function crystalColor(inst)
local r = tonumber(getAttr(inst, "TierColorR"))
local g = tonumber(getAttr(inst, "TierColorG"))
local b = tonumber(getAttr(inst, "TierColorB"))
if r and g and b then
return Color3.fromRGB(r, g, b)
end
return COLORS.default
end
local function mutationLuck(name)
if type(name) ~= "string" or name == "" then
return 1
end
return MUTATION_LUCK[name] or 1
end
local function combinedLuckMult(inst)
local mutation = getAttr(inst, "Mutation")
local roll = tonumber(getAttr(inst, "MutationLuckRoll"))
local multiplier = (roll and roll > 0) and roll or mutationLuck(mutation)
local extra = getAttr(inst, "ExtraMutations")
if type(extra) == "string" and extra ~= "" then
for name in string.gmatch(extra, "[^,]+") do
if name ~= "" then
multiplier *= mutationLuck(name)
end
end
end
if getAttr(inst, "IsBloodCrystal") == true then
multiplier *= LUCK.blood
end
if getAttr(inst, "AdminMutation") == "Radioactive" and mutation ~= "Radioactive" then
local hasRadioactive = type(extra) == "string" and extra:find("Radioactive", 1, true) ~= nil
if not hasRadioactive then
multiplier *= mutationLuck("Radioactive")
end
end
return multiplier
end
local function computeLuck(inst)
local tier = crystalTier(inst)
if tier <= 0 then
return 0
end
local weight = math.max(0, crystalWeight(inst))
local base = (LUCK.rarity[tier] or LUCK.rarity[1]) * math.min(weight, LUCK.cap) ^ LUCK.exponent * LUCK.base
if getAttr(inst, "BombCrystal") == true then
base *= LUCK.bomb
end
return base * combinedLuckMult(inst)
end
local function luckLabel(inst)
local hover = inst:FindFirstChild("CrystalHover")
if not hover then
return nil
end
local label = hover:FindFirstChild("LuckBoost")
if not label or not label:IsA("TextLabel") then
return nil
end
return label
end
local function luckLabelText(inst)
local label = luckLabel(inst)
if not label then
return nil
end
return label.Text
end
local function crystalLuck(inst)
local text = luckLabelText(inst)
if type(text) == "string" then
local pct = tonumber(text:match("([%d%.]+)%s*%%"))
if pct and pct > 0 then
return pct / 100
end
end
return computeLuck(inst)
end
local function meetsFilter(inst, value)
if not State.valueFilter then
return true
end
return (value or crystalValue(inst)) >= State.minValue
end
local function ownsGamepass(name)
local folder = LocalPlayer:FindFirstChild("GamepassesOwned")
if not folder then
return false
end
local flag = folder:FindFirstChild(name)
return flag ~= nil and flag:IsA("BoolValue") and flag.Value == true
end
local function realStat(name)
local data = LocalPlayer:FindFirstChild("PlayerData")
local stats = data and data:FindFirstChild("RealStats")
local entry = stats and stats:FindFirstChild(name)
if not entry then
return nil
end
return tonumber(entry.Value)
end
local function hasActiveRune(keyword)
local data = LocalPlayer:FindFirstChild("PlayerData")
local plot = data and data:FindFirstChild("PlotData")
local runes = plot and plot:FindFirstChild("Runes")
if not runes then
return false
end
for _, child in ipairs(runes:GetChildren()) do
local runeName = child:GetAttribute("RuneName")
if type(runeName) == "string" and runeName:find(keyword, 1, true) then
if (tonumber(child:GetAttribute("Remaining")) or 0) > 0 then
return true
end
end
end
return false
end
local function backpackCapacity()
if LocalPlayer:GetAttribute("InfBackpack") == true then
return math.huge
end
local base = realStat("CarryWeight") or 10
if ownsGamepass("CarryKgPlus4") then
base *= 4
end
local total = base + (realStat("CarryWeightBonus") or 0)
if hasActiveRune("Weight") then
return total * 2
end
return total
end
local function backpackWeight()
local total = 0
local function scan(container)
if not container then
return
end
for _, child in ipairs(container:GetChildren()) do
if child:IsA("Tool") and getAttr(child, "Tier") ~= nil then
local kg = tonumber(getAttr(child, "WeightKg"))
if kg then
total += kg
end
end
end
end
scan(LocalPlayer:FindFirstChildOfClass("Backpack"))
scan(LocalPlayer.Character)
return total
end
local function backpackFree()
local capacity = backpackCapacity()
if capacity == math.huge then
return math.huge
end
return capacity - backpackWeight()
end
local function looksLikeCrystal(inst)
if not inst:IsA("BasePart") then
return false
end
return inst.Name:find("Crystal", 1, true) ~= nil
end
local crystalFlags = setmetatable({}, { __mode = "k" })
local function isCrystal(inst)
local cached = crystalFlags[inst]
if cached ~= nil then
return cached
end
local result = false
if inst:IsA("BasePart") and getAttr(inst, "Value") ~= nil then
result = getAttr(inst, "CrystalName") ~= nil or inst.Name:find("Crystal", 1, true) ~= nil
end
crystalFlags[inst] = result
return result
end
local function rebuildContainers()
table.clear(Storage.containerList)
local seen = {}
local function push(container)
if not container or seen[container] then
return
end
seen[container] = true
Storage.containerList[#Storage.containerList + 1] = container
end
push(Services.Workspace)
for _, name in ipairs(CONTAINER_NAMES) do
push(Services.Workspace:FindFirstChild(name))
end
local things = Services.Workspace:FindFirstChild("Things")
if things then
for _, name in ipairs(CONTAINER_NAMES) do
push(things:FindFirstChild(name))
end
end
end
local function eachContainer(fn)
local now = os.clock()
local stale = #Storage.containerList == 0 or now - State.containerClock >= 1
if not stale then
for _, container in ipairs(Storage.containerList) do
if not container.Parent and container ~= Services.Workspace then
stale = true
break
end
end
end
if stale then
State.containerClock = now
rebuildContainers()
end
for _, container in ipairs(Storage.containerList) do
fn(container)
end
end
local function newLabel(name, parent, order, total, color, rich, maxText)
local label = Instance.new("TextLabel")
label.Name = name
label.BackgroundTransparency = 1
label.BorderSizePixel = 0
label.Size = UDim2.new(1, 0, 1 / total, 0)
label.Position = UDim2.new(0, 0, order / total, 0)
label.Font = ESP.font
label.TextScaled = true
label.TextTransparency = 0
label.TextStrokeTransparency = 0
label.TextStrokeColor3 = COLORS.stroke
label.TextColor3 = color
label.RichText = rich == true
label.Text = ""
label.Parent = parent
local constraint = Instance.new("UITextSizeConstraint")
constraint.MaxTextSize = maxText
constraint.Parent = label
return label, constraint
end
local function crystalGuiSize()
return UDim2.fromOffset(ESP.width * State.espScale, ESP.height * State.espScale)
end
local function crystalTextSize()
return math.max(6, math.floor(ESP.text * State.espScale + 0.5))
end
local function playerGuiSize()
return UDim2.fromOffset(PLAYER.width * State.playerScale, PLAYER.height * State.playerScale)
end
local function playerTextSize()
return math.max(6, math.floor(PLAYER.text * State.playerScale + 0.5))
end
local function createEntry(inst)
local billboard = Instance.new("BillboardGui")
billboard.Name = "UniverseEsp"
billboard.Adornee = inst
billboard.AlwaysOnTop = true
billboard.ResetOnSpawn = false
billboard.LightInfluence = 0
billboard.Size = crystalGuiSize()
billboard.StudsOffsetWorldSpace = ESP.offset
billboard.MaxDistance = math.huge
billboard.Parent = EspHolder
local textSize = crystalTextSize()
local rarity, rarityConstraint = newLabel("Rarity", billboard, 0, 3, COLORS.default, false, textSize)
local info, infoConstraint = newLabel("Info", billboard, 1, 3, COLORS.money, false, textSize)
local extra, extraConstraint = newLabel("Extra", billboard, 2, 3, COLORS.extra, true, textSize)
return {
gui = billboard,
rarity = rarity,
info = info,
extra = extra,
constraints = { rarityConstraint, infoConstraint, extraConstraint },
signature = false,
luckText = "+0%",
distanceText = false,
}
end
local function destroyEntry(inst, entry)
entry = entry or Storage.espCache[inst]
if not entry then
return
end
if entry.gui then
entry.gui:Destroy()
end
Storage.espCache[inst] = nil
State.espCount -= 1
State.statsDirty = true
end
local function applyEspScale()
local size = crystalGuiSize()
local textSize = crystalTextSize()
for _, entry in pairs(Storage.espCache) do
if entry.gui then
entry.gui.Size = size
end
for _, constraint in ipairs(entry.constraints) do
constraint.MaxTextSize = textSize
end
end
end
local function applyPlayerScale()
local size = playerGuiSize()
local textSize = playerTextSize()
for _, entry in pairs(Storage.playerCache) do
if entry.gui then
entry.gui.Size = size
end
for _, constraint in ipairs(entry.constraints) do
constraint.MaxTextSize = textSize
end
end
end
local function applyExtra(entry, distanceText)
entry.distanceText = distanceText
entry.extra.Text = string.format(
'%s \u{2022} %s',
COLORS.hexDistance,
distanceText,
COLORS.hexLuck,
entry.luckText
)
end
local function buildTitle(inst)
local rarity = crystalRarity(inst)
local name = crystalName(inst)
local mutation = getAttr(inst, "Mutation")
if type(mutation) == "string" and m