--// SERVICES
local Players = game:GetService("Players")
local TweenService = game:GetService("TweenService")
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")

--// PLAYER
local LocalPlayer = Players.LocalPlayer
local PlayerGui = LocalPlayer:WaitForChild("PlayerGui")

--// GUI
local ScreenGui = Instance.new("ScreenGui")
ScreenGui.Name = "BalkanHub"
ScreenGui.ResetOnSpawn = false
ScreenGui.Parent = PlayerGui

--// MAIN
local Main = Instance.new("Frame")
Main.Size = UDim2.new(0,0,0,0)
Main.Position = UDim2.new(0.5,0,0.5,0)
Main.AnchorPoint = Vector2.new(0.5,0.5)
Main.BackgroundColor3 = Color3.fromRGB(25,25,25)
Main.BorderSizePixel = 0
Main.Parent = ScreenGui
Main.Active = true
Main.Draggable = true
Main.ClipsDescendants = true

Instance.new("UICorner", Main).CornerRadius = UDim.new(0,12)

TweenService:Create(
	Main,
	TweenInfo.new(0.35, Enum.EasingStyle.Quint),
	{
		Size = UDim2.new(0,700,0,450)
	}
):Play()

--// TITLE
local Title = Instance.new("TextLabel")
Title.Size = UDim2.new(1,0,0,50)
Title.BackgroundColor3 = Color3.fromRGB(15,15,15)
Title.Text = "Balkan Hub"
Title.TextColor3 = Color3.fromRGB(0,170,255)
Title.Font = Enum.Font.GothamBold
Title.TextSize = 28
Title.Parent = Main

Instance.new("UICorner", Title).CornerRadius = UDim.new(0,12)

--// TAB HOLDER
local Tabs = Instance.new("Frame")
Tabs.Size = UDim2.new(0,180,1,-50)
Tabs.Position = UDim2.new(0,0,0,50)
Tabs.BackgroundColor3 = Color3.fromRGB(30,30,30)
Tabs.BorderSizePixel = 0
Tabs.Parent = Main

--// PAGE HOLDER
local Pages = Instance.new("Frame")
Pages.Size = UDim2.new(1,-180,1,-50)
Pages.Position = UDim2.new(0,180,0,50)
Pages.BackgroundColor3 = Color3.fromRGB(40,40,40)
Pages.BorderSizePixel = 0
Pages.Parent = Main

--// TAB LAYOUT
local UIList = Instance.new("UIListLayout")
UIList.Padding = UDim.new(0,6)
UIList.Parent = Tabs

--// PAGES
local PlayerPage = Instance.new("Frame")
PlayerPage.Size = UDim2.new(1,0,1,0)
PlayerPage.BackgroundTransparency = 1
PlayerPage.Parent = Pages

local TeleportPage = Instance.new("Frame")
TeleportPage.Size = UDim2.new(1,0,1,0)
TeleportPage.BackgroundTransparency = 1
TeleportPage.Visible = false
TeleportPage.Parent = Pages

local VisualPage = Instance.new("Frame")
VisualPage.Size = UDim2.new(1,0,1,0)
VisualPage.BackgroundTransparency = 1
VisualPage.Visible = false
VisualPage.Parent = Pages

local AutoJobsPage = Instance.new("Frame")
AutoJobsPage.Size = UDim2.new(1,0,1,0)
AutoJobsPage.BackgroundTransparency = 1
AutoJobsPage.Visible = false
AutoJobsPage.Parent = Pages

--// TAB SYSTEM
local TabsTable = {}

local function switchTab(page, selectedButton)
	PlayerPage.Visible = false
	TeleportPage.Visible = false
	VisualPage.Visible = false
	AutoJobsPage.Visible = false

	page.Visible = true

	for _,btn in pairs(TabsTable) do
		btn.BackgroundColor3 = Color3.fromRGB(45,45,45)
	end

	selectedButton.BackgroundColor3 = Color3.fromRGB(0,170,255)
end

local function createTab(name, page)
	local Button = Instance.new("TextButton")
	Button.Size = UDim2.new(1,-10,0,45)
	Button.BackgroundColor3 = Color3.fromRGB(45,45,45)
	Button.TextColor3 = Color3.new(1,1,1)
	Button.Font = Enum.Font.GothamBold
	Button.TextSize = 18
	Button.Text = name
	Button.Parent = Tabs

	Instance.new("UICorner", Button).CornerRadius = UDim.new(0,8)

	table.insert(TabsTable, Button)

	Button.MouseButton1Click:Connect(function()
		switchTab(page, Button)
	end)

	return Button
