local TweenService = game:GetService("TweenService") local ReplicatedStorage = game:GetService("ReplicatedStorage") local Players = game:GetService("Players") local Player = Players.LocalPlayer local Character = Player.Character or Player.CharacterAdded:Wait() local Root = Character:WaitForChild("HumanoidRootPart") local ToolActivate = ReplicatedStorage.Shared.Packages.Knit.Services.ToolService.RF.ToolActivated getgenv().Config = { AutoMine = true, SafeDistance = 7, MaxHP = 500, MinSwingDelay = 0.25, MaxSwingDelay = 0.45, RockFolder = "Island1CaveMid" -- Choose one: "Roof", "Island1CaveDeep", "Island1CaveStart", "Island1CaveMid" } local function GetRockHP(Hitbox) local Model = Hitbox:FindFirstAncestorWhichIsA("Model") if not Model then return nil end local Info = Model:FindFirstChild("infoFrame", true) if not Info then return nil end local Frame = Info:FindFirstChild("Frame") if not Frame then return nil end local HPLabel = Frame:FindFirstChild("rockHP") if not HPLabel or not HPLabel:IsA("TextLabel") then return nil end local Text = HPLabel.Text or "" Text = Text:gsub(",", ""):gsub("[^%d]", "") return tonumber(Text) end local function GetRockFolder() local Rocks = workspace:WaitForChild("Rocks", 5) if not Rocks then return nil end local Folder = Rocks:FindFirstChild(getgenv().Config.RockFolder) if Folder and Folder:IsA("Folder") then return Folder end warn("Rock folder not found:", getgenv().Config.RockFolder) return nil end local function ScanHitboxes() local Result = {} local Folder = GetRockFolder() if not Folder then return Result end for _, Inst in ipairs(Folder:GetDescendants()) do if Inst.Name == "Hitbox" and Inst:IsA("BasePart") then table.insert(Result, Inst) end end return Result end local OreList = ScanHitboxes() local SelectedFolder = GetRockFolder() if SelectedFolder then SelectedFolder.DescendantAdded:Connect(function(Child) if Child.Name == "Hitbox" and Child:IsA("BasePart") then table.insert(OreList, Child) end end) end local function GetClosestOre() local Best, BestDist = nil, math.huge local RP = Root.Position for _, Ore in ipairs(OreList) do if Ore and Ore.Parent then local HP = GetRockHP(Ore) if HP and HP <= getgenv().Config.MaxHP then local Dist = (Ore.Position - RP).Magnitude if Dist < BestDist then BestDist = Dist Best = Ore end end end end return Best end local function GoTo(TargetPos, FacePos) local Distance = (TargetPos - Root.Position).Magnitude local Speed = math.random(12, 18) local Duration = Distance / Speed Duration = Duration * (math.random(75, 125) / 100) if Duration < 0.6 then Duration = 0.6 end local CF = CFrame.new(TargetPos, FacePos) local Tween = TweenService:Create(Root, TweenInfo.new(Duration, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut), {CFrame = CF}) Tween:Play() Tween.Completed:Wait() end local CurrentTarget = nil task.spawn(function() while task.wait(0.15) do if not getgenv().Config.AutoMine then continue end if CurrentTarget and CurrentTarget.Parent then local HP = GetRockHP(CurrentTarget) if not HP then CurrentTarget = nil continue end else CurrentTarget = nil end if not CurrentTarget then CurrentTarget = GetClosestOre() continue end local Ore = CurrentTarget local Dir = (Ore.Position - Root.Position).Unit local TargetPos = Ore.Position - Dir * getgenv().Config.SafeDistance GoTo(TargetPos, Ore.Position) local Delay = math.random(getgenv().Config.MinSwingDelay*100, getgenv().Config.MaxSwingDelay*100)/100 pcall(function() ToolActivate:InvokeServer("Pickaxe") end) task.wait(Delay) end end)