repeat task.wait() until game:IsLoaded() -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -- SERVICES & VARS -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ local Players = game:GetService("Players") local UIS = game:GetService("UserInputService") local RS = game:GetService("ReplicatedStorage") local player = Players.LocalPlayer local folder = workspace:WaitForChild("Live"):WaitForChild("Friends") local baseCFrame = CFrame.new(-134.58, 1, 261.64) local running = true local minimized = false local selectedBlock = nil local selectedBlocks = {} local activeDropList = nil -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -- LAYOUT CONSTANTS -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ local W = 230 local PAD = 10 local INN = W - PAD * 2 local ROW = 32 local LIST_H = 110 local TITLE_H = 40 local GAP = 5 local MAX_VIS = 340 local BG = Color3.fromRGB(13, 13, 19) local BG2 = Color3.fromRGB(21, 21, 31) local BG3 = Color3.fromRGB(26, 26, 40) local BORDER = Color3.fromRGB(48, 48, 70) local ACCENT = Color3.fromRGB(100, 185, 255) local WHITE = Color3.fromRGB(232, 232, 242) local DIM = Color3.fromRGB(118, 118, 145) local RED = Color3.fromRGB(210, 70, 70) local GREEN = Color3.fromRGB(70, 210, 125) local SEL_BG = Color3.fromRGB(16, 48, 30) local SEL_FG = Color3.fromRGB(70, 215, 130) local SEC_C = Color3.fromRGB(85, 155, 225) -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -- HELPERS -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ local function corner(o, r) Instance.new("UICorner", o).CornerRadius = UDim.new(0, r or 6) end local function mkStroke(o, c, t) local s = Instance.new("UIStroke", o) s.Color = c or BORDER; s.Thickness = t or 1 s.ApplyStrokeMode = Enum.ApplyStrokeMode.Border end local function mkLabel(par, txt, x, y, w, h, sz, col, bold, xa) local l = Instance.new("TextLabel", par) l.Position = UDim2.new(0,x,0,y); l.Size = UDim2.new(0,w,0,h) l.Text = txt; l.TextSize = sz or 12; l.TextColor3 = col or WHITE l.Font = bold and Enum.Font.GothamBold or Enum.Font.Gotham l.TextXAlignment = xa or Enum.TextXAlignment.Left l.BackgroundTransparency = 1 return l end -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -- GUI ROOT -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ local gui = Instance.new("ScreenGui") gui.Name = "SurfLuckyBlocks"; gui.ResetOnSpawn = false gui.ZIndexBehavior = Enum.ZIndexBehavior.Global gui.Parent = game.CoreGui -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -- MAIN WINDOW (deklarasi dulu, orb butuh referensi ke main) -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ local main = Instance.new("Frame", gui) main.BackgroundColor3 = BG main.ClipsDescendants = false main.Position = UDim2.new(0.5,-W/2,0.5,-160) main.Size = UDim2.new(0,W,0,TITLE_H) corner(main, 10); mkStroke(main, BORDER, 1) -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -- FLOATING ORB (draggable + toggle) -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ local orb = Instance.new("TextButton", gui) orb.Size = UDim2.new(0,36,0,36) orb.Position = UDim2.new(0,12,0.5,-18) orb.Text = "🌊"; orb.TextSize = 17; orb.Font = Enum.Font.GothamBold orb.BackgroundColor3 = BG2; orb.TextColor3 = ACCENT corner(orb, 18); mkStroke(orb, ACCENT, 1.5) local orbDragging = false local orbDragStart = nil local orbStartPos = nil local orbMoved = false orb.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then orbDragging = true orbMoved = false orbDragStart = input.Position orbStartPos = orb.Position end end) UIS.InputChanged:Connect(function(input) if not orbDragging then return end if input.UserInputType ~= Enum.UserInputType.MouseMovement and input.UserInputType ~= Enum.UserInputType.Touch then return end local delta = input.Position - orbDragStart if math.abs(delta.X) > 4 or math.abs(delta.Y) > 4 then orbMoved = true end orb.Position = UDim2.new( orbStartPos.X.Scale, orbStartPos.X.Offset + delta.X, orbStartPos.Y.Scale, orbStartPos.Y.Offset + delta.Y ) end) UIS.InputEnded:Connect(function(input) if not orbDragging then return end if input.UserInputType ~= Enum.UserInputType.MouseButton1 and input.UserInputType ~= Enum.UserInputType.Touch then return end orbDragging = false if not orbMoved then main.Visible = not main.Visible end orbMoved = false end) -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -- DRAG MAIN WINDOW -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ local dragging, dragStart, startPos = false, nil, nil UIS.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then local mPos = input.Position local aPos = main.AbsolutePosition local inX = mPos.X >= aPos.X and mPos.X <= aPos.X + W local inY = mPos.Y >= aPos.Y and mPos.Y <= aPos.Y + TITLE_H if inX and inY then dragging = true dragStart = mPos startPos = main.Position end end end) UIS.InputChanged:Connect(function(input) if not dragging then return end if input.UserInputType ~= Enum.UserInputType.MouseMovement and input.UserInputType ~= Enum.UserInputType.Touch then return end local delta = input.Position - dragStart main.Position = UDim2.new( startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y ) end) UIS.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = false end end) -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -- TITLE BAR -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ local titleBar = Instance.new("Frame", main) titleBar.Size = UDim2.new(1,0,0,TITLE_H) titleBar.Position = UDim2.new(0,0,0,0) titleBar.BackgroundColor3 = BG2 titleBar.ZIndex = 2 corner(titleBar, 10) local titleLbl = mkLabel(titleBar, "🌊 Surf for Lucky Blocks", PAD, 0, W-68, TITLE_H, 13, WHITE, true) titleLbl.TextYAlignment = Enum.TextYAlignment.Center titleLbl.ZIndex = 3 local arrowLbl = mkLabel(titleBar, "▼", W-62, 0, 20, TITLE_H, 10, ACCENT, true, Enum.TextXAlignment.Center) arrowLbl.TextYAlignment = Enum.TextYAlignment.Center arrowLbl.ZIndex = 3 local closeBtn = Instance.new("TextButton", titleBar) closeBtn.Size = UDim2.new(0,24,0,24) closeBtn.Position = UDim2.new(1,-32,0.5,-12) closeBtn.Text = "✕"; closeBtn.TextSize = 11 closeBtn.Font = Enum.Font.GothamBold closeBtn.BackgroundColor3 = Color3.fromRGB(148,26,26) closeBtn.TextColor3 = WHITE; closeBtn.ZIndex = 4 corner(closeBtn, 5) local minBtn = Instance.new("TextButton", titleBar) minBtn.Size = UDim2.new(1,-36,1,0) minBtn.Position = UDim2.new(0,0,0,0) minBtn.BackgroundTransparency = 1; minBtn.Text = ""; minBtn.ZIndex = 2 -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -- SCROLL AREA -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ local scroller = Instance.new("ScrollingFrame", main) scroller.Position = UDim2.new(0,0,0,TITLE_H) scroller.BackgroundTransparency = 1 scroller.ScrollBarThickness = 3 scroller.ScrollBarImageColor3 = ACCENT scroller.CanvasSize = UDim2.new(0,0,0,0) scroller.ClipsDescendants = true scroller.BorderSizePixel = 0 local inner = Instance.new("Frame", scroller) inner.BackgroundTransparency = 1 inner.Size = UDim2.new(1,0,0,0) local cy = 6 -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -- LAYOUT PRIMITIVES -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ local function section(txt) cy = cy + 8 local ln = Instance.new("Frame", inner) ln.Size = UDim2.new(0,INN,0,1); ln.Position = UDim2.new(0,PAD,0,cy) ln.BackgroundColor3 = BORDER; ln.BorderSizePixel = 0 cy = cy + 2 local t = mkLabel(inner, txt, PAD, cy, INN, 16, 10, SEC_C, true) t.TextYAlignment = Enum.TextYAlignment.Center cy = cy + 18 end local function dropdown(defaultTxt) local BY = cy local btn = Instance.new("TextButton", inner) btn.Size = UDim2.new(0,INN,0,ROW); btn.Position = UDim2.new(0,PAD,0,BY) btn.Text = ""; btn.BackgroundColor3 = BG2 corner(btn,6); mkStroke(btn, BORDER, 1) local hdr = mkLabel(btn, defaultTxt, 10, 0, INN-22, ROW, 12, DIM, false) hdr.TextYAlignment = Enum.TextYAlignment.Center hdr.TextTruncate = Enum.TextTruncate.AtEnd local arw = mkLabel(btn, "▼", INN-20, 0, 18, ROW, 10, ACCENT, true, Enum.TextXAlignment.Center) arw.TextYAlignment = Enum.TextYAlignment.Center cy = cy + ROW + GAP local list = Instance.new("ScrollingFrame", main) list.Size = UDim2.new(0,INN,0,LIST_H) list.BackgroundColor3 = BG3; list.Visible = false list.ZIndex = 10; list.ScrollBarThickness = 3 list.ScrollBarImageColor3 = ACCENT; list.BorderSizePixel = 0 corner(list,6); mkStroke(list, ACCENT, 1) local lp = Instance.new("UIPadding", list) lp.PaddingTop = UDim.new(0,4); lp.PaddingBottom = UDim.new(0,4) lp.PaddingLeft = UDim.new(0,4); lp.PaddingRight = UDim.new(0,4) local lo = Instance.new("UIListLayout", list); lo.Padding = UDim.new(0,3) local function reposition() local bA = btn.AbsolutePosition local mA = main.AbsolutePosition list.Position = UDim2.new(0, bA.X-mA.X, 0, bA.Y-mA.Y + ROW + 2) end btn.MouseButton1Click:Connect(function() if activeDropList and activeDropList ~= list then activeDropList.Visible = false end list.Visible = not list.Visible if list.Visible then reposition(); activeDropList = list else activeDropList = nil end arw.Text = list.Visible and "▲" or "▼" end) return hdr, arw, list, lo end local function toggle(txt) local on = false local btn = Instance.new("TextButton", inner) btn.Size = UDim2.new(0,INN,0,ROW); btn.Position = UDim2.new(0,PAD,0,cy) btn.Text = ""; btn.BackgroundColor3 = BG2 corner(btn,6); mkStroke(btn, BORDER, 1) mkLabel(btn, txt, 10, 0, INN-54, ROW, 12, WHITE, true) .TextYAlignment = Enum.TextYAlignment.Center local st = mkLabel(btn, "OFF", INN-44, 0, 38, ROW, 11, RED, true, Enum.TextXAlignment.Right) st.TextYAlignment = Enum.TextYAlignment.Center cy = cy + ROW + GAP btn.MouseButton1Click:Connect(function() on = not on st.Text = on and "ON" or "OFF" st.TextColor3 = on and GREEN or RED btn.BackgroundColor3 = on and Color3.fromRGB(14,34,22) or BG2 end) local function forceOff() on = false; st.Text = "OFF"; st.TextColor3 = RED; btn.BackgroundColor3 = BG2 end return function() return on end, forceOff end -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -- BUILD LAYOUT -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ section("🎯 SINGLE TARGET") local singleHdr, singleArw, singleList, singleLo = dropdown("Select Block ▼") section("📋 MULTI PRIORITY") local multiHdr, multiArw, multiList, multiLo = dropdown("Multi Priority (0) ▼") section("⚙️ AUTOMATION") local getSteal, offSteal = toggle("⚔️ Auto Steal") local getRebirth, offRebirth = toggle("♻️ Auto Rebirth") cy = cy + 4 -- CREDIT local creditFrame = Instance.new("Frame", inner) creditFrame.Size = UDim2.new(0,INN,0,28) creditFrame.Position = UDim2.new(0,PAD,0,cy) creditFrame.BackgroundColor3 = BG3 creditFrame.BorderSizePixel = 0 corner(creditFrame, 6) mkStroke(creditFrame, BORDER, 1) local creditLbl = mkLabel( creditFrame, "🦕 Script by Dibosaurus", 0, 0, INN, 28, 11, DIM, false, Enum.TextXAlignment.Center ) creditLbl.TextYAlignment = Enum.TextYAlignment.Center cy = cy + 28 + GAP + 4 -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -- APPLY SIZES -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ local CONTENT_H = cy local SCROLL_H = math.min(CONTENT_H, MAX_VIS) local FULL_H = TITLE_H + SCROLL_H local MINI_H = TITLE_H inner.Size = UDim2.new(1,0,0,CONTENT_H) scroller.CanvasSize = UDim2.new(0,0,0,CONTENT_H) scroller.Size = UDim2.new(1,0,0,SCROLL_H) main.Size = UDim2.new(0,W,0,FULL_H) -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -- LIST ITEM FACTORY -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ local function mkItem(parent, txt, sel, onClick) local b = Instance.new("TextButton", parent) b.Size = UDim2.new(1,0,0,26); b.Text = "" b.BackgroundColor3 = sel and SEL_BG or BG2; b.ZIndex = 11 corner(b,4) local t = mkLabel(b, txt, 8, 0, INN-24, 26, 11, sel and SEL_FG or DIM, false) t.TextYAlignment = Enum.TextYAlignment.Center; t.ZIndex = 12 b.MouseButton1Click:Connect(onClick) return b end local function updateCanvas(sf, lo) task.defer(function() sf.CanvasSize = UDim2.new(0,0,0, lo.AbsoluteContentSize.Y + 8) end) end -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -- REFRESH BLOCK LIST -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ local function refreshList() local counts = {} for _, v in pairs(folder:GetChildren()) do if v:FindFirstChild("RootPart") and v.RootPart:FindFirstChild("StealPrompt") then counts[v.Name] = (counts[v.Name] or 0) + 1 end end for _, c in pairs(singleList:GetChildren()) do if c:IsA("TextButton") then c:Destroy() end end for _, c in pairs(multiList:GetChildren()) do if c:IsA("TextButton") then c:Destroy() end end for name, count in pairs(counts) do local txt = name .. " · ×" .. count mkItem(singleList, txt, false, function() selectedBlock = name singleHdr.Text = name; singleHdr.TextColor3 = WHITE singleList.Visible = false; singleArw.Text = "▼"; activeDropList = nil end) local sel = table.find(selectedBlocks, name) ~= nil mkItem(multiList, txt, sel, function() local idx = table.find(selectedBlocks, name) if idx then table.remove(selectedBlocks, idx) else table.insert(selectedBlocks, name) end local n = #selectedBlocks multiHdr.Text = n>0 and ("Multi ("..n..")") or "Multi Priority (0) ▼" multiHdr.TextColor3 = n>0 and WHITE or DIM refreshList() end) end updateCanvas(singleList, singleLo) updateCanvas(multiList, multiLo) end -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -- GAME LOGIC -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ local function doSteal() local char = player.Character if not char or not char:FindFirstChild("HumanoidRootPart") then return end local hrp = char.HumanoidRootPart local function try(name) for _, v in pairs(folder:GetChildren()) do if v.Name == name and v:FindFirstChild("RootPart") then local p = v.RootPart:FindFirstChild("StealPrompt") if p then hrp.CFrame = v.RootPart.CFrame * CFrame.new(0,0,3) task.wait(0.15); fireproximityprompt(p) task.wait(0.15); hrp.CFrame = baseCFrame return true end end end return false end if selectedBlock and try(selectedBlock) then return end for _, n in ipairs(selectedBlocks) do if try(n) then return end end end local function doRebirth() local live = workspace:FindFirstChild("Live") if live then for _, obj in pairs(live:GetDescendants()) do if obj:IsA("ProximityPrompt") then if (obj.Name..obj.ActionText..obj.ObjectText):lower():find("rebirth") then pcall(fireproximityprompt, obj); return end end end end for _, re in pairs(RS:GetDescendants()) do if re:IsA("RemoteEvent") and re.Name:lower():find("rebirth") then pcall(function() re:FireServer() end); return end end end -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -- LOOPS -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ task.spawn(function() while running do if getSteal() then doSteal() end; task.wait(0.3) end end) task.spawn(function() while running do if getRebirth() then doRebirth() end; task.wait(2) end end) task.spawn(function() while running do refreshList(); task.wait(3) end end) -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -- UI EVENTS -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ minBtn.MouseButton1Click:Connect(function() minimized = not minimized scroller.Visible = not minimized arrowLbl.Text = minimized and "▶" or "▼" main.Size = UDim2.new(0, W, 0, minimized and MINI_H or FULL_H) if minimized and activeDropList then activeDropList.Visible = false; activeDropList = nil end end) closeBtn.MouseButton1Click:Connect(function() running = false offSteal(); offRebirth() gui:Destroy() end) UIS.InputBegan:Connect(function(input, gpe) if not gpe and input.KeyCode == Enum.KeyCode.RightControl then main.Visible = not main.Visible end end) -- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ refreshList()