end

local PlayerTab = createTab("Player", PlayerPage)
local TeleportTab = createTab("Teleport", TeleportPage)
local VisualTab = createTab("Visual", VisualPage)
local AutoJobsTab = createTab("Auto Jobs", AutoJobsPage)
local FarmTab = createTab("Farm", FarmPage)


PlayerTab.BackgroundColor3 = Color3.fromRGB(0,170,255)

--// BUTTON CREATOR
local function createButton(parent, text, posY)
	local Button = Instance.new("TextButton")
	Button.Size = UDim2.new(0,220,0,45)
	Button.Position = UDim2.new(0,20,0,posY)
	Button.BackgroundColor3 = Color3.fromRGB(55,55,55)
	Button.TextColor3 = Color3.new(1,1,1)
	Button.Font = Enum.Font.GothamBold
	Button.TextSize = 16
	Button.Text = text
	Button.Parent = parent

	Instance.new("UICorner", Button).CornerRadius = UDim.new(0,8)

	return Button
end

--// PLAYER SETTINGS
local speed = 16
local infJump = false
local noclip = false
local esp = false
local fastPrompts = false

local function getHumanoid()
	local char = LocalPlayer.Character
	if char then
		return char:FindFirstChildOfClass("Humanoid")
	end
end

local function getHRP()
	local char = LocalPlayer.Character
	if char then
		return char:FindFirstChild("HumanoidRootPart")
	end
end

--// SPEED
local SpeedBtn = createButton(PlayerPage, "Speed: 16", 20)

local function applySpeed()
	local hum = getHumanoid()
	if hum then
		hum.WalkSpeed = speed
	end
end

SpeedBtn.MouseButton1Click:Connect(function()
	speed += 8

	if speed > 64 then
		speed = 16
	end

	applySpeed()

	SpeedBtn.Text = "Speed: "..speed
end)

LocalPlayer.CharacterAdded:Connect(function()
	task.wait(1)
	applySpeed()
end)

--// INF JUMP
local JumpBtn = createButton(PlayerPage, "Infinite Jump: false", 80)

JumpBtn.MouseButton1Click:Connect(function()
	infJump = not infJump
	JumpBtn.Text = "Infinite Jump: "..tostring(infJump)
end)

UserInputService.JumpRequest:Connect(function()
	if infJump then
		local hum = getHumanoid()
		if hum then
			hum:ChangeState(Enum.HumanoidStateType.Jumping)
		end
	end
end)

--// NOCLIP
local NoclipBtn = createButton(PlayerPage, "Noclip: false", 140)

NoclipBtn.MouseButton1Click:Connect(function()
	noclip = not noclip
	NoclipBtn.Text = "Noclip: "..tostring(noclip)
end)

RunService.Stepped:Connect(function()
	if noclip then
		local char = LocalPlayer.Character

		if char then
			for _,v in pairs(char:GetDescendants()) do
				if v:IsA("BasePart") then
					v.CanCollide = false
				end
			end
		end
	end
end)

--// FAST PROMPTS
local PromptBtn = createButton(PlayerPage, "Fast Prompts: false", 200)

local function updatePrompts()
	for _,v in pairs(workspace:GetDescendants()) do
		if v:IsA("ProximityPrompt") then
			if fastPrompts then
				v.HoldDuration = 0.01
				v.RequiresLineOfSight = false
				v.MaxActivationDistance = 20
			else
				v.HoldDuration = 1
				v.RequiresLineOfSight = true
				v.MaxActivationDistance = 10
			end
		end
	end
end

workspace.DescendantAdded:Connect(function(v)
	if v:IsA("ProximityPrompt") and fastPrompts then
		v.HoldDuration = 0.01
		v.RequiresLineOfSight = false
		v.MaxActivationDistance = 20
	end
end)

PromptBtn.MouseButton1Click:Connect(function()
	fastPrompts = not fastPrompts
	PromptBtn.Text = "Fast Prompts: "..tostring(fastPrompts)

	updatePrompts()
end)

--// TELEPORT PAGE
local TP1 = createButton(TeleportPage, "Teleport To Spawn", 20)

TP1.MouseButton1Click:Connect(function()
	local hrp = getHRP()

	if hrp and workspace:FindFirstChild("SpawnLocation") then
		hrp.CFrame = workspace.SpawnLocation.CFrame + Vector3.new(0,5,0)
	end
end)

