
Key Required VerifiedUniversal

-- Load Rayfield Library
local Rayfield = loadstring(game:HttpGet('https://sirius.menu/rayfield'))()
-- Runs a block safely; if it errors, shows the error on screen instead of silently killing the script
local function try(label, fn)
local ok, err = pcall(fn)
if not ok then
warn("[" .. label .. "] " .. tostring(err))
pcall(function()
Rayfield:Notify({ Title = "Error: " .. label, Content = tostring(err), Duration = 10 })
end)
end
return ok
end
local function notify(title, content)
pcall(function()
Rayfield:Notify({ Title = title, Content = content, Duration = 4 })
end)
end
local Window = Rayfield:CreateWindow({
Name = "+1 Cut Grass Adventure! | By SAVX",
LoadingTitle = "Loading Script...",
LoadingSubtitle = "",
ConfigurationSaving = { Enabled = false },
Discord = {
Enabled = true,
Invite = "jNxWhwcSTh", -- discord.gg/jNxWhwcSTh
RememberJoins = true
},
KeySystem = false
})
-- Services
local Players = game:GetService("Players")
local Workspace = game:GetService("Workspace")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local TweenService = game:GetService("TweenService")
local UserInputService = game:GetService("UserInputService")
local LocalPlayer = Players.LocalPlayer
-- Safe remote lookup (never errors; warns + notifies if something is missing)
local function find(root, path)
local cur = root
for _, name in ipairs(string.split(path, "/")) do
cur = cur and cur:FindFirstChild(name)
end
return cur
end
local Knit = find(ReplicatedStorage, "Packages/_Index/acecateer_knit@1.7.2/knit/Services")
local Missing = {}
local function remote(path)
local r = Knit and find(Knit, path)
if not r then table.insert(Missing, path) end
return r
end
local StrengthClickRE = remote("StrengthService/RE/ClickRequested")
local NotificationRE = remote("NotificationService/RE/NotificationRequested")
local UnequipLootRF = remote("LootInventoryService/RF/UnequipLoot")
local ResetBackpackRF = remote("LootInventoryService/RF/ResetBackpackLoadAtBase")
local SellAllRF = remote("DataService/RF/SellAllBackpackLoot")
local BuyCutterRF = remote("CuttersShopService/RF/BuyCutter")
local EquipCutterRF = remote("CuttersShopService/RF/EquipCutter")
local GetShopStateRF = remote("CuttersShopService/RF/GetShopState")
local RebirthRE = remote("RebirtService/RE/RebirthButtonClicked") -- "Rebirt" spelling matches the game
-- State
local AutoFarmStrengthEnabled = false
local StrengthDelay = 0
local AutoCollectEnabled = false
local ReturnToStart = false
local AutoSellWhenFullEnabled = false
local TimedAutoSellEnabled = false
local AutoBuyCuttersEnabled = false
local AutoRebirthEnabled = false
local IsSelling = false
local PredictorBusy = false
local SellInterval = 5
local TravelSpeed = 0.3
local SelectedItems = {} -- [normalizedName] = true
local SelectedRarities = {} -- [lowercase rarity] = true
local RecentlyTried = {} -- [instance] = tick()
-- Loot list
local RawLootList = {
"01_Button", "02_Rusty_Nail", "03_Old_Coin", "04_Pocket_Watch", "05_Copper_Gear",
"06_Silver_Spoon", "07_Medallion", "08_ Broken_Compass ", "09_ Dew_Crystal", "10_Key",
"11_Moon_Flower", "12_Horseshoe", "13_ Violet_Shard", "14_Royal_Brooch", "15_Flaming_Ring",
"16_Ancient_Goblet", "17_Golden_Feather", "18_Dragon_Tooth", "19_Obelisk", "20_Sun_Idol",
"21_Black_Crystal", "22_Hourglass", "23_ Retro_Radio", "24_Ruby_Leaf", "25_ Clover_Prism",
"26_Sealed_Scroll", "27_Tiny Portal", "28_Angel_Wing", "29_Comet_Heart", "30_Dawn_Diadem ",
"31_Celestial_Star", "32_Moon_Fragment", "33_Living_Star", "34_Amber_Beetle", "35_Shaman_Mask",
"36_Eternal_Flower", "37_Universe_Core", "38_Divine_Seal", "39_Light_Blade", "40_Chest",
"41_Nebula_Rose", "42_Wishstone", "43_Genesis_Leaf", "44_Starlight_Dandelion", "45_Star_Nectar",
"46_Aurora_Egg", "47_Rainbow_Snail", "48_Sunfire_Orb", "49_Seraph_Bell", "50_Storm_Seed",
"51_Rune_Mushroom", "52_Celestial_Antler", "53_Spider_Charm", "54_Spirit_Feather", "55_Chrono_Moth",
"56_Moondew_Pearl", "57_Fate_Dice", "58_Rift_Scythe", "59_Nova_Gauntlet", "60_Astral_Map",
"61_Moonfish_Idol", "62_Zero_Compass", "63_Star_Sail", "64_Phoenix_Harp", "65_Rebirth_Mask",
"66_Soul_Anchor", "67_Infinity_Blade", "68_Evernight_Owl", "69_Timewheel", "70_Titan_Hammer",
"71_Origin_Chalice", "72_Leviathan_Scale", "73_Skyforge_Anvil", "74_Genesis_Gate", "75_Void_Telescope",
"76_Meteor_Boots", "77_Orbit_Drum", "78_Nebula_Parasol", "79_Starcatcher_Net", "80_Lunar_Knight",
"81_Verdant_Shield", "82_Rebirth_Bow", "83_Spirit_Pagoda", "84_Chrono_Codex", "85_Emerald_Warhorn",
"86_Guardian_Scarab", "87_Abyss_Trident", "88_Dawn_Throne", "89_Colossus_Helm", "90_World_Cauldron",
"91_Dragonbone_Totem", "92_Reality_Loom"
}
-- Rarity FALLBACK (a guess based on item number). If the game stores a real rarity
-- on the item, that is used instead. Edit the tiers below if needed.
local RarityTiers = {
{ "Common", 1, 10 },
{ "Uncommon", 11, 25 },
{ "Rare", 26, 40 },
{ "Epic", 41, 55 },
{ "Legendary",56, 70 },
{ "Mythic", 71, 92 },
}
local RarityOptions = {
"Common", "Uncommon", "Rare", "Epic", "Legendary", "Mythic",
"Secret", "Godly", "Divine", "Celestial", "Eternal", "Transcendent",
"Cosmic", "Ascendant", "Primordial", "Exalted", "Infinite", "Genesis",
"Anomalous", "Paradox", "Absolute", "Ashborn", "Magmaforged", "Cataclysmic",
}
-- Helpers
local function normalize(name)
name = tostring(name):lower():gsub("^%s*%d+_", ""):gsub("[^%a]", "")
return name
end
local function cleanLootName(rawName)
local cleaned = rawName:gsub("^%s*%d+_", ""):gsub("_", " ")
return cleaned:match("^%s*(.-)%s*$")
end
local ItemsByKey = {} -- normalized -> {key, clean, num}
local CleanToKey = {}
local CleanLootOptions = {}
for _, raw in ipairs(RawLootList) do
local clean = cleanLootName(raw)
local key = normalize(raw)
ItemsByKey[key] = { key = key, clean = clean, num = tonumber(raw:match("^%s*(%d+)")) or 0 }
CleanToKey[clean] = key
table.insert(CleanLootOptions, clean)
end
SelectedItems[normalize("Button")] = true
-- Cache: instance name -> item info (or false). Avoids re-running string ops on every part each scan.
local InfoByName = {}
local function itemInfo(name)
local info = InfoByName[name]
if info == nil then
info = ItemsByKey[normalize(name)] or false
InfoByName[name] = info
end
return info or nil
end
local function tierFromNumber(n)
for _, t in ipairs(RarityTiers) do
if n >= t[2] and n <= t[3] then return t[1] end
end
return "Unknown"
end
local function readRarity(inst)
local a = inst:GetAttribute("Rarity") or inst:GetAttribute("rarity")
if a ~= nil then return tostring(a) end
local v = inst:FindFirstChild("Rarity")
if v and v:IsA("ValueBase") then return tostring(v.Value) end
return nil
end
-- Returns lowercase rarity, source ("game" or "guess")
local function getRarity(inst, info)
local cur = inst
for _ = 1, 4 do
if not cur or cur == Workspace then break end
local r = readRarity(cur)
if r then return r:lower(), "game" end
cur = cur.Parent
end
return tierFromNumber(info.num):lower(), "guess"
end
local function isPlayerStuff(inst)
for _, p in ipairs(Players:GetPlayers()) do
if p.Character and inst:IsDescendantOf(p.Character) then return true end
end
return false
end
local function getHRP()
local c = LocalPlayer.Character
return c and c:FindFirstChild("HumanoidRootPart")
end
-- Tween (with hard snap at the end so you always arrive)
local function sellingNow() return IsSelling end
local function tweenToCFrame(targetCFrame, duration, abortIf)
local hrp = getHRP()
if not hrp then return end
duration = duration or TravelSpeed
hrp.AssemblyLinearVelocity = Vector3.zero
local tween = TweenService:Create(hrp, TweenInfo.new(duration, Enum.EasingStyle.Linear), { CFrame = targetCFrame })
tween:Play()
task.wait(duration + 0.05)
tween:Cancel()
-- something else (selling) took over the character; don't snap it back to this target
if abortIf and abortIf() then return end
if hrp.Parent then
hrp.CFrame = targetCFrame
hrp.AssemblyLinearVelocity = Vector3.zero
end
end
-- Sell
local function getSellTarget()
for _, obj in ipairs(Workspace:GetDescendants()) do
if (obj:IsA("BasePart") or obj:IsA("Model")) and (obj.Name:lower():find("sell") or obj.Name:lower():find("base")) then
local part = obj:IsA("BasePart") and obj or obj:FindFirstChildWhichIsA("BasePart", true)
if part then return part end
end
end
return nil
end
local function executeSell()
if IsSelling then return end
IsSelling = true
local ok, err = pcall(function()
local hrp = getHRP()
if not hrp then return end
local originalCFrame = hrp.CFrame
local sellPart = getSellTarget()
if sellPart then
tweenToCFrame(sellPart.CFrame + Vector3.new(0, 3, 0), TravelSpeed)
task.wait(0.1)
local sellPrompt = sellPart.Parent:FindFirstChildWhichIsA("ProximityPrompt", true) or sellPart:FindFirstChildWhichIsA("ProximityPrompt", true)
if sellPrompt then fireproximityprompt(sellPrompt) end
local touch = sellPart:FindFirstChildWhichIsA("TouchTransmitter", true)
if touch then
firetouchinterest(hrp, sellPart, 0)
task.wait(0.05)
firetouchinterest(hrp, sellPart, 1)
end
end
if UnequipLootRF then UnequipLootRF:InvokeServer() end
if SellAllRF then SellAllRF:InvokeServer() end
if ResetBackpackRF then ResetBackpackRF:InvokeServer() end
task.wait(0.1)
if hrp and hrp.Parent then
tweenToCFrame(originalCFrame, TravelSpeed)
end
end)
if not ok then warn("[Sell error]", err) end
IsSelling = false
end
-- Find the nearest world item that passes the item whitelist OR the rarity whitelist
local function isWanted(inst, info)
if SelectedItems[info.key] then return true end
if next(SelectedRarities) then
local rarity = getRarity(inst, info)
if SelectedRarities[rarity] then return true end
end
return false
end
local function findNearestWanted(fromPos)
local bestPart, bestRoot, bestDist = nil, nil, math.huge
local now = tick()
for _, obj in ipairs(Workspace:GetDescendants()) do
if obj:IsA("Model") or obj:IsA("BasePart") then
local info = itemInfo(obj.Name)
if info and isWanted(obj, info) and not isPlayerStuff(obj)
and not (RecentlyTried[obj] and now - RecentlyTried[obj] < 1.5) then
local part = obj:IsA("BasePart") and obj or obj:FindFirstChildWhichIsA("BasePart", true)
local prompt = part and (obj:FindFirstChildWhichIsA("ProximityPrompt", true) or part:FindFirstChildWhichIsA("ProximityPrompt", true))
if part and prompt then
local d = (part.Position - fromPos).Magnitude
if d < bestDist then
bestPart, bestRoot, bestDist = part, obj, d
end
end
end
end
end
return bestPart, bestRoot
end
local function collectOne()
if IsSelling or PredictorBusy or not AutoCollectEnabled then return end
local ok, err = pcall(function()
local hrp = getHRP()
if not hrp then return end
local part, root = findNearestWanted(hrp.Position)
if not part then return end
RecentlyTried[root] = tick()
local startCFrame = hrp.CFrame
tweenToCFrame(part.CFrame, TravelSpeed, sellingNow)
task.wait(0.05)
if not IsSelling then
local prompt = root:FindFirstChildWhichIsA("ProximityPrompt", true) or part:FindFirstChildWhichIsA("ProximityPrompt", true)
if prompt then fireproximityprompt(prompt) end
firetouchinterest(hrp, part, 0)
firetouchinterest(hrp, part, 1)
task.wait(0.05)
end
if ReturnToStart and not IsSelling then
tweenToCFrame(startCFrame, TravelSpeed, sellingNow)
end
end)
if not ok then warn("[Collect error]", err) end
end
-- Auto sell listener
if NotificationRE then
NotificationRE.OnClientEvent:Connect(function()
if AutoSellWhenFullEnabled then executeSell() end
end)
end
-- Auto buy: buys the strongest affordable cutter in the shop
local FailedBuys = {}
local function buyBestAvailableCutter()
if not (GetShopStateRF and BuyCutterRF) then return end
local ok, err = pcall(function()
local state = GetShopStateRF:InvokeServer()
if type(state) ~= "table" or type(state.CuttersData) ~= "table" then return end
local balance = tonumber(state.Balance) or 0
local owned = state.OwnedCutters or {}
local data = state.CuttersData
-- strongest regular cutter already owned
local bestOwnedMult = 0
for name, isOwned in pairs(owned) do
local info = data[name]
if isOwned and info and info.Type == "Default" and (info.DamageMult or 0) > bestOwnedMult then
bestOwnedMult = info.DamageMult
end
end
-- buyable, affordable, and better than what we have
local candidates = {}
for name, info in pairs(data) do
if not owned[name]
and info.Type == "Default"
and not info.EventOnly and not info.GamePassOnly and not info.HiddenUntilOwned
and (info.Price or 0) > 0 and info.Price <= balance
and (info.DamageMult or 0) > bestOwnedMult
and not (FailedBuys[name] and tick() - FailedBuys[name] < 30) then
table.insert(candidates, { name = name, mult = info.DamageMult })
end
end
table.sort(candidates, function(a, b) return a.mult > b.mult end)
-- don't swap away from an "OP" cutter (those give a bonus over your best cutter)
local currentInfo = data[state.CurrentCutter]
local keepCurrent = currentInfo and currentInfo.BestOwnedDamageBonus ~= nil
for _, c in ipairs(candidates) do
BuyCutterRF:InvokeServer(c.name)
-- verify the purchase by re-reading the shop
local newState = GetShopStateRF:InvokeServer()
local bought = type(newState) == "table" and newState.OwnedCutters and newState.OwnedCutters[c.name]
if bought then
if not keepCurrent and EquipCutterRF then EquipCutterRF:InvokeServer(c.name) end
break
else
FailedBuys[c.name] = tick() -- e.g. world not unlocked yet; retry later
end
end
end)
if not ok then warn("[AutoBuy error]", err) end
end
-- ---------------------------------------------------------
-- ITEM PREDICTOR (list of spawned items, most expensive first)
-- ---------------------------------------------------------
local PicturesOn = false
local ListParagraph
local PanelGui, PanelRows, PanelFrame, PanelEmpty
local PicturesToggle
local PanelExpanded = true
local PanelCount = 0
local PanelQueue = {} -- items waiting to be collected
local CurrentTarget = nil -- item being collected right now
local closePanel, enqueueItem
local LastScan = {}
local MAX_LIST = 10
local MAX_PICS = 5
-- Most expensive item overall (highest item number)
local TopItem
for _, info in pairs(ItemsByKey) do
if not TopItem or info.num > TopItem.num then TopItem = info end
end
-- Uses a price stored on the item if the game has one, otherwise falls back to item number
local ValueNames = { "Price", "Value", "SellPrice", "SellValue", "Worth", "Cost", "Coins" }
local function readGameValue(inst)
local cur = inst
for _ = 1, 3 do
if not cur or cur == Workspace then break end
for _, n in ipairs(ValueNames) do
local a = cur:GetAttribute(n)
if type(a) == "number" then return a end
local v = cur:FindFirstChild(n)
if v and v:IsA("ValueBase") and type(v.Value) == "number" then return v.Value end
end
cur = cur.Parent
end
return nil
end
-- Spawned items sorted most expensive first, plus what they were ranked by
local function scanItems()
local found, allGame = {}, true
for _, obj in ipairs(Workspace:GetDescendants()) do
if obj:IsA("Model") or obj:IsA("BasePart") then
local info = itemInfo(obj.Name)
if info and not isPlayerStuff(obj) then
local parentInfo = obj.Parent and itemInfo(obj.Parent.Name)
if not (parentInfo and parentInfo.key == info.key) then
local part = obj:IsA("BasePart") and obj or obj:FindFirstChildWhichIsA("BasePart", true)
local prompt = part and (obj:FindFirstChildWhichIsA("ProximityPrompt", true) or part:FindFirstChildWhichIsA("ProximityPrompt", true))
if part and prompt then
local gv = readGameValue(obj)
if gv == nil then allGame = false end
table.insert(found, { root = obj, part = part, info = info, gameValue = gv })
end
end
end
end
end
for _, f in ipairs(found) do
f.value = (allGame and f.gameValue) or f.info.num
end
table.sort(found, function(a, b) return a.value > b.value end)
return found, (allGame and #found > 0) and "game price" or "item number"
end
local function listText(found)
if #found == 0 then return "No items spawned right now." end
local hrp = getHRP()
local lines = {}
for i = 1, math.min(#found, MAX_LIST) do
local f = found[i]
local dist = hrp and math.floor((f.part.Position - hrp.Position).Magnitude) or 0
table.insert(lines, i .. ". " .. f.info.clean .. " (#" .. f.info.num .. ") - " .. dist .. " studs")
end
if #found > MAX_LIST then
table.insert(lines, "+" .. (#found - MAX_LIST) .. " more")
end
return table.concat(lines, "\n")
end
-- 3D picture of an item inside a ViewportFrame
local function setThumb(vp, root)
vp:ClearAllChildren()
pcall(function()
local clone = root:Clone()
if not clone then return end
for _, d in ipairs(clone:GetDescendants()) do
if d:IsA("LuaSourceContainer") or d:IsA("ProximityPrompt") then d:Destroy() end
end
clone.Parent = vp
local cf, size
if clone:IsA("Model") then
cf, size = clone:GetBoundingBox()
else
cf, size = clone.CFrame, clone.Size
end
local cam = Instance.new("Camera")
cam.Parent = vp
vp.CurrentCamera = cam
local dist = math.max(size.Magnitude, 1) * 1.1
cam.CFrame = CFrame.lookAt(cf.Position + Vector3.new(1, 0.7, 1).Unit * dist, cf.Position)
end)
end
-- Floating item panel: flat, black, square edges
local Theme = {
Bg = Color3.new(0, 0, 0),
Line = Color3.fromRGB(45, 45, 45),
Border = Color3.fromRGB(70, 70, 70),
Thumb = Color3.fromRGB(14, 14, 14),
Text = Color3.new(1, 1, 1),
Muted = Color3.fromRGB(150, 150, 150),
Hover = Color3.fromRGB(35, 35, 35),
Red = Color3.fromRGB(200, 45, 45), -- idle
Green = Color3.fromRGB(45, 175, 75), -- collecting
Blue = Color3.fromRGB(50, 110, 220), -- waiting
}
local PANEL_W = 280
local HEADER_H = 30
local ROW_H = 56
-- Drag by the header (mouse and touch)
local function makeDraggable(handle, target)
local dragging, dragStart, startPos
handle.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragging = true
dragStart = input.Position
startPos = target.Position
input.Changed:Connect(function()
if input.UserInputState == Enum.UserInputState.End then dragging = false end
end)
end
end)
UserInputService.InputChanged:Connect(function(input)
if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
local delta = input.Position - dragStart
target.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
end
end)
end
local function panelHeight(n)
if not PanelExpanded then return HEADER_H end
if n == 0 then return HEADER_H + 30 end
return HEADER_H + n * ROW_H
end
local function applyPanelSize(n)
PanelCount = n
if PanelFrame then
PanelFrame.Size = UDim2.fromOffset(PANEL_W, panelHeight(n))
end
end
local function inQueue(root)
for _, q in ipairs(PanelQueue) do
if q.root == root then return true end
end
return false
end
local function stateColor(root)
if CurrentTarget == root then return Theme.Green end
if inQueue(root) then return Theme.Blue end
return Theme.Red
end
local function headerButton(parent, text, rightOffset)
local b = Instance.new("TextButton")
b.AnchorPoint = Vector2.new(1, 0.5)
b.Position = UDim2.new(1, -rightOffset, 0.5, 0)
b.Size = UDim2.fromOffset(24, 22)
b.BackgroundColor3 = Theme.Bg
b.BorderSizePixel = 0
b.AutoButtonColor = false
b.Font = Enum.Font.SourceSansBold
b.Text = text
b.TextSize = 18
b.TextColor3 = Theme.Muted
b.Parent = parent
b.MouseEnter:Connect(function()
b.BackgroundColor3 = Theme.Hover
b.TextColor3 = Theme.Text
end)
b.MouseLeave:Connect(function()
b.BackgroundColor3 = Theme.Bg
b.TextColor3 = Theme.Muted
end)
return b
end
local function buildPanel()
if PanelGui then return end
local gui = Instance.new("ScreenGui")
gui.Name = "ItemPredictorPanel"
gui.ResetOnSpawn = false
pcall(function()
gui.Parent = (gethui and gethui()) or game:GetService("CoreGui")
end)
if not gui.Parent then gui.Parent = LocalPlayer:WaitForChild("PlayerGui") end
local frame = Instance.new("Frame")
frame.Name = "Panel"
frame.Position = UDim2.new(1, -PANEL_W - 12, 0, 90)
frame.Size = UDim2.fromOffset(PANEL_W, panelHeight(0))
frame.BackgroundColor3 = Theme.Bg
frame.BorderSizePixel = 1
frame.BorderColor3 = Theme.Border
frame.ClipsDescendants = true
frame.Parent = gui
-- Header
local header = Instance.new("Frame")
header.Name = "Header"
header.Size = UDim2.new(1, 0, 0, HEADER_H)
header.BackgroundColor3 = Theme.Bg
header.BorderSizePixel = 0
header.Active = true
header.Parent = frame
local title = Instance.new("TextLabel")
title.Position = UDim2.fromOffset(8, 0)
title.Size = UDim2.new(1, -70, 1, 0)
title.BackgroundTransparency = 1
title.Font = Enum.Font.SourceSansBold
title.Text = "Item Predictor"
title.TextColor3 = Theme.Text
title.TextSize = 16
title.TextXAlignment = Enum.TextXAlignment.Left
title.Parent = header
local minBtn = headerButton(header, "-", 34)
local closeBtn = headerButton(header, "X", 6)
local headerLine = Instance.new("Frame")
headerLine.AnchorPoint = Vector2.new(0, 1)
headerLine.Position = UDim2.new(0, 0, 1, 0)
headerLine.Size = UDim2.new(1, 0, 0, 1)
headerLine.BackgroundColor3 = Theme.Line
headerLine.BorderSizePixel = 0
headerLine.Parent = header
makeDraggable(header, frame)
-- Body
local body = Instance.new("Frame")
body.Position = UDim2.fromOffset(0, HEADER_H)
body.Size = UDim2.new(1, 0, 1, -HEADER_H)
body.BackgroundTransparency = 1
body.Parent = frame
local list = Instance.new("UIListLayout")
list.SortOrder = Enum.SortOrder.LayoutOrder
list.Parent = body
local empty = Instance.new("TextLabel")
empty.Position = UDim2.fromOffset(0, HEADER_H)
empty.Size = UDim2.new(1, 0, 0, 30)
empty.BackgroundTransparency = 1
empty.Font = Enum.Font.SourceSans
empty.Text = "No items spawned"
empty.TextColor3 = Theme.Muted
empty.TextSize = 15
empty.Parent = frame
local rows = {}
for i = 1, MAX_PICS do
local entry = { key = nil, item = nil }
local row = Instance.new("Frame")
row.LayoutOrder = i
row.Size = UDim2.new(1, 0, 0, ROW_H)
row.BackgroundColor3 = Theme.Bg
row.BorderSizePixel = 0
row.Visible = false
row.Parent = body
local line = Instance.new("Frame")
line.AnchorPoint = Vector2.new(0, 1)
line.Position = UDim2.new(0, 0, 1, 0)
line.Size = UDim2.new(1, 0, 0, 1)
line.BackgroundColor3 = Theme.Line
line.BorderSizePixel = 0
line.Parent = row
local vp = Instance.new("ViewportFrame")
vp.Position = UDim2.fromOffset(6, 6)
vp.Size = UDim2.fromOffset(44, 44)
vp.BackgroundColor3 = Theme.Thumb
vp.BorderSizePixel = 1
vp.BorderColor3 = Theme.Line
vp.Parent = row
local name = Instance.new("TextLabel")
name.Position = UDim2.fromOffset(58, 9)
name.Size = UDim2.new(1, -148, 0, 18)
name.BackgroundTransparency = 1
name.Font = Enum.Font.SourceSansBold
name.TextColor3 = Theme.Text
name.TextSize = 16
name.TextXAlignment = Enum.TextXAlignment.Left
name.TextTruncate = Enum.TextTruncate.AtEnd
name.Parent = row
local sub = Instance.new("TextLabel")
sub.Position = UDim2.fromOffset(58, 29)
sub.Size = UDim2.new(1, -148, 0, 16)
sub.BackgroundTransparency = 1
sub.Font = Enum.Font.SourceSans
sub.TextColor3 = Theme.Muted
sub.TextSize = 14
sub.TextXAlignment = Enum.TextXAlignment.Left
sub.Parent = row
local btn = Instance.new("TextButton")
btn.AnchorPoint = Vector2.new(1, 0.5)
btn.Position = UDim2.new(1, -8, 0.5, 0)
btn.Size = UDim2.fromOffset(74, 28)
btn.BackgroundColor3 = Theme.Red
btn.BorderSizePixel = 0
btn.AutoButtonColor = false
btn.Font = Enum.Font.SourceSansBold
btn.Text = "COLLECT"
btn.TextColor3 = Theme.Text
btn.TextSize = 14
btn.Parent = row
btn.Activated:Connect(function()
if entry.item and enqueueItem then enqueueItem(entry.item) end
end)
entry.frame, entry.vp, entry.name, entry.sub, entry.btn = row, vp, name, sub, btn
rows[i] = entry
end
-- Minimize / close
minBtn.Activated:Connect(function()
PanelExpanded = not PanelExpanded
minBtn.Text = PanelExpanded and "-" or "+"
applyPanelSize(PanelCount)
end)
closeBtn.Activated:Connect(function()
if closePanel then closePanel() end
end)
PanelGui, PanelRows, PanelFrame, PanelEmpty = gui, rows, frame, empty
end
local function updatePanel(found)
if not (PicturesOn and PanelGui) then return end
local hrp = getHRP()
local count = math.min(#found, MAX_PICS)
for i, row in ipairs(PanelRows) do
local f = found[i]
if f then
local dist = hrp and math.floor((f.part.Position - hrp.Position).Magnitude) or 0
row.item = f
row.frame.Visible = true
row.name.Text = f.info.clean
row.sub.Text = "#" .. f.info.num .. " - " .. dist .. " studs"
row.btn.BackgroundColor3 = stateColor(f.root)
if row.key ~= f.info.key then
row.key = f.info.key
setThumb(row.vp, f.root)
end
else
row.item = nil
row.frame.Visible = false
row.key = nil
end
end
PanelEmpty.Visible = (count == 0)
applyPanelSize(count)
end
local function setPictures(on)
PicturesOn = on
if on then
local ok, err = pcall(buildPanel)
if not ok or not PanelGui then
PicturesOn = false
warn("[Pictures error]", err)
notify("Pictures failed", tostring(err))
return
end
PanelGui.Enabled = true
updatePanel(LastScan)
elseif PanelGui then
PanelGui.Enabled = false
end
end
closePanel = function()
setPictures(false)
if PicturesToggle then
pcall(function() PicturesToggle:Set(false) end)
end
end
local function refreshPredictor()
local found, source = scanItems()
LastScan = found
local top = found[1]
local title = top and ("Most expensive available: " .. top.info.clean) or "Most expensive available: none spawned"
local content = listText(found)
.. "\n\nMost expensive in the game: " .. TopItem.clean .. " (#" .. TopItem.num .. ")"
.. "\nRanked by " .. source
if ListParagraph then
pcall(function() ListParagraph:Set({ Title = title, Content = content }) end)
end
updatePanel(found)
end
-- Collects queued items one at a time (green = collecting, blue = waiting)
local function processQueue()
if PredictorBusy then return end
PredictorBusy = true
task.spawn(function()
local hrp0 = getHRP()
local startCFrame = hrp0 and hrp0.CFrame
while #PanelQueue > 0 do
while IsSelling do task.wait(0.2) end
local q = table.remove(PanelQueue, 1)
CurrentTarget = q.root
updatePanel(LastScan)
local ok, err = pcall(function()
local hrp = getHRP()
if not hrp then return end
if not (q.root.Parent and q.part.Parent) then return end -- already gone
tweenToCFrame(q.part.CFrame, TravelSpeed, sellingNow)
task.wait(0.05)
local prompt = q.root:FindFirstChildWhichIsA("ProximityPrompt", true) or q.part:FindFirstChildWhichIsA("ProximityPrompt", true)
if prompt then fireproximityprompt(prompt) end
firetouchinterest(hrp, q.part, 0)
firetouchinterest(hrp, q.part, 1)
task.wait(0.1)
end)
if not ok then warn("[Predictor error]", err) end
CurrentTarget = nil
refreshPredictor()
end
if startCFrame and getHRP() then
tweenToCFrame(startCFrame, TravelSpeed, sellingNow)
end
PredictorBusy = false
refreshPredictor()
end)
end
enqueueItem = function(f)
if CurrentTarget == f.root or inQueue(f.root) then return end
table.insert(PanelQueue, { root = f.root, part = f.part, info = f.info })
updatePanel(LastScan)
processQueue()
end
-- ---------------------------------------------------------
-- TAB 1: Auto Strength
-- ---------------------------------------------------------
try("Auto Strength tab", function()
local StrengthTab = Window:CreateTab("Auto Strength", 4483362458)
StrengthTab:CreateSection("Auto Farm Strength")
StrengthTab:CreateToggle({
Name = "Auto Farm Strength",
CurrentValue = false,
Flag = "AutoFarmStrengthToggle",
Callback = function(Value)
AutoFarmStrengthEnabled = Value
if Value then
task.spawn(function()
while AutoFarmStrengthEnabled do
if StrengthClickRE then StrengthClickRE:FireServer() end
if StrengthDelay > 0 then task.wait(StrengthDelay) else task.wait() end
end
end)
end
end,
})
StrengthTab:CreateSlider({
Name = "Click Delay (Seconds)",
Range = {0, 1},
Increment = 0.01,
Suffix = "s",
CurrentValue = 0,
Flag = "StrengthDelaySlider",
Callback = function(Value)
StrengthDelay = Value
end,
})
end)
-- ---------------------------------------------------------
-- TAB 2: Auto Collect
-- ---------------------------------------------------------
try("Auto Collect tab", function()
local CollectTab = Window:CreateTab("Auto Collect", 4483362458)
CollectTab:CreateSection("Whitelist")
CollectTab:CreateDropdown({
Name = "Collect These Items",
Options = CleanLootOptions,
CurrentOption = {"Button"},
MultipleOptions = true,
Flag = "LootCleanDropdown",
Callback = function(Options)
SelectedItems = {}
if type(Options) == "string" then Options = { Options } end
for _, clean in ipairs(Options) do
local key = CleanToKey[clean]
if key then SelectedItems[key] = true end
end
end,
})
CollectTab:CreateDropdown({
Name = "Collect These Rarities",
Options = RarityOptions,
CurrentOption = {},
MultipleOptions = true,
Flag = "RarityDropdown",
Callback = function(Options)
SelectedRarities = {}
if type(Options) == "string" then Options = { Options } end
for _, r in ipairs(Options) do
SelectedRarities[r:lower()] = true
end
end,
})
CollectTab:CreateSection("Movement")
CollectTab:CreateSlider({
Name = "Tween Speed (Seconds)",
Range = {0.1, 2},
Increment = 0.1,
Suffix = "s",
CurrentValue = 0.3,
Flag = "TweenSpeedSlider",
Callback = function(Value)
TravelSpeed = Value
end,
})
CollectTab:CreateToggle({
Name = "Return To Start After Each Pickup",
CurrentValue = false,
Flag = "ReturnToStartToggle",
Callback = function(Value)
ReturnToStart = Value
end,
})
CollectTab:CreateToggle({
Name = "Auto Collect",
CurrentValue = false,
Flag = "AutoCollectToggle",
Callback = function(Value)
AutoCollectEnabled = Value
if Value then
task.spawn(function()
while AutoCollectEnabled do
collectOne()
task.wait(0.2)
end
end)
end
end,
})
end)
-- ---------------------------------------------------------
-- TAB 3: Auto Sell
-- ---------------------------------------------------------
try("Auto Sell tab", function()
local AutoSellTab = Window:CreateTab("Auto Sell", 4483362458)
AutoSellTab:CreateToggle({
Name = "Auto Sell When Full",
CurrentValue = false,
Flag = "AutoSellWhenFullToggle",
Callback = function(Value)
AutoSellWhenFullEnabled = Value
end,
})
AutoSellTab:CreateToggle({
Name = "Enable Timed Auto Sell",
CurrentValue = false,
Flag = "TimedSellToggle",
Callback = function(Value)
TimedAutoSellEnabled = Value
if Value then
task.spawn(function()
while TimedAutoSellEnabled do
task.wait(SellInterval)
if TimedAutoSellEnabled then executeSell() end
end
end)
end
end,
})
AutoSellTab:CreateSlider({
Name = "Sell Interval (Seconds)",
Range = {0.1, 60},
Increment = 0.1,
Suffix = "s",
CurrentValue = 5,
Flag = "SellIntervalSlider",
Callback = function(Value)
SellInterval = Value
end,
})
end)
-- ---------------------------------------------------------
-- TAB 4: Auto Buy
-- ---------------------------------------------------------
try("Auto Buy tab", function()
local AutoBuyTab = Window:CreateTab("Auto Buy", 4483362458)
AutoBuyTab:CreateToggle({
Name = "Auto Buy Best Cutter",
CurrentValue = false,
Flag = "AutoBuyCuttersToggle",
Callback = function(Value)
AutoBuyCuttersEnabled = Value
if Value then
task.spawn(function()
while AutoBuyCuttersEnabled do
buyBestAvailableCutter()
task.wait(2)
end
end)
end
end,
})
end)
-- ---------------------------------------------------------
-- TAB 5: Item Predictor
-- ---------------------------------------------------------
try("Item Predictor tab", function()
local PredictorTab = Window:CreateTab("Item Predictor", 4483362458)
PredictorTab:CreateSection("Available To Collect")
ListParagraph = PredictorTab:CreateParagraph({
Title = "Most expensive available",
Content = "Scanning...",
})
PredictorTab:CreateButton({
Name = "Collect Most Expensive Item",
Callback = function()
local top = scanItems()[1]
if not top then
notify("Nothing to collect", "No items spawned right now.")
return
end
enqueueItem(top)
end,
})
PredictorTab:CreateButton({
Name = "Refresh",
Callback = function()
refreshPredictor()
end,
})
PicturesToggle = PredictorTab:CreateToggle({
Name = "Show Item Pictures",
CurrentValue = false,
Flag = "PredictorPicturesToggle",
Callback = function(Value)
setPictures(Value)
end,
})
task.spawn(function()
while true do
pcall(refreshPredictor)
task.wait(3)
end
end)
end)
-- ---------------------------------------------------------
-- TAB 6: Rebirth
-- ---------------------------------------------------------
try("Rebirth tab", function()
local RebirthTab = Window:CreateTab("Rebirth", 4483362458)
RebirthTab:CreateButton({
Name = "Rebirth Now",
Callback = function()
if RebirthRE then RebirthRE:FireServer() end
end,
})
RebirthTab:CreateToggle({
Name = "Auto Rebirth",
CurrentValue = false,
Flag = "AutoRebirthToggle",
Callback = function(Value)
AutoRebirthEnabled = Value
if Value then
task.spawn(function()
while AutoRebirthEnabled do
if RebirthRE then RebirthRE:FireServer() end
task.wait(2)
end
end)
end
end,
})
end)
if #Missing > 0 then
warn("[Missing remotes] " .. table.concat(Missing, ", "))
Rayfield:Notify({ Title = "Missing remotes", Content = table.concat(Missing, ", "), Duration = 10 })
else
Rayfield:Notify({ Title = "Loaded", Content = "All tabs built.", Duration = 3 })
endNo comments yet for this script.


