--[[
@author depso (depthso)
@description Grow a Garden auto-farm script
https://www.roblox.com/games/126884695634066
]]
--// Services
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local InsertService = game:GetService("InsertService")
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local LocalPlayer = Players.LocalPlayer
local Leaderstats = LocalPlayer.leaderstats
local Backpack = LocalPlayer.Backpack
local PlayerGui = LocalPlayer.PlayerGui
local ShecklesCount = Leaderstats.Sheckles
local GameInfo = MarketplaceService:GetProductInfo(game.PlaceId)
--// ReGui
local ReGui = loadstring(game:HttpGet('https://raw.githubusercontent.com/depthso/
Dear-ReGui/refs/heads/main/ReGui.lua'))()
local PrefabsId = "rbxassetid://" .. ReGui.PrefabsId
--// Folders
local GameEvents = ReplicatedStorage.GameEvents
local Farms = workspace.Farm
local Accent = {
DarkGreen = Color3.fromRGB(45, 95, 25),
Green = Color3.fromRGB(69, 142, 40),
Brown = Color3.fromRGB(26, 20, 8),
}
--// ReGui configuration (Ui library)
ReGui:Init({
Prefabs = InsertService:LoadLocalAsset(PrefabsId)
})
ReGui:DefineTheme("GardenTheme", {
WindowBg = Accent.Brown,
TitleBarBg = Accent.DarkGreen,
TitleBarBgActive = Accent.Green,
ResizeGrab = Accent.DarkGreen,
FrameBg = Accent.DarkGreen,
FrameBgActive = Accent.Green,
CollapsingHeaderBg = Accent.Green,
ButtonsBg = Accent.Green,
CheckMark = Accent.Green,
SliderGrab = Accent.Green,
})
--// Dicts
local SeedStock = {}
local OwnedSeeds = {}
local HarvestIgnores = {
Normal = false,
Gold = false,
Rainbow = false
}
--// Globals
local SelectedSeed, AutoPlantRandom, AutoPlant, AutoHarvest, AutoBuy,
SellThreshold, NoClip, AutoWalkAllowRandom
local function CreateWindow()
local Window = ReGui:Window({
Title = `{GameInfo.Name} | Depso`,
Theme = "GardenTheme",
Size = UDim2.fromOffset(300, 200)
})
return Window
end
--// Interface functions
local function Plant(Position: Vector3, Seed: string)
GameEvents.Plant_RE:FireServer(Position, Seed)
wait(.3)
end
local function GetFarms()
return Farms:GetChildren()
end
local function GetFarmOwner(Farm: Folder): string
local Important = Farm.Important
local Data = Important.Data
local Owner = Data.Owner
return Owner.Value
end
local function GetFarm(PlayerName: string): Folder?
local Farms = GetFarms()
for _, Farm in next, Farms do
local Owner = GetFarmOwner(Farm)
if Owner == PlayerName then
return Farm
end
end
return
end
local IsSelling = false
local function SellInventory()
local Character = LocalPlayer.Character
local Previous = Character:GetPivot()
local PreviousSheckles = ShecklesCount.Value
--// Prevent conflict
if IsSelling then return end
IsSelling = true
Character:PivotTo(CFrame.new(62, 4, -26))
while wait() do
if ShecklesCount.Value ~= PreviousSheckles then break end
GameEvents.Sell_Inventory:FireServer()
end
Character:PivotTo(Previous)
wait(0.2)
IsSelling = false
end
local function BuySeed(Seed: string)
GameEvents.BuySeedStock:FireServer(Seed)
end
local function BuyAllSelectedSeeds()
local Seed = SelectedSeedStock.Selected
local Stock = SeedStock[Seed]
if not Stock or Stock <= 0 then return end
for i = 1, Stock do
BuySeed(Seed)
end
end
local function GetSeedInfo(Seed: Tool): number?
local PlantName = Seed:FindFirstChild("Plant_Name")
local Count = Seed:FindFirstChild("Numbers")
if not PlantName then return end
return PlantName.Value, Count.Value
end
local function CollectSeedsFromParent(Parent, Seeds: table)
for _, Tool in next, Parent:GetChildren() do
local Name, Count = GetSeedInfo(Tool)
if not Name then continue end
Seeds[Name] = {
Count = Count,
Tool = Tool
}
end
end
local function CollectCropsFromParent(Parent, Crops: table)
for _, Tool in next, Parent:GetChildren() do
local Name = Tool:FindFirstChild("Item_String")
if not Name then continue end
table.insert(Crops, Tool)
end
end
local function GetOwnedSeeds(): table
local Character = LocalPlayer.Character
CollectSeedsFromParent(Backpack, OwnedSeeds)
CollectSeedsFromParent(Character, OwnedSeeds)
return OwnedSeeds
end
local function GetInvCrops(): table
local Character = LocalPlayer.Character
local Crops = {}
CollectCropsFromParent(Backpack, Crops)
CollectCropsFromParent(Character, Crops)
return Crops
end
local function GetArea(Base: BasePart)
local Center = Base:GetPivot()
local Size = Base.Size
--// Bottom left
local X1 = math.ceil(Center.X - (Size.X/2))
local Z1 = math.ceil(Center.Z - (Size.Z/2))
--// Top right
local X2 = math.floor(Center.X + (Size.X/2))
local Z2 = math.floor(Center.Z + (Size.Z/2))
return X1, Z1, X2, Z2
end
local function EquipCheck(Tool)
local Character = LocalPlayer.Character
local Humanoid = Character.Humanoid
if Tool.Parent ~= Backpack then return end
Humanoid:EquipTool(Tool)
end
--// Auto farm functions
local MyFarm = GetFarm(LocalPlayer.Name)
local MyImportant = MyFarm.Important
local PlantLocations = MyImportant.Plant_Locations
local PlantsPhysical = MyImportant.Plants_Physical
local Dirt = PlantLocations:FindFirstChildOfClass("Part")
local X1, Z1, X2, Z2 = GetArea(Dirt)
local function GetRandomFarmPoint(): Vector3
local FarmLands = PlantLocations:GetChildren()
local FarmLand = FarmLands[math.random(1, #FarmLands)]
local X1, Z1, X2, Z2 = GetArea(FarmLand)
local X = math.random(X1, X2)
local Z = math.random(Z1, Z2)
return Vector3.new(X, 4, Z)
end
local function AutoPlantLoop()
local Seed = SelectedSeed.Selected
local SeedData = OwnedSeeds[Seed]
if not SeedData then return end
local Count = SeedData.Count
local Tool = SeedData.Tool
--// Check for stock
if Count <= 0 then return end
local Planted = 0
local Step = 1
--// Check if the client needs to equip the tool
EquipCheck(Tool)
--// Plant at random points
if AutoPlantRandom.Value then
for i = 1, Count do
local Point = GetRandomFarmPoint()
Plant(Point, Seed)
end
end
--// Plant on the farmland area
for X = X1, X2, Step do
for Z = Z1, Z2, Step do
if Planted > Count then break end
local Point = Vector3.new(X, 0.13, Z)
Planted += 1
Plant(Point, Seed)
end
end
end
local function HarvestPlant(Plant: Model)
local Prompt = Plant:FindFirstChild("ProximityPrompt", true)
--// Check if it can be harvested
if not Prompt then return end
fireproximityprompt(Prompt)
end
local function GetSeedStock(IgnoreNoStock: boolean?): table
local SeedShop = PlayerGui.Seed_Shop
local Items = SeedShop:FindFirstChild("Blueberry", true).Parent
local NewList = {}
for _, Item in next, Items:GetChildren() do
local MainFrame = Item:FindFirstChild("Main_Frame")
if not MainFrame then continue end
local StockText = MainFrame.Stock_Text.Text
local StockCount = tonumber(StockText:match("%d+"))
--// Seperate list
if IgnoreNoStock then
if StockCount <= 0 then continue end
NewList[Item.Name] = StockCount
continue
end
SeedStock[Item.Name] = StockCount
end
return IgnoreNoStock and NewList or SeedStock
end
local function CanHarvest(Plant): boolean?
local Prompt = Plant:FindFirstChild("ProximityPrompt", true)
if not Prompt then return end
if not Prompt.Enabled then return end
return true
end
local function CollectHarvestable(Parent, Plants, IgnoreDistance: boolean?)
local Character = LocalPlayer.Character
local PlayerPosition = Character:GetPivot().Position
for _, Plant in next, Parent:GetChildren() do
--// Fruits
local Fruits = Plant:FindFirstChild("Fruits")
if Fruits then
CollectHarvestable(Fruits, Plants, IgnoreDistance)
end
--// Distance check
local PlantPosition = Plant:GetPivot().Position
local Distance = (PlayerPosition-PlantPosition).Magnitude
if not IgnoreDistance and Distance > 15 then continue end
--// Ignore check
local Variant = Plant:FindFirstChild("Variant")
if HarvestIgnores[Variant.Value] then continue end
--// Collect
if CanHarvest(Plant) then
table.insert(Plants, Plant)
end
end
return Plants
end
local function GetHarvestablePlants(IgnoreDistance: boolean?)
local Plants = {}
CollectHarvestable(PlantsPhysical, Plants, IgnoreDistance)
return Plants
end
local function HarvestPlants(Parent: Model)
local Plants = GetHarvestablePlants()
for _, Plant in next, Plants do
HarvestPlant(Plant)
end
end
local function AutoSellCheck()
local CropCount = #GetInvCrops()
if not AutoSell.Value then return end
if CropCount < SellThreshold.Value then return end
SellInventory()
end
local function AutoWalkLoop()
if IsSelling then return end
local Character = LocalPlayer.Character
local Humanoid = Character.Humanoid
local Plants = GetHarvestablePlants(true)
local RandomAllowed = AutoWalkAllowRandom.Value
local DoRandom = #Plants == 0 or math.random(1, 3) == 2
--// Random point
if RandomAllowed and DoRandom then
local Position = GetRandomFarmPoint()
Humanoid:MoveTo(Position)
AutoWalkStatus.Text = "Random point"
return
end
--// Move to each plant
for _, Plant in next, Plants do
local Position = Plant:GetPivot().Position
Humanoid:MoveTo(Position)
AutoWalkStatus.Text = Plant.Name
end
end
local function NoclipLoop()
local Character = LocalPlayer.Character
if not NoClip.Value then return end
if not Character then return end
for _, Part in Character:GetDescendants() do
if Part:IsA("BasePart") then
Part.CanCollide = false
end
end
end
local function MakeLoop(Toggle, Func)
coroutine.wrap(function()
while wait(.01) do
if not Toggle.Value then continue end
Func()
end
end)()
end
local function StartServices()
--// Auto-Walk
MakeLoop(AutoWalk, function()
local MaxWait = AutoWalkMaxWait.Value
AutoWalkLoop()
wait(math.random(1, MaxWait))
end)
--// Auto-Harvest
MakeLoop(AutoHarvest, function()
HarvestPlants(PlantsPhysical)
end)
--// Auto-Buy
MakeLoop(AutoBuy, BuyAllSelectedSeeds)
--// Auto-Plant
MakeLoop(AutoPlant, AutoPlantLoop)
--// Get stocks
while wait(.1) do
GetSeedStock()
GetOwnedSeeds()
end
end
local function CreateCheckboxes(Parent, Dict: table)
for Key, Value in next, Dict do
Parent:Checkbox({
Value = Value,
Label = Key,
Callback = function(_, Value)
Dict[Key] = Value
end
})
end
end
--// Window
local Window = CreateWindow()
--// Auto-Plant
local PlantNode = Window:TreeNode({Title="Auto-Plant 🥕"})
SelectedSeed = PlantNode:Combo({
Label = "Seed",
Selected = "",
GetItems = GetSeedStock,
})
AutoPlant = PlantNode:Checkbox({
Value = false,
Label = "Enabled"
})
AutoPlantRandom = PlantNode:Checkbox({
Value = false,
Label = "Plant at random points"
})
PlantNode:Button({
Text = "Plant all",
Callback = AutoPlantLoop,
})
--// Auto-Harvest
local HarvestNode = Window:TreeNode({Title="Auto-Harvest 🚜"})
AutoHarvest = HarvestNode:Checkbox({
Value = false,
Label = "Enabled"
})
HarvestNode:Separator({Text="Ignores:"})
CreateCheckboxes(HarvestNode, HarvestIgnores)
--// Auto-Buy
local BuyNode = Window:TreeNode({Title="Auto-Buy 🥕"})
local OnlyShowStock
SelectedSeedStock = BuyNode:Combo({
Label = "Seed",
Selected = "",
GetItems = function()
local OnlyStock = OnlyShowStock and OnlyShowStock.Value
return GetSeedStock(OnlyStock)
end,
})
AutoBuy = BuyNode:Checkbox({
Value = false,
Label = "Enabled"
})
OnlyShowStock = BuyNode:Checkbox({
Value = false,
Label = "Only list stock"
})
BuyNode:Button({
Text = "Buy all",
Callback = BuyAllSelectedSeeds,
})
--// Auto-Sell
local SellNode = Window:TreeNode({Title="Auto-Sell 💰"})
SellNode:Button({
Text = "Sell inventory",
Callback = SellInventory,
})
AutoSell = SellNode:Checkbox({
Value = false,
Label = "Enabled"
})
SellThreshold = SellNode:SliderInt({
Label = "Crops threshold",
Value = 15,
Minimum = 1,
Maximum = 199,
})
--// Auto-Walk
local WallNode = Window:TreeNode({Title="Auto-Walk 🚶"})
AutoWalkStatus = WallNode:Label({
Text = "None"
})
AutoWalk = WallNode:Checkbox({
Value = false,
Label = "Enabled"
})
AutoWalkAllowRandom = WallNode:Checkbox({
Value = true,
Label = "Allow random points"
})
NoClip = WallNode:Checkbox({
Value = false,
Label = "NoClip"
})
AutoWalkMaxWait = WallNode:SliderInt({
Label = "Max delay",
Value = 10,
Minimum = 1,
Maximum = 120,
})
--// Connections
RunService.Stepped:Connect(NoclipLoop)
Backpack.ChildAdded:Connect(AutoSellCheck)
--// Services
StartServices()