--// COORDS
local CoordBox = Instance.new("TextBox")
CoordBox.Size = UDim2.new(0,300,0,45)
CoordBox.Position = UDim2.new(0,20,0,90)
CoordBox.BackgroundColor3 = Color3.fromRGB(55,55,55)
CoordBox.TextColor3 = Color3.new(1,1,1)
CoordBox.PlaceholderText = "Coordinates"
CoordBox.Text = ""
CoordBox.Parent = TeleportPage

Instance.new("UICorner", CoordBox).CornerRadius = UDim.new(0,8)

local Refresh = createButton(TeleportPage, "Refresh Coordinates", 150)

Refresh.MouseButton1Click:Connect(function()
	local hrp = getHRP()

	if hrp then
		CoordBox.Text = tostring(hrp.Position)
	end
end)

--// ESP
local function addESP(plr)
	if plr == LocalPlayer then return end

	local function setup(char)
		if char:FindFirstChild("BH_ESP") then return end

		local h = Instance.new("Highlight")
		h.Name = "BH_ESP"
		h.FillColor = Color3.fromRGB(0,170,255)
		h.OutlineColor = Color3.new(1,1,1)
		h.Parent = char
	end

	plr.CharacterAdded:Connect(setup)

	if plr.Character then
		setup(plr.Character)
	end
end

local function removeESP()
	for _,plr in pairs(Players:GetPlayers()) do
		if plr.Character then
			local espObj = plr.Character:FindFirstChild("BH_ESP")

			if espObj then
				espObj:Destroy()
			end
		end
	end
end

local ESPBtn = createButton(VisualPage, "ESP: false", 20)

ESPBtn.MouseButton1Click:Connect(function()
	esp = not esp

	ESPBtn.Text = "ESP: "..tostring(esp)

	if esp then
		for _,plr in pairs(Players:GetPlayers()) do
			addESP(plr)
		end
	else
		removeESP()
	end
end)



--// SERVICES
local Players = game:GetService("Players")
local TweenService = game:GetService("TweenService")
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Workspace = game:GetService("Workspace")
local ReplicatedStorage = game:GetService("ReplicatedStorage")

--// PLAYER
local LocalPlayer = Players.LocalPlayer
local PlayerGui = LocalPlayer:WaitForChild("PlayerGui")

--// GUI
local ScreenGui = Instance.new("ScreenGui")
ScreenGui.Name = "BalkanHub"
ScreenGui.ResetOnSpawn = false
ScreenGui.Parent = PlayerGui

--// MAIN
local Main = Instance.new("Frame")
Main.Size = UDim2.new(0,0,0,0)
Main.Position = UDim2.new(0.5,0,0.5,0)
Main.AnchorPoint = Vector2.new(0.5,0.5)
Main.BackgroundColor3 = Color3.fromRGB(25,25,25)
Main.BorderSizePixel = 0
Main.Parent = ScreenGui
Main.Active = true
Main.Draggable = true
Main.ClipsDescendants = true

Instance.new("UICorner", Main).CornerRadius = UDim.new(0,12)

TweenService:Create(
	Main,
	TweenInfo.new(0.35, Enum.EasingStyle.Quint),
	{Size = UDim2.new(0,700,0,450)}
):Play()

--// TITLE
local Title = Instance.new("TextLabel")
Title.Size = UDim2.new(1,0,0,50)
Title.BackgroundColor3 = Color3.fromRGB(15,15,15)
Title.Text = "Balkan Hub"
Title.TextColor3 = Color3.fromRGB(0,170,255)
Title.Font = Enum.Font.GothamBold
Title.TextSize = 28
Title.Parent = Main
Instance.new("UICorner", Title).CornerRadius = UDim.new(0,12)

--// TAB HOLDER
local Tabs = Instance.new("Frame")
Tabs.Size = UDim2.new(0,180,1,-50)
Tabs.Position = UDim2.new(0,0,0,50)
Tabs.BackgroundColor3 = Color3.fromRGB(30,30,30)
Tabs.BorderSizePixel = 0
Tabs.Parent = Main

--// PAGE HOLDER
local Pages = Instance.new("Frame")
Pages.Size = UDim2.new(1,-180,1,-50)
Pages.Position = UDim2.new(0,180,0,50)
Pages.BackgroundColor3 = Color3.fromRGB(40,40,40)
Pages.BorderSizePixel = 0
Pages.Parent = Main

