
Key Required VerifiedUniversal

local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local VirtualInputManager = game:GetService("VirtualInputManager")
local UserInputService = game:GetService("UserInputService")
local HttpService = game:GetService("HttpService")
local Player = Players.LocalPlayer
local PlayerGui = Player:WaitForChild("PlayerGui")
local Backpack = Player:WaitForChild("Backpack")
local RNG = Random.new()
local Env = getgenv and getgenv() or _G
local InstanceId =
tostring(os.clock())
.. "_"
.. tostring(math.random(100000,999999))
Env.DigOPInstanceId = InstanceId
local function alive()
return Env.DigOPInstanceId == InstanceId
end
local ExecutorName = "Unknown"
pcall(function()
if identifyexecutor then
ExecutorName = tostring(identifyexecutor())
elseif getexecutorname then
ExecutorName = tostring(getexecutorname())
end
end)
local Caps = {
Mouse1Click = typeof(mouse1click) == "function",
FirePrompt = typeof(fireproximityprompt) == "function",
ReadFile = typeof(readfile) == "function",
WriteFile = typeof(writefile) == "function",
IsFile = typeof(isfile) == "function",
MakeFolder = typeof(makefolder) == "function",
IsFolder = typeof(isfolder) == "function"
}
local SAVE_FOLDER = "DigOP"
local SAVE_FILE = SAVE_FOLDER .. "/settings.json"
local function ensureFolder()
if not Caps.MakeFolder then
return
end
pcall(function()
if Caps.IsFolder then
if not isfolder(SAVE_FOLDER) then
makefolder(SAVE_FOLDER)
end
else
makefolder(SAVE_FOLDER)
end
end)
end
ensureFolder()
local function loadSettings()
if not Caps.ReadFile or not Caps.IsFile then
return {}
end
local success,data = pcall(function()
if not isfile(SAVE_FILE) then
return nil
end
return HttpService:JSONDecode(
readfile(SAVE_FILE)
)
end)
if success and type(data) == "table" then
return data
end
return {}
end
local Saved = loadSettings()
local function saveSettings(data)
if not Caps.WriteFile then
return
end
ensureFolder()
pcall(function()
writefile(
SAVE_FILE,
HttpService:JSONEncode(data)
)
end)
end
local function findRecursive(rootObject,name,timeout)
local started = os.clock()
local found = rootObject:FindFirstChild(name,true)
while not found
and alive()
and os.clock() - started < (timeout or 15) do
task.wait(0.05)
found =
rootObject:FindFirstChild(
name,
true
)
end
return found
end
local function requireRecursive(name)
local found =
findRecursive(
ReplicatedStorage,
name,
15
)
if not found then
error("Missing: "..name)
end
return found
end
local ShopFunctions =
requireRecursive(
"shared/network/ShopNetwork@GlobalShopFunctions"
)
local ItemsFunctions =
requireRecursive(
"shared/network/ItemsNetwork@GlobalItemsFunctions"
)
local ItemsEvents =
requireRecursive(
"shared/network/ItemsNetwork@GlobalItemsEvents"
)
local DataFunctions =
requireRecursive(
"shared/network/DataNetwork@GlobalDataFunctions"
)
local MiscFunctions =
requireRecursive(
"shared/network/MiscNetwork@GlobalMiscFunctions"
)
local PedestalFunctions =
requireRecursive(
"shared/network/PedestalNetwork@GlobalPedestalFunctions"
)
local SellFunctions =
requireRecursive(
"shared/network/SellNetwork@GlobalSellFunctions"
)
local ShovelEvents =
requireRecursive(
"shared/network/ShovelNetwork@GlobalShovelEvents"
)
local DetectorEvents =
requireRecursive(
"shared/network/DetectorNetwork@GlobalDetectorEvents"
)
local BuyGearRemote =
ShopFunctions:WaitForChild("buyGear")
local EquipGearRemote =
ShopFunctions:WaitForChild("equipGear")
local BeginCleaningRemote =
ItemsFunctions:WaitForChild("beginCleaning")
local SaveCleanProgressRemote =
ItemsEvents:WaitForChild("saveCleanProgress")
local FinishCleaningRemote =
ItemsEvents:WaitForChild("finishCleaning")
local RequestDataRemote =
DataFunctions:WaitForChild("requestDataUpdate")
local RequestPlotRemote =
MiscFunctions:WaitForChild("RequestPlotNumber")
local PlaceItemRemote =
PedestalFunctions:WaitForChild("placeItem")
local PickupItemRemote =
PedestalFunctions:WaitForChild("pickupItem")
local SellHeldRemote =
SellFunctions:WaitForChild("sellHeldItem")
local DigSceneStartRemote =
ShovelEvents:WaitForChild("DigSceneStart")
local DigSceneEndRemote =
ShovelEvents:WaitForChild("DigSceneEnd")
local BuriedNodesRemote =
DetectorEvents:WaitForChild("BuriedNodes")
local SetDetectorHeldRemote =
DetectorEvents:WaitForChild("SetDetectorHeld")
local RequestId = -1000000
local function invoke(remote,timeout,...)
if not alive() then
return false,nil
end
RequestId -= 1
local id = RequestId
local finished = false
local status
local result
local connection
connection =
remote.OnClientEvent:Connect(function(
responseId,
responseStatus,
responseResult
)
if not alive() then
return
end
if responseId ~= id then
return
end
status = responseStatus
result = responseResult
finished = true
end)
local args = table.pack(...)
local fired = pcall(function()
remote:FireServer(
id,
table.unpack(args,1,args.n)
)
end)
if not fired then
connection:Disconnect()
return false,nil
end
local started = os.clock()
while not finished
and alive()
and os.clock() - started < (timeout or 5) do
task.wait()
end
connection:Disconnect()
if not alive() or not finished then
return false,nil
end
if status ~= true then
return false,result
end
return true,result
end
local Shovels = {
{"plasticShovel","Plastic Shovel",0,1,"starterIsland"},
{"woodShovel","Wood Shovel",250,2,"starterIsland"},
{"stoneShovel","Stone Shovel",1600,3,"starterIsland"},
{"metalShovel","Metal Shovel",9000,5,"starterIsland"},
{"goldShovel","Gold Shovel",45000,7,"starterIsland"},
{"amethystShovel","Amethyst Shovel",190000,9,"starterIsland"},
{"titaniumShovel","Titanium Shovel",390000,14,"island2"},
{"cobaltShovel","Cobalt Shovel",650000,17,"island2"},
{"carbonShovel","Carbon Shovel",1300000,21,"island2"},
{"rubyShovel","Ruby Shovel",2900000,26,"island2"},
{"diamondShovel","Diamond Shovel",9200000,40,"island2"},
{"sandstoneShovel","Sandstone Shovel",20000000,50,"island3"},
{"amberShovel","Amber Shovel",25000000,62,"island3"},
{"scarabShovel","Scarab Shovel",40000000,78,"island3"},
{"malachiteShovel","Malachite Shovel",65000000,100,"island3"},
{"aquamarineShovel","Aquamarine Shovel",120000000,160,"island3"},
{"cryoliteShovel","Cryolite Shovel",225000000,200,"island4"},
{"peridotShovel","Peridot Shovel",450000000,250,"island4"},
{"sunstoneShovel","Sunstone Shovel",1000000000,320,"island4"},
{"sugiliteShovel","Sugilite Shovel",2250000000,420,"island4"},
{"eclipseShovel","Eclipse Shovel",5500000000,640,"island4"},
{"netherShovel","Nether Shovel",4000000000,900,"island5"},
{"specterShovel","Specter Shovel",10000000000,1300,"island5"},
{"infernoShovel","Inferno Shovel",20000000000,1900,"island5"},
{"stormShovel","Storm Shovel",45000000000,2800,"island5"},
{"magmaShovel","Magma Shovel",100000000000,4200,"island5"},
{"seraphShovel","Seraph Shovel",200000000000,6000,"island6"},
{"dominionShovel","Dominion Shovel",450000000000,9000,"island6"},
{"virtueShovel","Virtue Shovel",1000000000000,13500,"island6"},
{"throneShovel","Throne Shovel",1800000000000,20000,"island6"},
{"archangelShovel","Archangel Shovel",3300000000000,30000,"island6"}
}
local Detectors = {
{"rusty","Rusty Detector",0,1,"starterIsland"},
{"copper","Copper Detector",400,2,"starterIsland"},
{"silver","Silver Detector",4000,3,"starterIsland"},
{"gold","Gold Detector",25000,4,"starterIsland"},
{"platinum","Platinum Detector",150000,5,"starterIsland"},
{"onyx","Onyx Detector",400000,6,"island2"},
{"sapphire","Sapphire Detector",700000,7,"island2"},
{"jade","Jade Detector",1500000,8,"island2"},
{"topaz","Topaz Detector",3000000,9,"island2"},
{"crystal","Crystal Detector",8000000,10,"island2"},
{"sandstone","Sandstone Detector",22500000,11,"island3"},
{"amber","Amber Detector",35000000,12,"island3"},
{"scarab","Scarab Detector",50000000,13,"island3"},
{"malachite","Malachite Detector",80000000,14,"island3"},
{"aquamarine","Aquamarine Detector",125000000,15,"island3"},
{"cryolite","Cryolite Detector",250000000,16,"island4"},
{"peridot","Peridot Detector",450000000,17,"island4"},
{"sunstone","Sunstone Detector",1000000000,18,"island4"},
{"sugilite","Sugilite Detector",2250000000,19,"island4"},
{"eclipse","Eclipse Detector",5500000000,20,"island4"},
{"nether","Nether Detector",4000000000,21,"island5"},
{"specter","Specter Detector",9000000000,22,"island5"},
{"inferno","Inferno Detector",20000000000,23,"island5"},
{"storm","Storm Detector",45000000000,24,"island5"},
{"magma","Magma Detector",100000000000,25,"island5"},
{"seraph","Seraph Detector",200000000000,26,"island6"},
{"dominion","Dominion Detector",450000000000,27,"island6"},
{"virtue","Virtue Detector",1000000000000,28,"island6"},
{"throne","Throne Detector",1800000000000,29,"island6"},
{"archangel","Archangel Detector",3300000000000,30,"island6"}
}
local Settings = {
AutoFarm = Saved.AutoFarm == true,
ActiveIsland =
type(Saved.ActiveIsland) == "string"
and Saved.ActiveIsland
or nil,
AutoDig =
Saved.AutoDig ~= false,
AutoFastClick =
Saved.AutoFastClick ~= false,
AutoClean =
Saved.AutoClean ~= false,
AutoPlace =
Saved.AutoPlace ~= false,
AutoSell =
Saved.AutoSell ~= false,
AutoBuyShovel =
Saved.AutoBuyShovel ~= false,
AutoBuyDetector =
Saved.AutoBuyDetector ~= false
}
local ActiveIsland = nil
local IslandToggles = {}
local IslandStates = {}
local IslandProfiles = {}
local ChangingToggle = false
local ManualFastClick = false
local TestDigActive = false
local Busy = false
local Searching = false
local Digging = false
local CandidateLock = 0
local NextSearch = 0
local NextGearCheck = 0
local CachedData
local DataTime = 0
local PlotNumber
local CachedPlot
local CachedSeller
local CachedPedestals
local PedestalCacheTime = 0
local BuriedNodes = {}
local FailedNodes = {}
local KnownValues = {}
local FULL_CLEAN_MASK =
string.rep("/",64)
local Rayfield
local function persist()
saveSettings({
AutoFarm = Settings.AutoFarm,
ActiveIsland =
ActiveIsland
and ActiveIsland.Name
or Settings.ActiveIsland,
AutoDig = Settings.AutoDig,
AutoFastClick =
Settings.AutoFastClick,
AutoClean =
Settings.AutoClean,
AutoPlace =
Settings.AutoPlace,
AutoSell =
Settings.AutoSell,
AutoBuyShovel =
Settings.AutoBuyShovel,
AutoBuyDetector =
Settings.AutoBuyDetector
})
end
local function character()
return Player.Character
end
local function root()
local char = character()
return char
and char:FindFirstChild(
"HumanoidRootPart"
)
end
local function humanoid()
local char = character()
return char
and char:FindFirstChildOfClass(
"Humanoid"
)
end
local function notify(title,content)
if Rayfield and alive() then
pcall(function()
Rayfield:Notify({
Title = title,
Content = content,
Duration = 3
})
end)
end
end
local function savePosition()
local hrp = root()
return
hrp
and hrp.CFrame
or nil
end
local function restorePosition(cf)
local hrp = root()
if not hrp or not cf then
return
end
hrp.CFrame = cf
hrp.AssemblyLinearVelocity = Vector3.zero
hrp.AssemblyAngularVelocity = Vector3.zero
end
local function getPart(object)
if not object then
return nil
end
if object:IsA("BasePart") then
return object
end
if object:IsA("Model") then
return
object.PrimaryPart
or object:FindFirstChild(
"HumanoidRootPart",
true
)
or object:FindFirstChildWhichIsA(
"BasePart",
true
)
end
return object:FindFirstChildWhichIsA(
"BasePart",
true
)
end
local function teleportTo(object)
local hrp = root()
local part = getPart(object)
if not hrp or not part then
return false
end
hrp.CFrame =
part.CFrame
* CFrame.new(
0,
part.Size.Y / 2 + 3,
0
)
hrp.AssemblyLinearVelocity = Vector3.zero
hrp.AssemblyAngularVelocity = Vector3.zero
return true
end
local function teleportNear(object,distance)
local hrp = root()
local part = getPart(object)
if not hrp or not part then
return false
end
hrp.CFrame =
part.CFrame
* CFrame.new(
0,
0,
-(distance or 3)
)
hrp.AssemblyLinearVelocity = Vector3.zero
hrp.AssemblyAngularVelocity = Vector3.zero
return true
end
local function getData(force)
if not force
and CachedData
and os.clock() - DataTime < 0.2 then
return CachedData
end
local success,data =
invoke(
RequestDataRemote,
4
)
if success
and type(data) == "table" then
CachedData = data
DataTime = os.clock()
end
return CachedData
end
local function refreshData()
DataTime = 0
return getData(true)
end
local function findInventory(uid,data)
data = data or getData()
if not data
or type(data.Inventory) ~= "table" then
return nil
end
for _,item in pairs(
data.Inventory
) do
if type(item) == "table"
and item.uid == uid then
return item
end
end
return nil
end
local function isCollectible(item)
return
type(item) == "table"
and type(item.uid) == "string"
and (
item.dirty ~= nil
or item.condition ~= nil
or item.pedestalSlot ~= nil
)
end
local function inventoryEntries()
local result = {}
local data = refreshData()
if not data
or type(data.Inventory) ~= "table" then
return result
end
for _,item in pairs(
data.Inventory
) do
if isCollectible(item) then
table.insert(
result,
item
)
end
end
return result
end
local function getDirtyItem()
local data = getData()
if not data
or type(data.Inventory) ~= "table" then
return nil
end
for _,item in pairs(
data.Inventory
) do
if isCollectible(item)
and item.dirty == true
and item.pedestalSlot == nil then
return item
end
end
return nil
end
local function getToolByUid(uid)
local containers = {
character(),
Backpack
}
for _,container in ipairs(
containers
) do
if container then
for _,object in ipairs(
container:GetChildren()
) do
if object:IsA("Tool")
and object:GetAttribute(
"inventoryId"
) == uid then
return object
end
end
end
end
return nil
end
local function waitForTool(uid,timeout)
local started = os.clock()
repeat
local tool =
getToolByUid(uid)
if tool then
return tool
end
task.wait(0.035)
until not alive()
or os.clock() - started
>= (timeout or 2.5)
return nil
end
local function unequipTools()
local hum = humanoid()
if hum then
pcall(function()
hum:UnequipTools()
end)
end
task.wait(0.025)
end
local function equipUid(uid)
local tool =
waitForTool(
uid,
2.5
)
if not tool then
return false
end
local hum = humanoid()
if not hum then
return false
end
pcall(function()
hum:UnequipTools()
end)
task.wait(0.025)
pcall(function()
hum:EquipTool(tool)
end)
local started = os.clock()
repeat
local char = character()
local held =
char
and char:FindFirstChildOfClass(
"Tool"
)
if held
and held:GetAttribute(
"inventoryId"
) == uid then
return true
end
task.wait(0.015)
until not alive()
or os.clock() - started > 0.8
return false
end
local function equipShovelToolIfPresent()
local hum = humanoid()
if not hum then
return
end
for _,tool in ipairs(
Backpack:GetChildren()
) do
if tool:IsA("Tool") then
local name =
string.lower(
tool.Name
)
if string.find(
name,
"shovel",
1,
true
) then
pcall(function()
hum:EquipTool(tool)
end)
return
end
end
end
end
local function setDetectorHeld(value)
pcall(function()
SetDetectorHeldRemote:FireServer(
value
)
end)
end
local function resetDigEquipment()
setDetectorHeld(false)
unequipTools()
local data =
refreshData()
if data
and data.EquippedShovel then
pcall(function()
invoke(
EquipGearRemote,
2,
"shovel",
data.EquippedShovel
)
end)
end
task.wait(0.025)
unequipTools()
equipShovelToolIfPresent()
task.wait(0.025)
end
local function getPlot()
if CachedPlot
and CachedPlot.Parent then
return CachedPlot
end
local plots =
workspace:FindFirstChild(
"Plots"
)
if not plots then
return nil
end
for _,plot in ipairs(
plots:GetChildren()
) do
if plot:GetAttribute(
"OwnerUserId"
) == Player.UserId then
CachedPlot = plot
return plot
end
end
if not PlotNumber then
local success,number =
invoke(
RequestPlotRemote,
4
)
if success
and type(number) == "number" then
PlotNumber = number
end
end
if PlotNumber then
CachedPlot =
plots:FindFirstChild(
"Plot_"
.. tostring(PlotNumber)
)
end
return CachedPlot
end
local function getWorkbench()
local plot = getPlot()
if not plot then
return nil
end
local bench =
plot:FindFirstChild(
"Workbench",
true
)
if not bench then
return nil
end
return
bench:FindFirstChild(
"TableTop",
true
)
or bench
end
local function getPedestals()
if CachedPedestals
and os.clock() - PedestalCacheTime < 1 then
local valid = true
for _,pedestal in ipairs(
CachedPedestals
) do
if not pedestal.Parent then
valid = false
break
end
end
if valid then
return CachedPedestals
end
end
local result = {}
local plot = getPlot()
if not plot then
return result
end
for _,object in ipairs(
plot:GetDescendants()
) do
if object:IsA("Model")
and type(
object:GetAttribute(
"Slot"
)
) == "number"
and object:GetAttribute(
"Owned"
) == true then
table.insert(
result,
object
)
end
end
table.sort(
result,
function(a,b)
return
a:GetAttribute("Slot")
<
b:GetAttribute("Slot")
end
)
CachedPedestals = result
PedestalCacheTime = os.clock()
return result
end
local function findPedestalBySlot(slot)
for _,pedestal in ipairs(
getPedestals()
) do
if pedestal:GetAttribute(
"Slot"
) == slot then
return pedestal
end
end
return nil
end
local function pedestalEmpty(pedestal)
local uid =
pedestal:GetAttribute(
"ItemUid"
)
return
type(uid) ~= "string"
or uid == ""
end
local function getOpenPedestal()
for _,pedestal in ipairs(
getPedestals()
) do
if pedestalEmpty(
pedestal
) then
return pedestal
end
end
return nil
end
local function parseMoney(text)
if type(text) ~= "string" then
return nil
end
local clean =
text:gsub(",","")
:gsub("¢","")
:gsub("%$","")
:gsub("%s+","")
local number,suffix =
clean:match(
"([%d%.]+)([%a]*)"
)
number = tonumber(number)
if not number then
return nil
end
suffix =
string.lower(
suffix or ""
)
local mult = {
[""] = 1,
k = 1e3,
m = 1e6,
b = 1e9,
t = 1e12,
qa = 1e15,
qi = 1e18,
sx = 1e21,
sp = 1e24,
oc = 1e27,
no = 1e30,
dc = 1e33
}
return
number
* (
mult[suffix]
or 1
)
end
local function valueFromEntry(item)
if not item then
return 0
end
if KnownValues[item.uid] then
return KnownValues[item.uid]
end
for _,key in ipairs({
"value",
"Value",
"sellValue",
"SellValue",
"worth",
"Worth",
"price",
"Price"
}) do
if type(item[key]) == "number" then
return item[key]
end
end
local tool =
getToolByUid(
item.uid
)
if tool then
for _,key in ipairs({
"value",
"Value",
"sellValue",
"SellValue",
"worth",
"Worth",
"price",
"Price"
}) do
local value =
tool:GetAttribute(
key
)
if type(value) == "number" then
return value
end
end
end
return 0
end
local function getPedestalValue(pedestal)
for _,object in ipairs(
pedestal:GetDescendants()
) do
if object:IsA("TextLabel") then
local lower =
string.lower(
object.Name
)
if lower == "money"
or string.find(
lower,
"value",
1,
true
) then
local value =
parseMoney(
object.Text
)
if value then
return value
end
end
end
end
local uid =
pedestal:GetAttribute(
"ItemUid"
)
if type(uid) == "string"
and uid ~= "" then
return valueFromEntry(
findInventory(
uid,
getData()
)
)
end
return 0
end
local function pedestalFavorited(pedestal)
local uid =
pedestal:GetAttribute(
"ItemUid"
)
if type(uid) ~= "string"
or uid == "" then
return false
end
local item =
findInventory(
uid,
getData()
)
return
item
and item.favorited == true
or false
end
local function weakestPedestal()
local weakest
local weakestValue = math.huge
for _,pedestal in ipairs(
getPedestals()
) do
if not pedestalEmpty(pedestal)
and not pedestalFavorited(
pedestal
) then
local value =
getPedestalValue(
pedestal
)
if value
and value < weakestValue then
weakest = pedestal
weakestValue = value
end
end
end
return weakest,weakestValue
end
local function findPrompt(object,words)
if not object then
return nil
end
local fallback
for _,descendant in ipairs(
object:GetDescendants()
) do
if descendant:IsA(
"ProximityPrompt"
) then
fallback =
fallback or descendant
local text =
string.lower(
tostring(
descendant.ActionText
)
.. " "
.. tostring(
descendant.ObjectText
)
.. " "
.. descendant.Name
)
for _,word in ipairs(
words or {}
) do
if string.find(
text,
string.lower(word),
1,
true
) then
return descendant
end
end
end
end
return fallback
end
local function triggerPrompt(prompt)
if not prompt then
return false
end
if Caps.FirePrompt then
local success =
pcall(function()
fireproximityprompt(
prompt
)
end)
if success then
task.wait(0.1)
return true
end
end
local duration =
math.max(
prompt.HoldDuration,
0.05
)
local success =
pcall(function()
prompt:InputHoldBegin()
task.wait(
duration + 0.08
)
prompt:InputHoldEnd()
end)
if success then
task.wait(0.1)
return true
end
local key =
prompt.KeyboardKeyCode
if key == Enum.KeyCode.Unknown then
key = Enum.KeyCode.E
end
success =
pcall(function()
VirtualInputManager:SendKeyEvent(
true,
key,
false,
game
)
task.wait(
duration + 0.08
)
VirtualInputManager:SendKeyEvent(
false,
key,
false,
game
)
end)
task.wait(0.1)
return success
end
local function verifyPickedUp(
pedestal,
uid,
timeout
)
local started = os.clock()
repeat
local data =
refreshData()
local item =
findInventory(
uid,
data
)
local pedestalUid =
pedestal:GetAttribute(
"ItemUid"
)
if (
pedestalUid == nil
or pedestalUid == ""
)
and item
and item.pedestalSlot == nil then
return true
end
task.wait(0.035)
until not alive()
or os.clock() - started
> (timeout or 2)
return false
end
local function pickupPedestal(pedestal)
if not pedestal then
return nil
end
local slot =
pedestal:GetAttribute(
"Slot"
)
local uid =
pedestal:GetAttribute(
"ItemUid"
)
if type(slot) ~= "number"
or type(uid) ~= "string"
or uid == "" then
return nil
end
unequipTools()
teleportNear(
pedestal,
2
)
task.wait(0.08)
local prompt =
findPrompt(
pedestal,
{
"pick up",
"pickup",
"pick"
}
)
if prompt then
triggerPrompt(prompt)
if verifyPickedUp(
pedestal,
uid,
1.5
) then
CachedPedestals = nil
return uid
end
end
local success =
invoke(
PickupItemRemote,
3,
slot
)
if success
and verifyPickedUp(
pedestal,
uid,
1.5
) then
CachedPedestals = nil
return uid
end
return nil
end
local function getSeller()
if CachedSeller
and CachedSeller.Parent then
return CachedSeller
end
local islands =
workspace:FindFirstChild(
"Islands"
)
if not islands then
return nil
end
local home =
islands:FindFirstChild(
"Home Beach"
)
if home then
CachedSeller =
home:FindFirstChild(
"SellerNPC",
true
)
if CachedSeller then
return CachedSeller
end
end
CachedSeller =
islands:FindFirstChild(
"SellerNPC",
true
)
return CachedSeller
end
local function itemStillExists(uid)
return
findInventory(
uid,
refreshData()
) ~= nil
end
local function sellUid(uid)
if not uid then
return false,"missing uid"
end
local item =
findInventory(
uid,
refreshData()
)
if not item then
return true,"gone"
end
if item.favorited == true then
return false,"favorited"
end
if item.pedestalSlot ~= nil then
return false,"displayed"
end
unequipTools()
if not equipUid(uid) then
return false,"equip failed"
end
local seller =
getSeller()
if not seller then
return false,"seller missing"
end
teleportNear(
seller,
3
)
task.wait(0.09)
for attempt = 1,3 do
if not equipUid(uid) then
task.wait(0.1)
continue
end
local success,result =
invoke(
SellHeldRemote,
3
)
task.wait(0.1)
if not itemStillExists(uid) then
resetDigEquipment()
return true,"sold"
end
if result == "favorited" then
resetDigEquipment()
return false,"favorited"
end
if attempt < 3 then
teleportNear(
seller,
3
)
task.wait(0.1)
end
end
resetDigEquipment()
return false,"sell failed"
end
local function verifyPlaced(
pedestal,
uid,
timeout
)
local started = os.clock()
repeat
if pedestal:GetAttribute(
"ItemUid"
) == uid then
refreshData()
CachedPedestals = nil
return true
end
task.wait(0.03)
until not alive()
or os.clock() - started
> (timeout or 1.3)
return false
end
local function placeUid(pedestal,uid)
if not pedestal or not uid then
return false
end
local slot =
pedestal:GetAttribute(
"Slot"
)
if type(slot) ~= "number" then
return false
end
unequipTools()
if not equipUid(uid) then
return false
end
teleportNear(
pedestal,
2
)
task.wait(0.07)
local success,result =
invoke(
PlaceItemRemote,
3,
slot,
uid
)
if success
and result == true
and verifyPlaced(
pedestal,
uid,
1.2
) then
resetDigEquipment()
return true
end
local prompt =
findPrompt(
pedestal,
{"place"}
)
if prompt then
equipUid(uid)
triggerPrompt(prompt)
if verifyPlaced(
pedestal,
uid,
1.2
) then
resetDigEquipment()
return true
end
end
resetDigEquipment()
return false
end
local function manageItem(uid,force)
local allowPlace =
force
or Settings.AutoPlace
local allowSell =
force
or Settings.AutoSell
local returnPosition =
savePosition()
local item =
findInventory(
uid,
refreshData()
)
if not item
or item.dirty == true then
restorePosition(
returnPosition
)
return false
end
local newValue =
valueFromEntry(item)
local open =
getOpenPedestal()
if open then
if allowPlace then
local success =
placeUid(
open,
uid
)
restorePosition(
returnPosition
)
resetDigEquipment()
if success then
notify(
"Item Logic",
"Placed in open slot"
)
end
return success
elseif allowSell then
local success,reason =
sellUid(uid)
restorePosition(
returnPosition
)
resetDigEquipment()
if not success then
notify(
"Item Logic",
"Sell failed: "
.. tostring(reason)
)
end
return success
else
restorePosition(
returnPosition
)
resetDigEquipment()
return true
end
end
local weakest,weakestValue =
weakestPedestal()
if not weakest
or newValue <= 0
or newValue <= weakestValue then
if allowSell then
local success,reason =
sellUid(uid)
restorePosition(
returnPosition
)
resetDigEquipment()
if not success then
notify(
"Item Logic",
"Sell failed: "
.. tostring(reason)
)
end
return success
end
restorePosition(
returnPosition
)
resetDigEquipment()
return true
end
if not allowPlace then
if allowSell then
local success,reason =
sellUid(uid)
restorePosition(
returnPosition
)
resetDigEquipment()
if not success then
notify(
"Item Logic",
"Sell failed: "
.. tostring(reason)
)
end
return success
end
restorePosition(
returnPosition
)
resetDigEquipment()
return true
end
local oldUid =
weakest:GetAttribute(
"ItemUid"
)
local oldSlot =
weakest:GetAttribute(
"Slot"
)
local picked =
pickupPedestal(
weakest
)
if picked ~= oldUid then
restorePosition(
returnPosition
)
resetDigEquipment()
notify(
"Item Logic",
"Pickup failed"
)
return false
end
task.wait(0.08)
if allowSell then
local soldOld,reason =
sellUid(oldUid)
if not soldOld then
local original =
findPedestalBySlot(
oldSlot
)
if original then
placeUid(
original,
oldUid
)
end
restorePosition(
returnPosition
)
resetDigEquipment()
notify(
"Item Logic",
"Old sale failed: "
.. tostring(reason)
)
return false
end
end
task.wait(0.06)
local target =
findPedestalBySlot(
oldSlot
)
local placed =
target
and placeUid(
target,
uid
)
restorePosition(
returnPosition
)
resetDigEquipment()
if placed then
if allowSell then
notify(
"Item Logic",
"Replaced weaker item"
)
else
notify(
"Item Logic",
"Replaced item; old item kept in inventory"
)
end
end
return placed == true
end
local function instantClean(
item,
manageAfter,
forceManage
)
if not item or not item.uid then
return false
end
local uid = item.uid
local returnPosition =
savePosition()
local bench =
getWorkbench()
if bench then
teleportTo(bench)
task.wait(0.08)
end
unequipTools()
if not equipUid(uid) then
restorePosition(
returnPosition
)
resetDigEquipment()
return false
end
local success,result =
invoke(
BeginCleaningRemote,
4,
uid
)
if not success then
restorePosition(
returnPosition
)
resetDigEquipment()
return false
end
if type(result) == "number" then
KnownValues[uid] = result
elseif type(result) == "table" then
for _,key in ipairs({
"value",
"Value",
"sellValue",
"SellValue",
"worth",
"Worth"
}) do
if type(result[key]) == "number" then
KnownValues[uid] =
result[key]
break
end
end
end
pcall(function()
SaveCleanProgressRemote:FireServer(
uid,
FULL_CLEAN_MASK
)
end)
task.wait(0.03)
pcall(function()
FinishCleaningRemote:FireServer(
uid
)
end)
local cleaned = false
local started = os.clock()
repeat
local updated =
findInventory(
uid,
refreshData()
)
if updated
and updated.dirty == false then
cleaned = true
break
end
task.wait(0.04)
until not alive()
or os.clock() - started > 1.3
restorePosition(
returnPosition
)
resetDigEquipment()
if cleaned
and manageAfter then
manageItem(
uid,
forceManage
)
end
NextSearch =
os.clock() + 0.1
return cleaned
end
local function findDefinition(list,id)
for _,gear in ipairs(list) do
if gear[1] == id then
return gear
end
end
return nil
end
local function islandUnlocked(
data,
islandId
)
if islandId == "starterIsland" then
return true
end
return
data
and type(
data.UnlockedIslands
) == "table"
and table.find(
data.UnlockedIslands,
islandId
) ~= nil
end
local function gearOwned(data,key,id)
return
data
and type(data[key]) == "table"
and table.find(
data[key],
id
) ~= nil
end
local function bestOwnedGear(
list,
data,
key
)
if not data
or type(data[key]) ~= "table" then
return nil
end
local best
local score = -math.huge
for _,id in ipairs(
data[key]
) do
local gear =
findDefinition(
list,
id
)
if gear
and gear[4] > score then
best = gear
score = gear[4]
end
end
return best
end
local function bestAffordableGear(
list,
data,
ownedKey,
equippedKey
)
if not data then
return nil
end
local money =
tonumber(data.Gold)
or 0
local current =
findDefinition(
list,
data[equippedKey]
)
local bestScore =
current
and current[4]
or 0
local best
for _,gear in ipairs(list) do
if gear[3] > 0
and gear[3] <= money
and gear[4] > bestScore
and islandUnlocked(
data,
gear[5]
)
and not gearOwned(
data,
ownedKey,
gear[1]
) then
best = gear
bestScore = gear[4]
end
end
return best
end
local ShopCache = {}
local function findShopModel(
gear,
folderName
)
local key =
folderName
.. ":"
.. gear[1]
local cached =
ShopCache[key]
if cached
and cached.Parent then
return cached
end
for _,object in ipairs(
workspace:GetDescendants()
) do
if object:IsA("Model")
and object.Name == gear[2] then
local ancestor =
object.Parent
while ancestor
and ancestor ~= workspace do
if ancestor.Name == folderName then
ShopCache[key] = object
return object
end
ancestor =
ancestor.Parent
end
end
end
return nil
end
local function autoBuyGear(
category,
list,
ownedKey,
equippedKey,
shopFolder
)
local data =
refreshData()
if not data then
return false
end
local current =
findDefinition(
list,
data[equippedKey]
)
local ownedBest =
bestOwnedGear(
list,
data,
ownedKey
)
if ownedBest
and (
not current
or ownedBest[4] > current[4]
) then
local success =
invoke(
EquipGearRemote,
3,
category,
ownedBest[1]
)
refreshData()
resetDigEquipment()
return success == true
end
local gear =
bestAffordableGear(
list,
data,
ownedKey,
equippedKey
)
if not gear then
return false
end
local returnPosition =
savePosition()
local shop =
findShopModel(
gear,
shopFolder
)
if shop then
teleportTo(shop)
task.wait(0.07)
end
local success,bought =
invoke(
BuyGearRemote,
4,
category,
gear[1]
)
if success
and bought == true then
task.wait(0.04)
invoke(
EquipGearRemote,
3,
category,
gear[1]
)
refreshData()
end
restorePosition(
returnPosition
)
resetDigEquipment()
return
success
and bought == true
end
local function autoBuyShovel()
return autoBuyGear(
"shovel",
Shovels,
"OwnedShovels",
"EquippedShovel",
"BuyShovels"
)
end
local function autoBuyDetector()
return autoBuyGear(
"detector",
Detectors,
"OwnedDetectors",
"EquippedDetector",
"BuyDetectors"
)
end
local function isDigUI()
local gui =
PlayerGui:FindFirstChild(
"DigGui"
)
if not gui then
return false
end
local bar =
gui:FindFirstChild(
"DigBar",
true
)
return
bar
and bar:IsA("GuiObject")
and bar.Visible
end
local function isDigging()
if Digging then
return true
end
if isDigUI() then
return true
end
local hrp = root()
local hum = humanoid()
if hrp
and hrp:FindFirstChild(
"PowerBar"
) then
return true
end
if hrp
and hum
and hrp.Anchored
and hum.AutoRotate == false then
return true
end
return false
end
DigSceneStartRemote.OnClientEvent:Connect(
function(userId)
if not alive() then
return
end
if type(userId) == "number"
and userId ~= Player.UserId then
return
end
Digging = true
CandidateLock =
os.clock() + 1.5
end
)
DigSceneEndRemote.OnClientEvent:Connect(
function(userId)
if not alive() then
return
end
if type(userId) == "number"
and userId ~= Player.UserId then
return
end
task.delay(
0.06,
function()
if not alive() then
return
end
Digging = false
CandidateLock = 0
NextSearch =
os.clock() + 0.15
TestDigActive = false
resetDigEquipment()
end
)
end
)
BuriedNodesRemote.OnClientEvent:Connect(
function(added,removed)
if not alive() then
return
end
if type(added) == "table" then
for _,node in ipairs(added) do
if type(node) == "table"
and type(node.id) == "string"
and typeof(node.position)
== "Vector3" then
BuriedNodes[node.id] =
node
end
end
end
if type(removed) == "table" then
for _,id in ipairs(removed) do
BuriedNodes[id] = nil
FailedNodes[id] = nil
end
end
end
)
local function physicalClick()
if Caps.Mouse1Click then
local success =
pcall(function()
mouse1click()
end)
if success then
return
end
end
local camera =
workspace.CurrentCamera
if not camera then
return
end
local size =
camera.ViewportSize
pcall(function()
VirtualInputManager:SendMouseButtonEvent(
size.X / 2,
size.Y / 2,
0,
true,
game,
0
)
VirtualInputManager:SendMouseButtonEvent(
size.X / 2,
size.Y / 2,
0,
false,
game,
0
)
end)
end
local function digClick()
local char = character()
if char then
local tool =
char:FindFirstChildOfClass(
"Tool"
)
if tool then
pcall(function()
tool:Activate()
end)
end
end
physicalClick()
end
local IslandsFolder =
workspace:WaitForChild(
"Islands"
)
local function isDigAreaPart(object)
return
object:IsA("BasePart")
and object.Name == "DigArea"
end
local function invalidateIsland(island)
IslandProfiles[island] = nil
IslandStates[island] = nil
end
local function buildIslandProfile(island)
local parts = {}
if not island
or not island.Parent then
return {
Island = island,
Parts = parts,
Mode = "None"
}
end
for _,object in ipairs(
island:GetDescendants()
) do
if isDigAreaPart(object) then
local ancestor =
object.Parent
local valid =
object.Parent
and object.Parent.Name
== "DigAreas"
while not valid
and ancestor
and ancestor ~= island do
if ancestor.Name == "DigAreas" then
valid = true
break
end
ancestor =
ancestor.Parent
end
if valid then
table.insert(
parts,
object
)
end
end
end
table.sort(
parts,
function(a,b)
return
a:GetFullName()
<
b:GetFullName()
end
)
return {
Island = island,
Parts = parts,
Mode =
#parts >= 4
and "Hotspots"
or "Zone"
}
end
local function getIslandProfile(island)
local cached =
IslandProfiles[island]
if cached then
local valid = true
for _,part in ipairs(
cached.Parts
) do
if not part.Parent then
valid = false
break
end
end
if valid then
return cached
end
end
local profile =
buildIslandProfile(
island
)
IslandProfiles[island] =
profile
return profile
end
local function getIslandState(island)
if not IslandStates[island] then
IslandStates[island] = {
Cursor = 0,
FailedParts = {}
}
end
return IslandStates[island]
end
local function insidePart(
part,
position,
padding
)
local point =
part.CFrame:PointToObjectSpace(
position
)
padding = padding or 0
return
math.abs(point.X)
<= part.Size.X / 2 + padding
and
math.abs(point.Z)
<= part.Size.Z / 2 + padding
end
local function getRaycastIgnore(
island,
profile
)
local ignore = {}
local char = character()
if char then
table.insert(
ignore,
char
)
end
profile =
profile
or getIslandProfile(
island
)
for _,part in ipairs(
profile.Parts
) do
table.insert(
ignore,
part
)
end
return ignore
end
local function groundAt(
island,
position,
profile
)
local params =
RaycastParams.new()
params.FilterType =
Enum.RaycastFilterType.Exclude
params.IgnoreWater = false
params.FilterDescendantsInstances =
getRaycastIgnore(
island,
profile
)
return workspace:Raycast(
position
+ Vector3.new(
0,
65,
0
),
Vector3.new(
0,
-200,
0
),
params
)
end
local function teleportGround(
island,
position,
profile
)
if isDigging() then
return false
end
local hrp = root()
local hum = humanoid()
if not hrp or not hum then
return false
end
local result =
groundAt(
island,
position,
profile
)
if not result then
return false
end
local offset =
hum.HipHeight
+ hrp.Size.Y / 2
+ 0.02
hrp.CFrame =
CFrame.new(
result.Position
+ Vector3.new(
0,
offset,
0
)
)
* hrp.CFrame.Rotation
hrp.AssemblyLinearVelocity =
Vector3.zero
hrp.AssemblyAngularVelocity =
Vector3.zero
return true
end
local function randomPointInPart(
part,
inset
)
inset = inset or 0.15
local halfX =
math.max(
0,
part.Size.X
* 0.5
* (1 - inset)
)
local halfZ =
math.max(
0,
part.Size.Z
* 0.5
* (1 - inset)
)
local x =
halfX > 0.5
and RNG:NextNumber(
-halfX,
halfX
)
or 0
local z =
halfZ > 0.5
and RNG:NextNumber(
-halfZ,
halfZ
)
or 0
return
part.CFrame
* Vector3.new(
x,
0,
z
)
end
local function getNearestNodeForProfile(
profile
)
local hrp = root()
if not hrp then
return nil
end
local best
local bestDistance = math.huge
local now = os.clock()
for id,node in pairs(
BuriedNodes
) do
if type(node) == "table"
and typeof(node.position)
== "Vector3" then
local valid = false
for _,part in ipairs(
profile.Parts
) do
if insidePart(
part,
node.position,
4
) then
valid = true
break
end
end
if valid then
local failed =
FailedNodes[id]
if not failed
or now >= failed then
local distance =
(
hrp.Position
- node.position
).Magnitude
if distance
< bestDistance then
bestDistance =
distance
best = node
end
end
end
end
end
return best
end
local function nextHotspot(profile)
local parts = profile.Parts
if #parts == 0 then
return nil
end
local state =
getIslandState(
profile.Island
)
local now = os.clock()
for _ = 1,#parts do
state.Cursor += 1
if state.Cursor > #parts then
state.Cursor = 1
end
local part =
parts[state.Cursor]
local failed =
state.FailedParts[part]
if part.Parent
and (
not failed
or now >= failed
) then
return part
end
end
return
parts[
RNG:NextInteger(
1,
#parts
)
]
end
local function nearestZone(profile)
local hrp = root()
if not hrp then
return nil
end
for _,part in ipairs(
profile.Parts
) do
if insidePart(
part,
hrp.Position,
1
) then
return part
end
end
local nearest
local nearestDistance = math.huge
for _,part in ipairs(
profile.Parts
) do
local distance =
(
hrp.Position
- part.Position
).Magnitude
if distance < nearestDistance then
nearestDistance = distance
nearest = part
end
end
return nearest
end
local function tryDig(timeout)
CandidateLock =
os.clock() + 1.05
setDetectorHeld(false)
resetDigEquipment()
local started = os.clock()
repeat
if isDigging() then
CandidateLock =
os.clock() + 1.5
return true
end
digClick()
task.wait(0.012)
until not alive()
or os.clock() - started
> (timeout or 0.65)
local grace = os.clock()
repeat
if isDigging() then
CandidateLock =
os.clock() + 1.5
return true
end
task.wait(0.006)
until not alive()
or os.clock() - grace > 0.18
CandidateLock = 0
return false
end
local function tryNode(profile,node)
if not teleportGround(
profile.Island,
node.position,
profile
) then
FailedNodes[node.id] =
os.clock() + 0.7
return false
end
setDetectorHeld(true)
task.wait(0.035)
setDetectorHeld(false)
if tryDig(0.65) then
return true
end
FailedNodes[node.id] =
os.clock() + 0.75
return false
end
local function tryHotspot(profile,part)
if not part
or not part.Parent then
return false
end
local point =
randomPointInPart(
part,
0.3
)
if not teleportGround(
profile.Island,
point,
profile
) then
getIslandState(
profile.Island
).FailedParts[part] =
os.clock() + 0.35
return false
end
setDetectorHeld(true)
task.wait(0.03)
setDetectorHeld(false)
if tryDig(0.6) then
return true
end
getIslandState(
profile.Island
).FailedParts[part] =
os.clock() + 0.4
return false
end
local function tryZone(profile,part)
if not part
or not part.Parent then
return false
end
local point =
randomPointInPart(
part,
0.1
)
if not teleportGround(
profile.Island,
point,
profile
) then
return false
end
setDetectorHeld(true)
task.wait(0.025)
setDetectorHeld(false)
return tryDig(0.38)
end
local function searchDig(
oneTest,
island
)
if not alive()
or Searching
or Busy
or isDigging() then
return false
end
island =
island or ActiveIsland
if not island
or not island.Parent then
return false
end
local profile =
getIslandProfile(
island
)
if #profile.Parts == 0 then
notify(
island.Name,
"No DigArea parts found"
)
return false
end
Searching = true
local found = false
while alive()
and (
oneTest
or (
Settings.AutoFarm
and Settings.AutoDig
and ActiveIsland == island
)
) do
if Busy or isDigging() then
found = isDigging()
break
end
local node =
getNearestNodeForProfile(
profile
)
if node then
if tryNode(
profile,
node
) then
found = true
break
end
elseif profile.Mode == "Hotspots" then
local hotspot =
nextHotspot(
profile
)
if hotspot
and tryHotspot(
profile,
hotspot
) then
found = true
break
end
else
local zone =
nearestZone(
profile
)
if zone
and tryZone(
profile,
zone
) then
found = true
break
end
end
task.wait(0.005)
end
Searching = false
return found
end
local function sellAll()
if Busy then
return
end
Busy = true
local returnPosition =
savePosition()
local snapshot =
inventoryEntries()
local sold = 0
local protected = 0
local failed = 0
for _,original in ipairs(snapshot) do
if not alive() then
break
end
local item =
findInventory(
original.uid,
refreshData()
)
if not item then
continue
end
if item.pedestalSlot ~= nil then
continue
end
if item.favorited == true then
protected += 1
continue
end
local success,reason =
sellUid(
item.uid
)
if success then
sold += 1
elseif reason == "favorited" then
protected += 1
else
failed += 1
end
task.wait(0.04)
end
restorePosition(
returnPosition
)
resetDigEquipment()
Busy = false
notify(
"Sell All",
"Sold "
.. tostring(sold)
.. " | Protected "
.. tostring(protected)
.. " | Failed "
.. tostring(failed)
)
end
local function testClean()
if Busy then
return
end
local choices = {}
for _,item in ipairs(
inventoryEntries()
) do
if item.pedestalSlot == nil
and item.dirty == true then
table.insert(
choices,
item
)
end
end
if #choices == 0 then
notify(
"Clean Test",
"No dirty item"
)
return
end
local item =
choices[
RNG:NextInteger(
1,
#choices
)
]
Busy = true
local success =
instantClean(
item,
false,
true
)
Busy = false
notify(
"Clean Test",
success
and "Worked"
or "Failed"
)
end
local function testSell()
if Busy then
return
end
local choices = {}
for _,item in ipairs(
inventoryEntries()
) do
if item.pedestalSlot == nil
and item.favorited ~= true then
table.insert(
choices,
item
)
end
end
if #choices == 0 then
notify(
"Sell Test",
"No sellable inventory item"
)
return
end
local item =
choices[
RNG:NextInteger(
1,
#choices
)
]
Busy = true
local success,reason =
sellUid(
item.uid
)
Busy = false
notify(
"Sell Test",
success
and "Worked"
or tostring(reason)
)
end
local function testManage()
if Busy then
return
end
local choices = {}
for _,item in ipairs(
inventoryEntries()
) do
if item.pedestalSlot == nil
and item.dirty == false
and item.favorited ~= true then
table.insert(
choices,
item
)
end
end
if #choices == 0 then
notify(
"Item Test",
"No clean unplaced item"
)
return
end
local item =
choices[
RNG:NextInteger(
1,
#choices
)
]
Busy = true
local success =
manageItem(
item.uid,
true
)
Busy = false
notify(
"Item Test",
success
and "Worked"
or "Failed"
)
end
Rayfield =
loadstring(
game:HttpGet(
"https://sirius.menu/rayfield"
)
)()
local Window =
Rayfield:CreateWindow({
Name = "Dig OP",
Icon = 0,
LoadingTitle = "Dig OP",
LoadingSubtitle = ExecutorName,
ShowText = "Dig OP",
Theme = "Default",
ToggleUIKeybind = "K",
DisableRayfieldPrompts = false,
DisableBuildWarnings = false,
ConfigurationSaving = {
Enabled = false
}
})
local Main =
Window:CreateTab(
"Main",
4483362458
)
Main:CreateParagraph({
Title = "Executor",
Content =
ExecutorName
.. "\nNative Click: "
.. tostring(Caps.Mouse1Click)
.. "\nNative Prompt: "
.. tostring(Caps.FirePrompt)
.. "\nFile Save: "
.. tostring(Caps.WriteFile)
})
Main:CreateParagraph({
Title = "AUTO FARM FEATURES",
Content =
"Turn individual systems on/off below. These only affect AUTO FARM."
})
Main:CreateToggle({
Name = "Auto Dig",
CurrentValue =
Settings.AutoDig,
Flag = "AutoDig",
Callback = function(value)
Settings.AutoDig = value
persist()
if value
and Settings.AutoFarm
and ActiveIsland
and not Busy
and not Searching
and not isDigging() then
task.spawn(
searchDig,
false,
ActiveIsland
)
end
end
})
Main:CreateToggle({
Name = "Auto Fast Click",
CurrentValue =
Settings.AutoFastClick,
Flag = "AutoFastClick",
Callback = function(value)
Settings.AutoFastClick =
value
persist()
end
})
Main:CreateToggle({
Name = "Auto Clean",
CurrentValue =
Settings.AutoClean,
Flag = "AutoClean",
Callback = function(value)
Settings.AutoClean =
value
persist()
end
})
Main:CreateToggle({
Name = "Auto Place / Replace",
CurrentValue =
Settings.AutoPlace,
Flag = "AutoPlace",
Callback = function(value)
Settings.AutoPlace =
value
persist()
end
})
Main:CreateToggle({
Name = "Auto Sell",
CurrentValue =
Settings.AutoSell,
Flag = "AutoSell",
Callback = function(value)
Settings.AutoSell =
value
persist()
end
})
Main:CreateToggle({
Name = "Auto Buy Best Shovel",
CurrentValue =
Settings.AutoBuyShovel,
Flag = "AutoBuyShovel",
Callback = function(value)
Settings.AutoBuyShovel =
value
persist()
end
})
Main:CreateToggle({
Name = "Auto Buy Best Detector",
CurrentValue =
Settings.AutoBuyDetector,
Flag = "AutoBuyDetector",
Callback = function(value)
Settings.AutoBuyDetector =
value
persist()
end
})
Main:CreateParagraph({
Title = "Hotkeys",
Content =
"F = Manual Fast Click | K = Hide UI"
})
Main:CreateButton({
Name = "TEST - Auto Clean",
Callback = function()
task.spawn(
testClean
)
end
})
Main:CreateButton({
Name = "TEST - Sell Random Inventory Item",
Callback = function()
task.spawn(
testSell
)
end
})
Main:CreateButton({
Name = "TEST - Place / Replace / Sell",
Callback = function()
task.spawn(
testManage
)
end
})
Main:CreateButton({
Name = "TEST - Buy Best Shovel",
Callback = function()
if Busy then
return
end
task.spawn(function()
Busy = true
local success =
autoBuyShovel()
Busy = false
notify(
"Shovel Test",
success
and "Upgrade handled"
or "No upgrade"
)
end)
end
})
Main:CreateButton({
Name = "TEST - Buy Best Detector",
Callback = function()
if Busy then
return
end
task.spawn(function()
Busy = true
local success =
autoBuyDetector()
Busy = false
notify(
"Detector Test",
success
and "Upgrade handled"
or "No upgrade"
)
end)
end
})
Main:CreateButton({
Name = "SELL ALL INVENTORY ITEMS",
Callback = function()
task.spawn(
sellAll
)
end
})
local Islands = {}
for _,island in ipairs(
IslandsFolder:GetChildren()
) do
local profile =
getIslandProfile(
island
)
if #profile.Parts > 0 then
table.insert(
Islands,
island
)
end
island.DescendantAdded:Connect(
function(object)
if not alive() then
return
end
if object.Name == "DigArea"
or object.Name == "DigAreas"
or object.Name == "DigAreaMesh" then
invalidateIsland(
island
)
end
end
)
island.DescendantRemoving:Connect(
function(object)
if not alive() then
return
end
if object.Name == "DigArea"
or object.Name == "DigAreas"
or object.Name == "DigAreaMesh" then
invalidateIsland(
island
)
end
end
)
end
table.sort(
Islands,
function(a,b)
return
a.Name:lower()
<
b.Name:lower()
end
)
local function disableOtherToggles(selected)
ChangingToggle = true
for island,toggle in pairs(
IslandToggles
) do
if island ~= selected then
pcall(function()
toggle:Set(false)
end)
end
end
ChangingToggle = false
end
local function startFarm(island)
if not alive()
or not island
or not island.Parent then
return
end
disableOtherToggles(
island
)
ActiveIsland = island
Settings.AutoFarm = true
Settings.ActiveIsland = island.Name
CandidateLock = 0
NextSearch = 0
NextGearCheck = 0
persist()
local profile =
getIslandProfile(
island
)
notify(
island.Name,
"Auto Farm ON | "
.. profile.Mode
.. " | "
.. tostring(#profile.Parts)
.. " DigAreas"
)
if Settings.AutoDig then
task.spawn(function()
resetDigEquipment()
searchDig(
false,
island
)
end)
end
end
local function stopFarm(island)
if ActiveIsland ~= island then
return
end
Settings.AutoFarm = false
Settings.ActiveIsland = nil
ActiveIsland = nil
CandidateLock = 0
persist()
setDetectorHeld(false)
resetDigEquipment()
notify(
island.Name,
"Auto Farm OFF"
)
end
for _,island in ipairs(Islands) do
local Island = island
local profile =
getIslandProfile(
Island
)
local tab =
Window:CreateTab(
Island.Name,
4483362458
)
tab:CreateParagraph({
Title = "Dig System",
Content =
"Detected: "
.. profile.Mode
.. "\nDigArea parts: "
.. tostring(#profile.Parts)
})
local toggle
toggle =
tab:CreateToggle({
Name =
"AUTO FARM - "
.. Island.Name,
CurrentValue = false,
Flag =
"Farm_"
.. Island.Name,
Callback = function(value)
if ChangingToggle
or not alive() then
return
end
if value then
startFarm(Island)
else
stopFarm(Island)
end
end
})
IslandToggles[Island] =
toggle
tab:CreateButton({
Name = "TEST - Dig System",
Callback = function()
if Busy
or Searching
or isDigging() then
return
end
TestDigActive = true
task.spawn(function()
local success =
searchDig(
true,
Island
)
if not success then
TestDigActive = false
end
notify(
Island.Name,
success
and "Dig started"
or "No dig found"
)
end)
end
})
tab:CreateButton({
Name = "TEST - Teleport Candidate",
Callback = function()
local current =
getIslandProfile(
Island
)
if #current.Parts == 0 then
notify(
Island.Name,
"No DigAreas"
)
return
end
local part
if current.Mode == "Hotspots" then
part =
nextHotspot(
current
)
else
part =
nearestZone(
current
)
end
if not part then
return
end
local success =
teleportGround(
Island,
randomPointInPart(
part,
current.Mode == "Hotspots"
and 0.3
or 0.1
),
current
)
notify(
Island.Name,
success
and "Teleported"
or "Raycast failed"
)
end
})
tab:CreateButton({
Name = "Refresh Dig Detection",
Callback = function()
invalidateIsland(
Island
)
local updated =
getIslandProfile(
Island
)
notify(
Island.Name,
updated.Mode
.. " | "
.. tostring(#updated.Parts)
.. " DigAreas"
)
end
})
end
UserInputService.InputBegan:Connect(
function(input,processed)
if not alive()
or processed then
return
end
if input.KeyCode
== Enum.KeyCode.F then
ManualFastClick =
not ManualFastClick
notify(
"Fast Click",
ManualFastClick
and "ON"
or "OFF"
)
end
end
)
task.spawn(function()
while alive() do
task.wait(0.012)
if isDigging()
and (
ManualFastClick
or TestDigActive
or (
Settings.AutoFarm
and Settings.AutoFastClick
)
) then
digClick()
end
end
end)
task.spawn(function()
while alive() do
task.wait(0.04)
if not Settings.AutoFarm
or not ActiveIsland then
continue
end
if not ActiveIsland.Parent then
Settings.AutoFarm = false
ActiveIsland = nil
persist()
continue
end
if Busy
or Searching
or isDigging() then
continue
end
if Settings.AutoClean then
local dirty =
getDirtyItem()
if dirty then
Busy = true
instantClean(
dirty,
Settings.AutoPlace
or Settings.AutoSell,
false
)
Busy = false
resetDigEquipment()
continue
end
end
if not Settings.AutoDig then
continue
end
if os.clock() < NextSearch then
continue
end
if CandidateLock > 0
and os.clock() < CandidateLock then
continue
end
local island = ActiveIsland
task.spawn(
searchDig,
false,
island
)
end
end)
task.spawn(function()
while alive() do
task.wait(0.7)
if not Settings.AutoFarm
or not ActiveIsland then
continue
end
if Busy
or Searching
or isDigging() then
continue
end
if os.clock()
< NextGearCheck then
continue
end
NextGearCheck =
os.clock() + 1.3
local didSomething = false
Busy = true
if Settings.AutoBuyShovel then
autoBuyShovel()
didSomething = true
task.wait(0.05)
end
if Settings.AutoBuyDetector then
autoBuyDetector()
didSomething = true
end
if didSomething then
resetDigEquipment()
end
Busy = false
end
end)
Player.CharacterAdded:Connect(
function()
if not alive() then
return
end
task.wait(0.6)
Digging = false
Searching = false
CandidateLock = 0
NextSearch =
os.clock() + 0.3
CachedPlot = nil
CachedPedestals = nil
resetDigEquipment()
if Settings.AutoFarm
and Settings.AutoDig
and ActiveIsland
and ActiveIsland.Parent then
task.spawn(
searchDig,
false,
ActiveIsland
)
end
end
)
local SavedIsland
if Settings.ActiveIsland then
SavedIsland =
IslandsFolder:FindFirstChild(
Settings.ActiveIsland
)
end
if Settings.AutoFarm
and SavedIsland
and getIslandProfile(
SavedIsland
).Mode ~= "None" then
task.delay(
1,
function()
if not alive() then
return
end
local toggle =
IslandToggles[
SavedIsland
]
if toggle then
pcall(function()
toggle:Set(true)
end)
else
startFarm(
SavedIsland
)
end
end
)
end
Rayfield:Notify({
Title = "Dig OP",
Content =
ExecutorName
.. " | Auto Farm feature toggles added | K = UI",
Duration = 5
})No comments yet for this script.