local WindUI = loadstring(game:HttpGet("https://github.com/Footagesus/WindUI/releases/latest/download/main.lua"))() local Window = WindUI:CreateWindow({ Title = "Inf Saplings Hub", Icon = "bird", Folder = "InfSaplings", Size = UDim2.fromOffset(500, 400), Theme = "Dark", }) local Tab = Window:Tab({ Title = "Saplings", Icon = "leaf", }) -- Настройки local config = { plantDelay = 1, plantAmount = 3, surroundBase = false, circleRadius = 45, highlightColor = Color3.fromRGB(0,255,0), autoPlant = false, } -- Highlight part local highlightPart = Instance.new("Part") highlightPart.Anchored = true highlightPart.CanCollide = false highlightPart.Transparency = 0.5 highlightPart.Size = Vector3.new(2,0.2,2) highlightPart.Color = config.highlightColor highlightPart.Parent = workspace -- Slider: Amount Tab:Slider({ Title = "Plant Amount", Desc = "How many saplings to plant", Value = {Min=1, Max=2000, Default=config.plantAmount}, Step = 1, Callback = function(value) config.plantAmount = value end }) -- Slider: Radius Tab:Slider({ Title = "Circle Radius", Desc = "Radius around campfire", Value = {Min=5, Max=100, Default=config.circleRadius}, Step = 1, Callback = function(value) config.circleRadius = value end }) -- Slider: Delay Tab:Slider({ Title = "Plant Delay", Desc = "Delay between planting", Value = {Min=0.1, Max=5, Default=config.plantDelay}, Step = 0.1, Callback = function(value) config.plantDelay = value end }) -- Toggle: Surround Base Tab:Toggle({ Title = "Surround Base", Value = config.surroundBase, Callback = function(state) config.surroundBase = state end }) -- Colorpicker: Highlight Tab:Colorpicker({ Title = "Highlight Color", Default = config.highlightColor, Callback = function(color) config.highlightColor = color highlightPart.Color = color end }) -- Toggle: Auto Plant Tab:Toggle({ Title = "Auto Plant", Value = config.autoPlant, Callback = function(state) config.autoPlant = state end }) -- Button: Plant manually Tab:Button({ Title = "Plant Now", Callback = function() plantSapling() -- функция посадки должна быть ниже end }) -- === Сюда вставляем твой inf saplings скрипт, только используем config === local Client = require(game.Players.LocalPlayer.PlayerScripts.Client) local player = game.Players.LocalPlayer local capturedArgs = nil local capturedRemote = nil local originalInvokeServer = Client.Events.RequestPlantItem.InvokeServer Client.Events.RequestPlantItem.InvokeServer = function(self,...) local args = {...} capturedArgs = args capturedRemote = self return originalInvokeServer(self,...) end -- Функции посадки local function findNearestSapling() local character = player.Character if not character or not character.PrimaryPart then return nil end local nearest, shortest = nil, math.huge for _, item in ipairs(workspace.Items:GetChildren()) do if item.Name == "Sapling" and item.PrimaryPart then local dist = (item.PrimaryPart.Position - character.PrimaryPart.Position).Magnitude if dist < shortest then shortest = dist nearest = item end end end return nearest end local function FindGrassBlock(position) local raycastParams = RaycastParams.new() raycastParams.FilterDescendantsInstances = {workspace.Map.Ground, workspace.Map:FindFirstChild("Snow")} raycastParams.FilterType = Enum.RaycastFilterType.Include raycastParams.IgnoreWater = true local result = workspace:Raycast(position, Vector3.new(0,-55,0), raycastParams) return result and result.Position end local function getCirclePositions(center,radius,count) local positions = {} local stepAngle = (2*math.pi)/count for i=0,count-1 do local angle = i*stepAngle local pos = Vector3.new(center.X+radius*math.cos(angle), center.Y+10, center.Z+radius*math.sin(angle)) local ground = FindGrassBlock(pos) if ground then table.insert(positions, ground) end end return positions end local function getCampfirePosition() if workspace.Map.Campground.MainFire.PrimaryPart then return workspace.Map.Campground.MainFire.PrimaryPart.Position end end function plantSapling() local target = findNearestSapling() if not target or not target.PrimaryPart then return end local campfire = getCampfirePosition() if not campfire then return end -- Highlight position highlightPart.Position = target.PrimaryPart.Position + Vector3.new(0,1,0) if config.surroundBase then local circle = getCirclePositions(campfire, config.circleRadius, config.plantAmount) if #circle == 0 then return end local originalParent = target.Parent target.Parent = game.ReplicatedStorage.TempStorage local result = Client.Events.RequestPlantItem:InvokeServer(target,circle[1]) if not result or not result.Success then target.Parent = originalParent return end task.spawn(function() if capturedArgs and capturedRemote then for i=2,#circle do task.wait(config.plantDelay) capturedArgs[2] = circle[i] capturedRemote:InvokeServer(unpack(capturedArgs)) end end end) else local ground = FindGrassBlock(target.PrimaryPart.Position) if not ground then return end target.Parent = game.ReplicatedStorage.TempStorage local result = Client.Events.RequestPlantItem:InvokeServer(target,ground) if not result or not result.Success then target.Parent = workspace.Items end task.spawn(function() if capturedArgs and capturedRemote then for i=1,config.plantAmount-1 do task.wait(config.plantDelay) capturedRemote:InvokeServer(unpack(capturedArgs)) end end end) end end -- Автопосадка task.spawn(function() while true do task.wait(config.plantDelay) if config.autoPlant then plantSapling() end end end)