--// TAB LAYOUT
local UIList = Instance.new("UIListLayout")
UIList.Padding = UDim.new(0,6)
UIList.Parent = Tabs

--// PAGES
local PlayerPage = Instance.new("Frame")
PlayerPage.Size = UDim2.new(1,0,1,0)
PlayerPage.BackgroundTransparency = 1
PlayerPage.Parent = Pages

local TeleportPage = Instance.new("Frame")
TeleportPage.Size = UDim2.new(1,0,1,0)
TeleportPage.BackgroundTransparency = 1
TeleportPage.Visible = false
TeleportPage.Parent = Pages

local VisualPage = Instance.new("Frame")
VisualPage.Size = UDim2.new(1,0,1,0)
VisualPage.BackgroundTransparency = 1
VisualPage.Visible = false
VisualPage.Parent = Pages

local FarmPage = Instance.new("Frame")
FarmPage.Size = UDim2.new(1,0,1,0)
FarmPage.BackgroundTransparency = 1
FarmPage.Visible = false
FarmPage.Parent = Pages

--// TAB SYSTEM
local TabsTable = {}

local function switchTab(page, selectedButton)
	PlayerPage.Visible = false
	TeleportPage.Visible = false
	VisualPage.Visible = false
	FarmPage.Visible = false
	page.Visible = true
	for _,btn in pairs(TabsTable) do
		btn.BackgroundColor3 = Color3.fromRGB(45,45,45)
	end
	selectedButton.BackgroundColor3 = Color3.fromRGB(0,170,255)
end

local function createTab(name, page)
	local Button = Instance.new("TextButton")
	Button.Size = UDim2.new(1,-10,0,45)
	Button.BackgroundColor3 = Color3.fromRGB(45,45,45)
	Button.TextColor3 = Color3.new(1,1,1)
	Button.Font = Enum.Font.GothamBold
	Button.TextSize = 18
	Button.Text = name
	Button.Parent = Tabs
	Instance.new("UICorner", Button).CornerRadius = UDim.new(0,8)
	table.insert(TabsTable, Button)
	Button.MouseButton1Click:Connect(function()
		switchTab(page, Button)
	end)
	return Button
end

local PlayerTab = createTab("Player", PlayerPage)
local TeleportTab = createTab("Teleport", TeleportPage)
local VisualTab = createTab("Visual", VisualPage)
local FarmTab = createTab("Farm", FarmPage)
PlayerTab.BackgroundColor3 = Color3.fromRGB(0,170,255)

--// BUTTON HELPER
local function createButton(parent, text, posY)
	local Button = Instance.new("TextButton")
	Button.Size = UDim2.new(0,220,0,45)
	Button.Position = UDim2.new(0,20,0,posY)
	Button.BackgroundColor3 = Color3.fromRGB(55,55,55)
	Button.TextColor3 = Color3.new(1,1,1)
	Button.Font = Enum.Font.GothamBold
	Button.TextSize = 16
	Button.Text = text
	Button.Parent = parent
	Instance.new("UICorner", Button).CornerRadius = UDim.new(0,8)
	return Button
end

local function createLabel(parent, text, posY)
	local Label = Instance.new("TextLabel")
	Label.Size = UDim2.new(1,-20,0,25)
	Label.Position = UDim2.new(0,10,0,posY)
	Label.BackgroundTransparency = 1
	Label.TextColor3 = Color3.fromRGB(200,200,200)
	Label.Font = Enum.Font.Gotham
	Label.TextSize = 14
	Label.Text = text
	Label.TextXAlignment = Enum.TextXAlignment.Left
	Label.Parent = parent
	return Label
end

--// ===== PLAYER PAGE =====
local speed = 16
local infJump = false
local noclip = false
local fastPrompts = false

local function getHumanoid()
	local char = LocalPlayer.Character
	return char and char:FindFirstChildOfClass("Humanoid")
end

local function getHRP()
	local char = LocalPlayer.Character
	return char and char:FindFirstChild("HumanoidRootPart")
end

-- Speed
local SpeedBtn = createButton(PlayerPage, "Speed: 16", 20)
local function applySpeed()
	local hum = getHumanoid()
	if hum then hum.WalkSpeed = speed end
end
SpeedBtn.MouseButton1Click:Connect(function()
	speed = speed + 8
	if speed > 64 then speed = 16 end
	applySpeed()
	SpeedBtn.Text = "Speed: "..speed
end)
LocalPlayer.CharacterAdded:Connect(function()
	task.wait(1)
	applySpeed()
end)

-- Inf Jump
local JumpBtn = createButton(PlayerPage, "Infinite Jump: false", 80)
JumpBtn.MouseButton1Click:Connect(function()
	infJump = not infJump
	JumpBtn.Text = "Infinite Jump: "..tostring(infJump)
end)
UserInputService.JumpRequest:Connect(function()
	if infJump then
		local hum = getHumanoid()
		if hum then hum:ChangeState(Enum.HumanoidStateType.Jumping) end
	end
end)

-- Noclip
local NoclipBtn = createButton(PlayerPage, "Noclip: false", 140)
NoclipBtn.MouseButton1Click:Connect(function()
	noclip = not noclip
	NoclipBtn.Text = "Noclip: "..tostring(noclip)
end)
RunService.Stepped:Connect(function()
	if noclip and LocalPlayer.Character then
		for _,v in pairs(LocalPlayer.Character:GetDescendants()) do
			if v:IsA("BasePart") then v.CanCollide = false end
		end
	end
end)

-- Fast Prompts
local PromptBtn = createButton(PlayerPage, "Fast Prompts: false", 200)
local function updatePrompts()
	for _,v in pairs(workspace:GetDescendants()) do
		if v:IsA("ProximityPrompt") then
			if fastPrompts then
				v.HoldDuration = 0.01
				v.RequiresLineOfSight = false
				v.MaxActivationDistance = 20
			else
				v.HoldDuration = 1
				v.RequiresLineOfSight = true
				v.MaxActivationDistance = 10
			end
		end
	end
end
workspace.DescendantAdded:Connect(function(v)
	if v:IsA("ProximityPrompt") and fastPrompts then
		v.HoldDuration = 0.01
		v.RequiresLineOfSight = false
		v.MaxActivationDistance = 20
	end
end)
PromptBtn.MouseButton1Click:Connect(function()
	fastPrompts = not fastPrompts
	PromptBtn.Text = "Fast Prompts: "..tostring(fastPrompts)
	updatePrompts()
end)

--// ===== TELEPORT PAGE =====
local TP1 = createButton(TeleportPage, "Teleport To Spawn", 20)
TP1.MouseButton1Click:Connect(function()
	local hrp = getHRP()
	if hrp and workspace:FindFirstChild("SpawnLocation") then
		hrp.CFrame = workspace.SpawnLocation.CFrame + Vector3.new(0,5,0)
	end
end)

local CoordBox = Instance.new("TextBox")
CoordBox.Size = UDim2.new(0,300,0,45)
CoordBox.Position = UDim2.new(0,20,0,90)
CoordBox.BackgroundColor3 = Color3.fromRGB(55,55,55)
CoordBox.TextColor3 = Color3.new(1,1,1)
CoordBox.PlaceholderText = "Coordinates"
CoordBox.Text = ""
CoordBox.Parent = TeleportPage
Instance.new("UICorner", CoordBox).CornerRadius = UDim.new(0,8)

local Refresh = createButton(TeleportPage, "Refresh Coordinates", 150)
Refresh.MouseButton1Click:Connect(function()
	local hrp = getHRP()
	if hrp then CoordBox.Text = tostring(hrp.Position) end
end)

--// ===== VISUAL PAGE =====
local esp = false
local function addESP(plr)
	if plr == LocalPlayer then return end
	local function setup(char)
		if char:FindFirstChild("BH_ESP") then return end
		local h = Instance.new("Highlight")
		h.Name = "BH_ESP"
		h.FillColor = Color3.fromRGB(0,170,255)
		h.OutlineColor = Color3.new(1,1,1)
		h.Parent = char
	end
	plr.CharacterAdded:Connect(setup)
	if plr.Character then setup(plr.Character) end
end
local function removeESP()
	for _,plr in pairs(Players:GetPlayers()) do
		if plr.Character then
			local espObj = plr.Character:FindFirstChild("BH_ESP")
			if espObj then espObj:Destroy() end
		end
	end
end
local ESPBtn = createButton(VisualPage, "ESP: false", 20)
ESPBtn.MouseButton1Click:Connect(function()
	esp = not esp
	ESPBtn.Text = "ESP: "..tostring(esp)
	if esp then
		for _,plr in pairs(Players:GetPlayers()) do addESP(plr) end
	else
		removeESP()
	end
end)

--// ===== FARM PAGE =====
-- Helper functions
local function findItem(itemName)
	local bp = LocalPlayer.Backpack
	local char = LocalPlayer.Character
	local found = bp:FindFirstChild(itemName)
	if found then return found end
	if char then
		found = char:FindFirstChild(itemName)
		if found then return found end
		for _, child in pairs(char:GetChildren()) do
			if child:IsA("Tool") then
				local sub = child:FindFirstChild(itemName)
				if sub then return sub end
			end
		end
	end
	return nil
end

local function teleportTo(pos)
	local hrp = getHRP()
	if hrp and hrp.Parent then
		hrp.CFrame = CFrame.new(pos)
		task.wait(0.3)
	end
end

local function getCookingPot()
	local pots = Workspace:FindFirstChild("CookingPots")
	if not pots then
		for _, obj in pairs(Workspace:GetChildren()) do
			if obj.Name:lower():find("pot") then pots = obj break end
		end
	end
	if pots then
		for _, pot in pairs(pots:GetChildren()) do
			if pot:IsA("Model") then
				local owner = pot:FindFirstChild("Owner")
				local cookPart = pot:FindFirstChild("CookPart")
				if owner and cookPart and not owner.Value then
					return pot
				end
			end
		end
	end
	return nil
end

local function firePrompt(prompt)
	if prompt then
		local s, e = pcall(function() fireproximityprompt(prompt) end)
		if not s then
			pcall(function()
				prompt:InputHoldBegin()
				task.wait(0.1)
				prompt:InputHoldEnd()
			end)
		end
	end
end

-- Farm UI
local FarmStatus = createLabel(FarmPage, "Status: Idle", 15)
local FarmCycles = createLabel(FarmPage, "Cycles: 0", 40)

local FarmBtn = createButton(FarmPage, "Start Farming", 80)

local CooldownLabel = createLabel(FarmPage, "Cooldown: 3s", 140)

local CooldownUp = Instance.new("TextButton")
CooldownUp.Size = UDim2.new(0,30,0,30)
CooldownUp.Position = UDim2.new(0,200,0,138)
CooldownUp.BackgroundColor3 = Color3.fromRGB(0,170,255)
CooldownUp.TextColor3 = Color3.new(1,1,1)
CooldownUp.Font = Enum.Font.GothamBold
CooldownUp.TextSize = 18
CooldownUp.Text = "+"
CooldownUp.Parent = FarmPage
Instance.new("UICorner", CooldownUp).CornerRadius = UDim.new(0,6)

local CooldownDown = Instance.new("TextButton")
CooldownDown.Size = UDim2.new(0,30,0,30)
CooldownDown.Position = UDim2.new(0,160,0,138)
CooldownDown.BackgroundColor3 = Color3.fromRGB(170,0,0)
CooldownDown.TextColor3 = Color3.new(1,1,1)
CooldownDown.Font = Enum.Font.GothamBold
CooldownDown.TextSize = 18
CooldownDown.Text = "-"
CooldownDown.Parent = FarmPage
Instance.new("UICorner", CooldownDown).CornerRadius = UDim.new(0,6)

-- Farm logic
local farming = false
local farmConnection = nil
local cycles = 0
local cooldown = 3

local function stopFarming()
	farming = false
	if farmConnection then
		farmConnection:Disconnect()
		farmConnection = nil
	end
	FarmStatus.Text = "Status: Stopped"
	FarmBtn.Text = "Start Farming"
	FarmBtn.BackgroundColor3 = Color3.fromRGB(55,55,55)
end

local function doCycle()
	if not farming then return end
	
	local char = LocalPlayer.Character
	if not char then
		FarmStatus.Text = "Status: Waiting for character..."
		task.wait(2)
		return
	end
	
	local hrp = getHRP()
	if not hrp then
		FarmStatus.Text = "Status: No HRP found"
		task.wait(1)
		return
	end

	FarmStatus.Text = "Status: Finding cooking pot..."
	local pot = getCookingPot()
	if not pot then
		FarmStatus.Text = "Status: No available pot! Waiting..."
		task.wait(10)
		return
	end
	
	local cookPart = pot:FindFirstChild("CookPart")
	local cookPrompt = cookPart and cookPart:FindFirstChild("ProximityPrompt")
	
	local sellPart = Workspace:FindFirstChild("IceFruit Sell")
	if not sellPart then
		for _, obj in pairs(Workspace:GetDescendants()) do
			if obj:IsA("BasePart") and obj.Name:find("Sell") and obj:FindFirstChildOfClass("ProximityPrompt") then
				sellPart = obj
				break
			end
		end
	end
	
	if not cookPrompt or not sellPart then
		FarmStatus.Text = "Status: Missing cook/sell points"
		task.wait(5)
		return
	end
	
	local sellPrompt = sellPart:FindFirstChildOfClass("ProximityPrompt")
	if not sellPrompt then
		FarmStatus.Text = "Status: No sell prompt"
		task.wait(5)
		return
	end

	-- Cook
	FarmStatus.Text = "Status: Cooking..."
	teleportTo(cookPart.Position)
	task.wait(0.5)
	
	local fiji = findItem("FijiWater")
	if fiji then
		pcall(function() char.Humanoid:EquipTool(fiji) end)
		task.wait(0.5)
		firePrompt(cookPrompt)
		task.wait(1)
	end
	
	local fresh = findItem("FreshWater")
	if fresh then
		pcall(function() char.Humanoid:EquipTool(fresh) end)
		task.wait(0.5)
		firePrompt(cookPrompt)
		task.wait(1)
	end
	
	local bag = findItem("Ice-Fruit Bag")
	if bag then
		pcall(function() char.Humanoid:EquipTool(bag) end)
		task.wait(0.5)
		firePrompt(cookPrompt)
		
		local steam = cookPart:FindFirstChild("Steam") or cookPart:FindFirstChild("LoadUI")
		if steam then
			local start = tick()
			while steam.Enabled and tick() - start < 25 do
				task.wait(0.5)
				if not farming then return end
			end
		else
			task.wait(10)
		end
	end
	
	teleportTo(cookPart.Position)
	task.wait(0.5)
	
	local cupz = findItem("Ice-Fruit Cupz")
	if cupz then
		pcall(function() char.Humanoid:EquipTool(cupz) end)
		task.wait(0.5)
		firePrompt(cookPrompt)
		task.wait(0.5)
	end
	
	FarmStatus.Text = "Status: Selling..."
	teleportTo(sellPart.Position)
	task.wait(0.5)
	
	for i = 1, 200 do
		if not farming then return end
		firePrompt(sellPrompt)
		if i % 30 == 0 then task.wait(0.1) end
		task.wait(0.02)
	end
	
	cycles = cycles + 1
	FarmCycles.Text = "Cycles: "..cycles
	FarmStatus.Text = "Status: Cycle "..cycles.." done!"
	task.wait(cooldown)
end

local function startFarming()
	if farming then
		stopFarming()
		task.wait(0.5)
	end
	
	farming = true
	cycles = 0
	FarmCycles.Text = "Cycles: 0"
	FarmStatus.Text = "Status: Starting..."
	FarmBtn.Text = "Stop Farming"
	FarmBtn.BackgroundColor3 = Color3.fromRGB(170,0,0)
	
	farmConnection = RunService.Heartbeat:Connect(function()
		if not farming then
			if farmConnection then
				farmConnection:Disconnect()
				farmConnection = nil
			end
			return
		end
		local s, e = pcall(doCycle)
		if not s then
			warn("Farm error: "..tostring(e))
			task.wait(3)
		end
	end)
end

FarmBtn.MouseButton1Click:Connect(function()
	if farming then
		stopFarming()
	else
		startFarming()
	end
end)

CooldownUp.MouseButton1Click:Connect(function()
	cooldown = math.min(cooldown + 1, 30)
	CooldownLabel.Text = "Cooldown: "..cooldown.."s"
end)

CooldownDown.MouseButton1Click:Connect(function()
	cooldown = math.max(cooldown - 1, 0)
	CooldownLabel.Text = "Cooldown: "..cooldown.."s"
end)

local function firePrompt(prompt)
	if prompt then
		local s, e = pcall(function() fireproximityprompt(prompt) end)
		if not s then
			pcall(function()
				prompt:InputHoldBegin()
				task.wait(0.1)
				prompt:InputHoldEnd()
			end)
		end
	end
end

--// BUY INF MONEY ITEMS
local function buyAllSupplies()
	FarmStatus.Text = "Status: Buying supplies..."
	local itemsToBuy = { "Ice-Fruit Bag", "Ice-Fruit Cupz", "FijiWater", "FreshWater" }
	
	-- Try to find the shop remote
	local shopRemote = nil
	for _, folder in pairs(ReplicatedStorage:GetChildren()) do
		if folder:IsA("Folder") or folder:IsA("RemoteEvent") then
			for _, remote in pairs(folder:GetChildren()) do
				if remote.Name:lower():find("shop") or remote.Name:lower():find("exotic") then
					shopRemote = remote
					break
				end
			end
		end
		if shopRemote then break end
	end
	
	if shopRemote then
		for _, itemName in pairs(itemsToBuy) do
			local success, err = pcall(function()
				shopRemote:InvokeServer(itemName)
			end)
			if success then
				print("[+] Bought: " .. itemName)
			else
				warn("[-] Failed to buy " .. itemName .. ": " .. tostring(err))
			end
			task.wait(1)
		end
		FarmStatus.Text = "Status: Supplies bought!"
	else
		FarmStatus.Text = "Status: Shop remote not found!"
		warn("[-] Could not find shop remote")
	end
end

local BuyBtn = Instance.new("TextButton")
BuyBtn.Size = UDim2.new(0,220,0,45)
BuyBtn.Position = UDim2.new(0,20,0,80)
BuyBtn.BackgroundColor3 = Color3.fromRGB(0,120,0)
BuyBtn.TextColor3 = Color3.new(1,1,1)
BuyBtn.Font = Enum.Font.GothamBold
BuyBtn.TextSize = 16
BuyBtn.Text = "Buy INF Money Items"
BuyBtn.Parent = FarmPage
BuyBtn.Name = "BuyInfBtn"
Instance.new("UICorner", BuyBtn).CornerRadius = UDim.new(0,8)

BuyBtn.MouseButton1Click:Connect(function()
	buyAllSupplies()
end)

--// OPEN / CLOSE BUTTONS
local Open = Instance.new("TextButton")
Open.Size = UDim2.new(0,100,0,40)
Open.Position = UDim2.new(0,10,1,-50)
Open.BackgroundColor3 = Color3.fromRGB(40,40,40)
Open.TextColor3 = Color3.new(1,1,1)
Open.Font = Enum.Font.GothamBold
Open.Text = "Open"
Open.Parent = ScreenGui
Instance.new("UICorner", Open).CornerRadius = UDim.new(0,8)

local Close = Instance.new("TextButton")
Close.Size = UDim2.new(0,40,0,40)
Close.Position = UDim2.new(1,-45,0,5)
Close.BackgroundColor3 = Color3.fromRGB(170,0,0)
Close.TextColor3 = Color3.new(1,1,1)
Close.Font = Enum.Font.GothamBold
Close.Text = "X"
Close.Parent = Main
Instance.new("UICorner", Close).CornerRadius = UDim.new(0,8)

local function closeGui()
	TweenService:Create(Main, TweenInfo.new(0.25), {Size = UDim2.new(0,0,0,0)}):Play()
	task.wait(0.25)
	Main.Visible = false
end

local function openGui()
	Main.Visible = true
	TweenService:Create(Main, TweenInfo.new(0.25), {Size = UDim2.new(0,700,0,450)}):Play()
end

Close.MouseButton1Click:Connect(closeGui)
Open.MouseButton1Click:Connect(openGui)

print("[Balkan Hub] Loaded successfully! Click 'Farm' tab to start.")



--// OPEN BUTTON
local Open = Instance.new("TextButton")
Open.Size = UDim2.new(0,100,0,40)
Open.Position = UDim2.new(0,10,1,-50)
Open.BackgroundColor3 = Color3.fromRGB(40,40,40)
Open.TextColor3 = Color3.new(1,1,1)
Open.Font = Enum.Font.GothamBold
Open.Text = "Open"
Open.Parent = ScreenGui

Instance.new("UICorner", Open).CornerRadius = UDim.new(0,8)

--// CLOSE BUTTON
local Close = Instance.new("TextButton")
Close.Size = UDim2.new(0,40,0,40)
Close.Position = UDim2.new(1,-45,0,5)
Close.BackgroundColor3 = Color3.fromRGB(170,0,0)
Close.TextColor3 = Color3.new(1,1,1)
Close.Font = Enum.Font.GothamBold
Close.Text = "X"
Close.Parent = Main

Instance.new("UICorner", Close).CornerRadius = UDim.new(0,8)

local function closeGui()
	TweenService:Create(
		Main,
		TweenInfo.new(0.25),
		{
			Size = UDim2.new(0,0,0,0)
		}
	):Play()

	task.wait(0.25)

	Main.Visible = false
end

local function openGui()
	Main.Visible = true

	TweenService:Create(
		Main,
		TweenInfo.new(0.25),
		{
			Size = UDim2.new(0,700,0,450)
		}
	):Play()
end

Close.MouseButton1Click:Connect(closeGui)
Open.MouseButton1Click:Connect(openGui)

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: