Wall Hop Practice Script (November 2026) – Bypass Hd Admin X

PUBLISHEDUPDATED
1 Available ScriptFree

Most players get stuck trying to master difficult climbing techniques, but using the Wall Hop Practice script makes the whole process way easier to handle.

You practice wall hopping by jumping and turning against walls to reach hidden areas, and every single challenge here is fully tested and possible to beat.

If you want to grab the current script and test out these features right now, check out the code below.

Wall Hop Practice Script – Bypass Hd Admin X & More

Bypass Hd Admin X & MoreFree
Bypass Hd Admin X
--==========================================================
--  HD Admin Helper — Pro Edition (Bypass + Blue Border)
--==========================================================
local Players           = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local StarterGui        = game:GetService("StarterGui")
local UserInputService  = game:GetService("UserInputService")
local TextChatService   = game:GetService("TextChatService")
local RunService        = game:GetService("RunService")

local LP = Players.LocalPlayer

--== Config ==--
local PREFIXO       = ";" -- Fixo
local MAX_SELECT    = 5
local W, H, TH      = 250, 355, 24 

--== Remote HD Admin ==--
local RC = ReplicatedStorage:FindFirstChild("HDAdminHDClient")
    and ReplicatedStorage.HDAdminHDClient:FindFirstChild("Signals")
    and ReplicatedStorage.HDAdminHDClient.Signals:FindFirstChild("RequestCommand")
if not RC then warn("[HD Helper] HD Admin não encontrado."); return end

--== Estado ==--
local mode               = nil
local multiList          = {}
local chatVisible        = false
local includeMe          = true
local loopMode           = false
local fastBypass         = false -- NOVO: Estado do Bypass
local loops              = {}
local nextLoopId         = 1
local playerBtns         = {}
local searchTerm         = ""
local minimized          = false
local runningAll         = false

local commandHistory     = {}
local selectedCmds       = {}
local historyBtns        = {}

local setStatus, refreshInfo, refreshSelection

--==========================================================
-- HELPERS
--==========================================================
local function findPlayer(name)
    if not name then return nil end
    local q = name:lower():gsub("^@", "")
    for _, p in ipairs(Players:GetPlayers()) do if p.Name:lower() == q then return p end end
    for _, p in ipairs(Players:GetPlayers()) do if p.DisplayName:lower() == q then return p end end
    for _, p in ipairs(Players:GetPlayers()) do if p.Name:lower():sub(1, #q) == q then return p end end
    for _, p in ipairs(Players:GetPlayers()) do if p.DisplayName:lower():sub(1, #q) == q then return p end end
    return nil
end

local function currentGuiTarget()
    if mode == "ALL" then return "all" end
    if mode == "ME" then return "me" end
    if mode == "MULTI" and #multiList > 0 then return table.concat(multiList, ",") end
end

local function buildCommand(userCmd, guiTargetOverride)
    local guiTarget = guiTargetOverride
    if guiTargetOverride == nil then guiTarget = currentGuiTarget() end

    local w = {}
    for word in userCmd:gmatch("%S+") do table.insert(w, word) end
    if #w == 0 then return userCmd end

    local kind = nil
    if #w >= 2 then
        local c = w[2]:lower():gsub("^@", "")
        if c == "all" then kind = "all"
        elseif c == "me" then kind = "me"
        else
            local p = findPlayer(c)
            if p then kind = "player"; w[2] = p.Name end
        end
    end

    if kind == "all" then return table.concat(w, " ") end
    if kind == "player" then return table.concat(w, " ") end

    if kind == "me" then
        if guiTarget == "all" then table.insert(w, 2, "all"); return table.concat(w, " ")
        elseif guiTarget and guiTarget ~= "me" then w[2] = guiTarget; return table.concat(w, " ")
        else return table.concat(w, " ") end
    end

    if guiTarget then
        if guiTarget == "all" or guiTarget == "me" then
            table.insert(w, 2, guiTarget)
        else
            local parts = {}
            for name in guiTarget:gmatch("[^,]+") do 
                local p = findPlayer(name)
                table.insert(parts, p and p.Name or name) 
            end
            table.insert(w, 2, table.concat(parts, ","))
        end
    end
    return table.concat(w, " ")
end

local function replaceAllTarget(str, newName)
    local w = {}
    for word in str:gmatch("%S+") do table.insert(w, word) end
    if #w >= 2 and w[2]:lower() == "all" then w[2] = newName end
    return table.concat(w, " ")
end

local function getTargetPlayers()
    local t = {}
    for _, p in ipairs(Players:GetPlayers()) do
        if p == LP then
            if includeMe then table.insert(t, p) end
        else
            table.insert(t, p)
        end
    end
    return t
end

local function getUndoCommand(rawCmd)
    local w = {}
    for word in rawCmd:gmatch("%S+") do table.insert(w, word) end
    if #w == 0 then return "un" .. rawCmd end
    w[1] = "un" .. w[1]
    return table.concat(w, " ")
end

--==========================================================
-- CHAT / REMOTE
--==========================================================
local function sendRealChat(text)
    local ok = pcall(function()
        local ch = TextChatService:FindFirstChild("TextChannels")
        if ch then
            local g = ch:FindFirstChild("RBXGeneral") or ch:FindFirstChildWhichIsA("TextChannel")
            if g then g:SendAsync(text); return true end
        end
        return false
    end)
    if ok then return true end
    return pcall(function() StarterGui:SetCore("ChatSendMessage", text) end)
end

local function sendRemote(cmd)
    pcall(function() RC:InvokeServer(PREFIXO .. cmd) end)
end

--==========================================================
-- UI CONSTRUCTION
--==========================================================
local gui = Instance.new("ScreenGui")
gui.Name = "HDHelper"
gui.ResetOnSpawn = false
gui.IgnoreGuiInset = true
gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
gui.Parent = LP:WaitForChild("PlayerGui")

local main = Instance.new("Frame")
main.Size = UDim2.new(0, W, 0, H)
main.Position = UDim2.new(0, 12, 0.5, -H/2)
main.BackgroundColor3 = Color3.fromRGB(14, 15, 22)
main.BorderSizePixel = 0
main.Active = true
main.Draggable = true
main.ClipsDescendants = true
main.Parent = gui
Instance.new("UICorner", main).CornerRadius = UDim.new(0, 10)
local mst = Instance.new("UIStroke", main)
mst.Color = Color3.fromRGB(30, 120, 255); mst.Thickness = 1.5

local bar = Instance.new("Frame")
bar.Size = UDim2.new(1, 0, 0, TH)
bar.BackgroundColor3 = Color3.fromRGB(22, 24, 36)
bar.BorderSizePixel = 0
bar.Parent = main
Instance.new("UICorner", bar).CornerRadius = UDim.new(0, 10)
local grad = Instance.new("UIGradient")
grad.Color = ColorSequence.new({ColorSequenceKeypoint.new(0, Color3.fromRGB(30, 60, 120)), ColorSequenceKeypoint.new(1, Color3.fromRGB(40, 40, 80))})
grad.Parent = bar

local title = Instance.new("TextLabel")
title.Size = UDim2.new(1, -60, 1, 0)
title.Position = UDim2.new(0, 12, 0, 0)
title.BackgroundTransparency = 1
title.Text = "HD Admin"
title.TextColor3 = Color3.fromRGB(235, 238, 255)
title.Font = Enum.Font.GothamBold
title.TextSize = 11
title.TextXAlignment = Enum.TextXAlignment.Left
title.Parent = bar

local function titleBtn(txt, x, bg)
    local b = Instance.new("TextButton")
    b.Size = UDim2.new(0, 16, 0, 16)
    b.Position = UDim2.new(1, x, 0, 4)
    b.BackgroundColor3 = bg
    b.Text = txt
    b.TextColor3 = Color3.fromRGB(255, 255, 255)
    b.Font = Enum.Font.GothamBold
    b.TextSize = 11
    b.Parent = bar
    Instance.new("UICorner", b).CornerRadius = UDim.new(0, 4)
    return b
end
local minBtn   = titleBtn("—", -42, Color3.fromRGB(70, 75, 105))
local closeBtn = titleBtn("×", -22, Color3.fromRGB(190, 55, 60))

local content = Instance.new("Frame")
content.Size = UDim2.new(1, 0, 1, -TH)
content.Position = UDim2.new(0, 0, 0, TH)
content.BackgroundTransparency = 1
content.Parent = main

local inputWrap = Instance.new("Frame")
inputWrap.Size = UDim2.new(1, -12, 0, 24)
inputWrap.Position = UDim2.new(0, 6, 0, 6)
inputWrap.BackgroundColor3 = Color3.fromRGB(26, 28, 42)
inputWrap.BorderSizePixel = 0
inputWrap.Parent = content
Instance.new("UICorner", inputWrap).CornerRadius = UDim.new(0, 6)

local prefixLbl = Instance.new("TextLabel")
prefixLbl.Size = UDim2.new(0, 20, 1, 0)
prefixLbl.BackgroundTransparency = 1
prefixLbl.Text = PREFIXO
prefixLbl.TextColor3 = Color3.fromRGB(130, 180, 255)
prefixLbl.Font = Enum.Font.GothamBold
prefixLbl.TextSize = 12
prefixLbl.Parent = inputWrap

local cmdBox = Instance.new("TextBox")
cmdBox.Size = UDim2.new(1, -26, 1, 0)
cmdBox.Position = UDim2.new(0, 22, 0, 0)
cmdBox.BackgroundTransparency = 1
cmdBox.TextColor3 = Color3.fromRGB(255, 255, 255)
cmdBox.PlaceholderText = "Ex: fly me / teleport all..."
cmdBox.PlaceholderColor3 = Color3.fromRGB(100, 105, 130)
cmdBox.Font = Enum.Font.Gotham
cmdBox.TextSize = 10
cmdBox.Text = ""
cmdBox.TextXAlignment = Enum.TextXAlignment.Left
cmdBox.ClearTextOnFocus = false
cmdBox.Parent = inputWrap

local row1 = Instance.new("Frame")
row1.Size = UDim2.new(1, -12, 0, 20)
row1.Position = UDim2.new(0, 6, 0, 34)
row1.BackgroundTransparency = 1
row1.Parent = content

local function mkChip(parent, x, w, txt, bg)
    local b = Instance.new("TextButton")
    b.Size = UDim2.new(w, -2, 1, 0)
    b.Position = UDim2.new(x, 0, 0, 0)
    b.BackgroundColor3 = bg or Color3.fromRGB(36, 38, 54)
    b.Text = txt
    b.TextColor3 = Color3.fromRGB(220, 225, 245)
    b.Font = Enum.Font.GothamBold
    b.TextSize = 9
    b.Parent = parent
    Instance.new("UICorner", b).CornerRadius = UDim.new(0, 4)
    return b
end

local allBtn = mkChip(row1, 0,   0.5, "Todos")
local meBtn  = mkChip(row1, 0.5, 0.5, "Eu mesmo")

local row2 = Instance.new("Frame")
row2.Size = UDim2.new(1, -12, 0, 20)
row2.Position = UDim2.new(0, 6, 0, 58)
row2.BackgroundTransparency = 1
row2.Parent = content

local inclChip = mkChip(row2, 0,     0.28, "☑ Com eu", Color3.fromRGB(40, 100, 60))
local chatChip = mkChip(row2, 0.28,  0.24, "Chat OFF")
local loopChip = mkChip(row2, 0.52,  0.24, "Loop OFF")
local speedChip = mkChip(row2, 0.76, 0.24, "Speed 10", Color3.fromRGB(36, 38, 54)) -- Novo Botão

local histTitle = Instance.new("TextLabel")
histTitle.Size = UDim2.new(1, -12, 0, 12)
histTitle.Position = UDim2.new(0, 6, 0, 82)
histTitle.BackgroundTransparency = 1
histTitle.Text = "⚡ Comandos (1 Click = Marcar / 2 Clicks = Repetir)"
histTitle.TextColor3 = Color3.fromRGB(200, 170, 255)
histTitle.Font = Enum.Font.GothamBold
histTitle.TextSize = 8
histTitle.TextXAlignment = Enum.TextXAlignment.Left
histTitle.Parent = content

local histList = Instance.new("ScrollingFrame")
histList.Size = UDim2.new(1, -12, 0, 36)
histList.Position = UDim2.new(0, 6, 0, 96)
histList.BackgroundColor3 = Color3.fromRGB(20, 22, 34)
histList.BorderSizePixel = 0
histList.CanvasSize = UDim2.new()
histList.ScrollBarThickness = 2
histList.Parent = content
Instance.new("UICorner", histList).CornerRadius = UDim.new(0, 5)

local hlLayout = Instance.new("UIListLayout")
hlLayout.Padding = UDim.new(0, 2)
hlLayout.SortOrder = Enum.SortOrder.LayoutOrder
hlLayout.Parent = histList
hlLayout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(function() histList.CanvasSize = UDim2.new(0,0,0,hlLayout.AbsoluteContentSize.Y+4) end)

local searchWrap = Instance.new("Frame")
searchWrap.Size = UDim2.new(1, -12, 0, 22)
searchWrap.Position = UDim2.new(0, 6, 0, 136)
searchWrap.BackgroundColor3 = Color3.fromRGB(26, 28, 42)
searchWrap.BorderSizePixel = 0
searchWrap.Parent = content
Instance.new("UICorner", searchWrap).CornerRadius = UDim.new(0, 6)

local searchBox = Instance.new("TextBox")
searchBox.Size = UDim2.new(1, -10, 1, 0)
searchBox.Position = UDim2.new(0, 6, 0, 0)
searchBox.BackgroundTransparency = 1
searchBox.TextColor3 = Color3.fromRGB(240, 240, 250)
searchBox.PlaceholderText = "🔍 Pesquisar jogador..."
searchBox.PlaceholderColor3 = Color3.fromRGB(110, 113, 138)
searchBox.Font = Enum.Font.Gotham
searchBox.TextSize = 10
searchBox.Text = ""
searchBox.TextXAlignment = Enum.TextXAlignment.Left
searchBox.ClearTextOnFocus = false
searchBox.Parent = searchWrap

local list = Instance.new("ScrollingFrame")
list.Size = UDim2.new(1, -12, 0, 65)
list.Position = UDim2.new(0, 6, 0, 162)
list.BackgroundColor3 = Color3.fromRGB(20, 22, 34)
list.BorderSizePixel = 0
list.CanvasSize = UDim2.new()
list.ScrollBarThickness = 2
list.Parent = content
Instance.new("UICorner", list).CornerRadius = UDim.new(0, 5)

local layout = Instance.new("UIListLayout")
layout.Padding = UDim.new(0, 2)
layout.SortOrder = Enum.SortOrder.LayoutOrder
layout.Parent = list
layout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(function() list.CanvasSize = UDim2.new(0,0,0,layout.AbsoluteContentSize.Y+4) end)

local infoRow = Instance.new("Frame")
infoRow.Size = UDim2.new(1, -12, 0, 16)
infoRow.Position = UDim2.new(0, 6, 0, 231)
infoRow.BackgroundTransparency = 1
infoRow.Parent = content

local infoLbl = Instance.new("TextLabel")
infoLbl.Size = UDim2.new(0.6, 0, 1, 0)
infoLbl.BackgroundTransparency = 1
infoLbl.Text = "Alvo: Sem alvo"
infoLbl.TextColor3 = Color3.fromRGB(150, 185, 255)
infoLbl.Font = Enum.Font.GothamMedium
infoLbl.TextSize = 9
infoLbl.TextXAlignment = Enum.TextXAlignment.Left
infoLbl.Parent = infoRow

local loopsBtn = Instance.new("TextButton")
loopsBtn.Size = UDim2.new(0.4, 0, 1, 0)
loopsBtn.Position = UDim2.new(0.6, 0, 0, 0)
loopsBtn.BackgroundColor3 = Color3.fromRGB(80, 40, 55)
loopsBtn.Text = "Limpar Loops (0)"
loopsBtn.TextColor3 = Color3.fromRGB(255, 215, 215)
loopsBtn.Font = Enum.Font.GothamBold
loopsBtn.TextSize = 8
loopsBtn.Parent = infoRow
Instance.new("UICorner", loopsBtn).CornerRadius = UDim.new(0, 3)

local rowBottom = Instance.new("Frame")
rowBottom.Size = UDim2.new(1, -12, 0, 20)
rowBottom.Position = UDim2.new(0, 6, 0, 251)
rowBottom.BackgroundTransparency = 1
rowBottom.Parent = content

local stopSelBtn = Instance.new("TextButton")
stopSelBtn.Size = UDim2.new(0.6, -2, 1, 0)
stopSelBtn.BackgroundColor3 = Color3.fromRGB(180, 50, 50)
stopSelBtn.Text = "🛑 Parar Marcados (un)"
stopSelBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
stopSelBtn.Font = Enum.Font.GothamBold
stopSelBtn.TextSize = 8
stopSelBtn.Parent = rowBottom
Instance.new("UICorner", stopSelBtn).CornerRadius = UDim.new(0, 4)

local stopAllBtn = Instance.new("TextButton")
stopAllBtn.Size = UDim2.new(0.4, -2, 1, 0)
stopAllBtn.Position = UDim2.new(0.6, 2, 0, 0)
stopAllBtn.BackgroundColor3 = Color3.fromRGB(120, 50, 50)
stopAllBtn.Text = "Limpar Tudo"
stopAllBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
stopAllBtn.Font = Enum.Font.GothamBold
stopAllBtn.TextSize = 8
stopAllBtn.Parent = rowBottom
Instance.new("UICorner", stopAllBtn).CornerRadius = UDim.new(0, 4)

local statusLbl = Instance.new("TextLabel")
statusLbl.Size = UDim2.new(1, -12, 0, 12)
statusLbl.Position = UDim2.new(0, 6, 0, 275)
statusLbl.BackgroundTransparency = 1
statusLbl.Text = "Pronto."
statusLbl.TextColor3 = Color3.fromRGB(140, 210, 150)
statusLbl.Font = Enum.Font.Gotham
statusLbl.TextSize = 9
statusLbl.TextXAlignment = Enum.TextXAlignment.Center
statusLbl.Parent = content

-- Botão Minimizado Quadrado com Borda Azul
local reopen = Instance.new("TextButton")
reopen.Size = UDim2.new(0, 32, 0, 32)
reopen.Position = UDim2.new(0, 12, 0.5, -16)
reopen.BackgroundColor3 = Color3.fromRGB(20, 24, 36)
reopen.Text = "HD"
reopen.TextColor3 = Color3.fromRGB(200, 220, 255)
reopen.Font = Enum.Font.GothamBold
reopen.TextSize = 10
reopen.Visible = false
reopen.Parent = gui
Instance.new("UICorner", reopen).CornerRadius = UDim.new(0, 8)
local rs = Instance.new("UIStroke", reopen)
rs.Color = Color3.fromRGB(30, 120, 255); rs.Thickness = 1.5

local expanded  = UDim2.new(0, W, 0, H)
local minSize   = UDim2.new(0, W, 0, TH)

minBtn.MouseButton1Click:Connect(function()
    minimized = not minimized
    if minimized then
        content.Visible = false; main.Size = minSize; minBtn.Text = "+"
    else
        content.Visible = true; main.Size = expanded; minBtn.Text = "—"
    end
end)
closeBtn.MouseButton1Click:Connect(function() main.Visible = false; reopen.Visible = true end)
reopen.MouseButton1Click:Connect(function() main.Visible = true; reopen.Visible = false end)

--==========================================================
-- CONTROLE DE HISTÓRICO
--==========================================================
local function registerCommand(fullCmd)
    for _, c in ipairs(commandHistory) do if c == fullCmd then return end end
    table.insert(commandHistory, fullCmd)

    local b = Instance.new("TextButton")
    b.Size = UDim2.new(1, -4, 0, 16)
    b.BackgroundColor3 = Color3.fromRGB(30, 32, 45)
    b.Text = fullCmd
    b.TextColor3 = Color3.fromRGB(220, 225, 245)
    b.Font = Enum.Font.Gotham
    b.TextSize = 9
    b.TextXAlignment = Enum.TextXAlignment.Left
    b.TextTruncate = Enum.TextTruncate.AtEnd
    b.Parent = histList
    Instance.new("UICorner", b).CornerRadius = UDim.new(0, 3)
    Instance.new("UIPadding", b).PaddingLeft = UDim.new(0, 4)

    local lastClick = 0

    b.MouseButton1Click:Connect(function()
        local currentTime = tick()
        if currentTime - lastClick < 0.35 then
            if loopMode then
                startLoop(fullCmd)
                setStatus("Loop reiniciado: " .. fullCmd)
            else
                if mode == "ALL" then executeAll(fullCmd)
                else executeSingle(fullCmd) end
                setStatus("Reexecutado: " .. fullCmd)
            end
            lastClick = 0
        else
            local isSelected = false
            for i, cmd in ipairs(selectedCmds) do
                if cmd == fullCmd then
                    table.remove(selectedCmds, i)
                    isSelected = true
                    break
                end
            end

            if isSelected then
                b.BackgroundColor3 = Color3.fromRGB(30, 32, 45)
            else
                if #selectedCmds >= MAX_SELECT then
                    setStatus("Máx " .. MAX_SELECT .. " marcados.", Color3.fromRGB(255, 160, 160))
                    return
                end
                table.insert(selectedCmds, fullCmd)
                b.BackgroundColor3 = Color3.fromRGB(65, 105, 225)
            end
            lastClick = currentTime
        end
    end)
    
    table.insert(historyBtns, b)
end

--==========================================================
-- LISTA DE JOGADORES
--==========================================================
local function labelFor(p) return p.DisplayName ~= p.Name and (p.DisplayName .. " (@" .. p.Name .. ")") or p.Name end
local function inMulti(name) for _, n in ipairs(multiList) do if n == name then return true end end return false end

local function matchesSearch(p)
    if searchTerm == "" then return true end
    local q = searchTerm:lower()
    return p.Name:lower():find(q, 1, true) ~= nil or p.DisplayName:lower():find(q, 1, true) ~= nil
end

local function refreshFilter()
    for _, p in ipairs(Players:GetPlayers()) do
        local b = playerBtns[p.Name]
        if b then b.Visible = matchesSearch(p) end
    end
end

local function addPlayer(p)
    if p == LP or playerBtns[p.Name] then return end
    local b = Instance.new("TextButton")
    b.Size = UDim2.new(1, -4, 0, 18)
    b.BackgroundColor3 = Color3.fromRGB(30, 32, 45)
    b.Text = ""
    b.Parent = list
    Instance.new("UICorner", b).CornerRadius = UDim.new(0, 4)

    local lbl = Instance.new("TextLabel")
    lbl.Size = UDim2.new(1, -20, 1, 0)
    lbl.Position = UDim2.new(0, 16, 0, 0)
    lbl.BackgroundTransparency = 1
    lbl.Text = labelFor(p)
    lbl.TextColor3 = Color3.fromRGB(230, 232, 245)
    lbl.Font = Enum.Font.Gotham
    lbl.TextSize = 9
    lbl.TextXAlignment = Enum.TextXAlignment.Left
    lbl.TextTruncate = Enum.TextTruncate.AtEnd
    lbl.Parent = b

    local dot = Instance.new("Frame")
    dot.Size = UDim2.new(0, 4, 0, 4)
    dot.Position = UDim2.new(0, 6, 0.5, -2)
    dot.BackgroundColor3 = Color3.fromRGB(110, 220, 130)
    dot.Parent = b
    Instance.new("UICorner", dot).CornerRadius = UDim.new(1, 0)

    b.MouseButton1Click:Connect(function()
        if mode == "ALL" or mode == "ME" or mode == nil then
            mode = "MULTI"; multiList = {p.Name}
        else
            local found = false
            for i, n in ipairs(multiList) do if n == p.Name then table.remove(multiList, i); found = true; break end end
            if not found then
                if #multiList >= MAX_SELECT then return end
                table.insert(multiList, p.Name)
            end
            if #multiList == 0 then mode = nil end
        end
        refreshSelection()
    end)
    b.Visible = matchesSearch(p)
    playerBtns[p.Name] = b
end

local function removePlayer(p)
    local b = playerBtns[p.Name]
    if b then
        b:Destroy(); playerBtns[p.Name] = nil
        for i, n in ipairs(multiList) do if n == p.Name then table.remove(multiList, i); break end end
        if #multiList == 0 and mode == "MULTI" then mode = nil end
        refreshSelection()
    end
end

for _, p in ipairs(Players:GetPlayers()) do addPlayer(p) end
Players.PlayerAdded:Connect(addPlayer)
Players.PlayerRemoving:Connect(removePlayer)

searchBox:GetPropertyChangedSignal("Text"):Connect(function()
    searchTerm = searchBox.Text
    refreshFilter()
end)

--==========================================================
-- HELPERS DE UI
--==========================================================
function setStatus(t, c) statusLbl.Text = t or ""; statusLbl.TextColor3 = c or Color3.fromRGB(140, 210, 150) end

function refreshInfo()
    if mode == "ALL" then infoLbl.Text = "Alvo: TODOS" .. (includeMe and " (+eu)" or "")
    elseif mode == "ME" then infoLbl.Text = "Alvo: Você"
    elseif mode == "MULTI" then infoLbl.Text = "Alvo: " .. #multiList .. "/" .. MAX_SELECT
    else infoLbl.Text = "Sem alvo" end
    loopsBtn.Text = "Limpar Loops (" .. #loops .. ")"
end

function refreshSelection()
    for name, b in pairs(playerBtns) do
        b.BackgroundColor3 = (mode == "MULTI" and inMulti(name)) and Color3.fromRGB(65, 105, 225) or Color3.fromRGB(30, 32, 45)
    end
    allBtn.BackgroundColor3 = (mode == "ALL") and Color3.fromRGB(65, 105, 225) or Color3.fromRGB(30, 32, 45)
    meBtn.BackgroundColor3 = (mode == "ME") and Color3.fromRGB(65, 105, 225) or Color3.fromRGB(30, 32, 45)
    refreshInfo()
end

--==========================================================
-- EXECUÇÃO SIMPLES / ALL
--==========================================================
function executeSingle(rawCmd, isUndo)
    local built = buildCommand(rawCmd)
    if not isUndo then registerCommand(built) end
    if chatVisible then sendRealChat(PREFIXO .. built) else sendRemote(built) end
    setStatus("Enviado: " .. built)
end

function executeAll(rawCmd, isUndo)
    if runningAll then return end
    runningAll = true
    local template = buildCommand(rawCmd, "all")
    if not isUndo then registerCommand(template) end
    if chatVisible then sendRealChat(PREFIXO .. template); task.wait(0.4) end

    local snapshot = getTargetPlayers()
    task.spawn(function()
        for i, p in ipairs(snapshot) do
            if p and p.Parent then
                local built = replaceAllTarget(template, p.Name)
                pcall(function() RC:InvokeServer(PREFIXO .. built) end)
                setStatus(("• %d/%d  %s"):format(i, #snapshot, built))
            end
            -- O Bypass usa a velocidade 100 ou 10
            if fastBypass then RunService.Heartbeat:Wait() else task.wait(0.1) end
        end
        setStatus("✔ " .. #snapshot .. " enviados")
        runningAll = false
    end)
end

--==========================================================
-- LOOPS — Sincronização e Bypass de Velocidade
--==========================================================
local function killLoop(l)
    if not l then return end
    l.alive = false
    for _, c in ipairs(l.conns) do pcall(function() if c and c.Disconnect then c:Disconnect() end end) end
    l.conns = {}; l.tracked = {}
end

local function clearLoops()
    for _, l in ipairs(loops) do killLoop(l) end
    loops = {}; refreshInfo()
end

local function processLoopsForPlayer(p)
    if not p or not p.Parent or not p.Character then return end
    local hum = p.Character:FindFirstChildOfClass("Humanoid")
    if not hum or hum.Health <= 0 then return end

    local commandsToSend = {}
    for _, l in ipairs(loops) do
        if l.alive and l.mode == "ALL" then
            table.insert(commandsToSend, l.cmd)
        end
    end

    -- Envia comandos de acordo com a velocidade
    task.spawn(function()
        for _, cmd in ipairs(commandsToSend) do
            local built = replaceAllTarget(buildCommand(cmd, "all"), p.Name)
            pcall(function() RC:InvokeServer(PREFIXO .. built) end)
            
            -- Bypass Inteligente: 
            -- Se estiver ON (Speed 100), usa Heartbeat (aproximadamente 60 vezes por segundo, sem delay manual).
            -- Se estiver OFF (Speed 10), usa task.wait(0.1).
            if fastBypass then
                RunService.Heartbeat:Wait() 
            else
                task.wait(0.1)
            end
        end
    end)
end

function startLoop(rawCmd)
    local loop = { id = nextLoopId, cmd = rawCmd, mode = mode, alive = true, conns = {}, tracked = {} }
    nextLoopId += 1

    local template = buildCommand(rawCmd)  
    registerCommand(template)
    if chatVisible then sendRealChat(PREFIXO .. template) end  

    local function live() return loop.alive end  

    local function cmdFor(p)  
        if loop.mode == "ALL" then 
            return replaceAllTarget(template, p.Name)  
        elseif loop.mode == "ME" then 
            return buildCommand(rawCmd, "me")  
        else 
            local w = {}
            for word in rawCmd:gmatch("%S+") do table.insert(w, word) end
            if #w >= 2 then
                local c = w[2]:lower():gsub("^@", "")
                if c == "all" or c == "me" or findPlayer(c) then table.remove(w, 2) end
            end
            table.insert(w, 2, p.Name)
            return table.concat(w, " ")
        end  
    end  

    local function sendToPlayer(p)  
        if not live() or not p or not p.Parent then return end  
        local char = p.Character  
        if not char then return end  
        local hum = char:FindFirstChildOfClass("Humanoid")  
        if not hum or hum.Health <= 0 then return end  

        local built = cmdFor(p)  
        sendRemote(built)  
        setStatus(("⟳ #%d  %s → %s"):format(loop.id, built, p.Name), Color3.fromRGB(255, 200, 120))  
    end  

    local function track(p)  
        if not live() or loop.tracked[p] then return end  
        loop.tracked[p] = true  

        if p.Character then
            task.spawn(function() 
                task.wait(0.5) 
                if live() then 
                    if loop.mode == "ALL" then processLoopsForPlayer(p)
                    else sendToPlayer(p) end
                end 
            end)
        end

        local charConn = p.CharacterAdded:Connect(function(newChar)  
            if not live() then return end
            
            local hum = newChar:WaitForChild("Humanoid", 3)
            if hum then
                task.wait(0.1)
                if live() then 
                    if loop.mode == "ALL" then 
                        processLoopsForPlayer(p) 
                    else 
                        sendToPlayer(p) 
                    end
                end
            end
        end)  
        table.insert(loop.conns, charConn)  
    end  

    task.spawn(function()  
        if loop.mode == "ALL" then  
            for _, p in ipairs(getTargetPlayers()) do if live() then track(p); task.wait(0.05) end end  
        elseif loop.mode == "ME" then track(LP)  
        else  
            for _, n in ipairs(multiList) do if live() then local p = Players:FindFirstChild(n); if p then track(p) end; task.wait(0.05) end end  
        end  
    end)  

    table.insert(loop.conns, Players.PlayerAdded:Connect(function(np)  
        if not live() then return end  
        task.wait(1)  
        if not live() then return end  
        local shouldTrack = false  
        if loop.mode == "ALL" then if includeMe or np ~= LP then shouldTrack = true end  
        elseif loop.mode == "ME" then if np == LP then shouldTrack = true end  
        else for _, name in ipairs(multiList) do if findPlayer(name) == np then shouldTrack = true; break end end end  
        if shouldTrack then track(np) end  
    end))  

    table.insert(loop.conns, Players.PlayerRemoving:Connect(function(p) loop.tracked[p] = nil end))  
    table.insert(loops, loop)  
    refreshInfo()
end

--==========================================================
-- EVENTOS
--==========================================================
allBtn.MouseButton1Click:Connect(function() mode = "ALL"; multiList = {}; refreshSelection() end)
meBtn.MouseButton1Click:Connect(function() mode = "ME"; multiList = {}; refreshSelection() end)

inclChip.MouseButton1Click:Connect(function()
    includeMe = not includeMe
    inclChip.Text = includeMe and "☑ Com eu" or "☐ Com eu"
    inclChip.BackgroundColor3 = includeMe and Color3.fromRGB(40, 100, 60) or Color3.fromRGB(80, 45, 55)
    refreshInfo()
end)

chatChip.MouseButton1Click:Connect(function()
    chatVisible = not chatVisible
    chatChip.Text = chatVisible and "Chat ON" or "Chat OFF"
    chatChip.BackgroundColor3 = chatVisible and Color3.fromRGB(40, 120, 65) or Color3.fromRGB(36, 38, 54)
end)

loopChip.MouseButton1Click:Connect(function()
    loopMode = not loopMode
    loopChip.Text = loopMode and "Loop ON" or "Loop OFF"
    loopChip.BackgroundColor3 = loopMode and Color3.fromRGB(150, 100, 30) or Color3.fromRGB(36, 38, 54)
    if not loopMode and #loops > 0 then clearLoops(); setStatus("Loops encerrados.") end
end)

-- BOTÃO DE VELOCIDADE (Speed 10 / Speed 100)
speedChip.MouseButton1Click:Connect(function()
    fastBypass = not fastBypass
    speedChip.Text = fastBypass and "Speed 100" or "Speed 10"
    speedChip.BackgroundColor3 = fastBypass and Color3.fromRGB(60, 100, 180) or Color3.fromRGB(36, 38, 54)
    setStatus(fastBypass and "Bypass Ativado (Quase Instantâneo)" or "Bypass Desativado (Normal)")
end)

loopsBtn.MouseButton1Click:Connect(function() clearLoops(); setStatus("Loops limpos.") end)

cmdBox.FocusLost:Connect(function(enterPressed)
    if not enterPressed then return end
    local raw = cmdBox.Text:gsub("^%s+", ""):gsub("%s+$", "")
    if raw == "" then return end
    cmdBox.Text = ""
    if not mode then setStatus("Escolha um alvo.", Color3.fromRGB(255, 160, 160)); return end

    if loopMode then startLoop(raw)
    elseif mode == "ALL" then executeAll(raw)
    else executeSingle(raw) end
end)

stopSelBtn.MouseButton1Click:Connect(function()
    if #selectedCmds == 0 then setStatus("Nenhum marcado.", Color3.fromRGB(255, 160, 160)); return end
    local toStop = {unpack(selectedCmds)}
    for _, cmd in ipairs(toStop) do
        local undoCmd = getUndoCommand(cmd)
        if mode == "ALL" then executeAll(undoCmd, true) else executeSingle(undoCmd, true) end
        for i, btn in ipairs(historyBtns) do if btn.Text == cmd then btn:Destroy(); table.remove(historyBtns, i); break end end
        for i, c in ipairs(commandHistory) do if c == cmd then table.remove(commandHistory, i); break end end
    end
    selectedCmds = {}; setStatus("Parados com UN.")
end)

stopAllBtn.MouseButton1Click:Connect(function()
    if #commandHistory == 0 then return end
    for _, cmd in ipairs(commandHistory) do
        local undoCmd = getUndoCommand(cmd)
        if mode == "ALL" then executeAll(undoCmd, true) else executeSingle(undoCmd, true) end
    end
    for _, btn in ipairs(historyBtns) do btn:Destroy() end
    commandHistory = {}; historyBtns = {}; selectedCmds = {}
    setStatus("Todos parados.")
end)

UserInputService.InputBegan:Connect(function(i, g)
    if g then return end
    if i.KeyCode == Enum.KeyCode.RightShift then
        main.Visible = not main.Visible
        reopen.Visible = not main.Visible
    end
end)

refreshSelection()
setStatus("Pronto.")
Executor compatibility changes over time. Check current reports before testing.

Copy the code above into a compatible Roblox script executor if you choose to test it.

Wall Hop Practice Script Status

✓AvailabilityFree
$Price$0
◫CompatibilityDesktop & Mobile
★SafetyVerified

Roblox and game updates can affect compatibility, so the script’s status should be treated as temporary rather than guaranteed.

Frequently Asked Questions

What is a Wall Hop Practice script?

A Wall Hop Practice script is third-party Lua code intended to run alongside the Roblox game through a compatible script executor.

What features does this Wall Hop Practice script include?

Different scripts contain different code. This version includes: Bypass Hd Admin X.

How do you use the Wall Hop Practice script?

Pick a compatible executor such as Hydrogen, MacSploit, AWP.GG, Delta, Fluxus, Codex, launch Roblox and join the game, copy the complete Lua code from the script card above, paste it into the executor’s editor, and click Run or Execute. Compatibility changes over time, so a name here doesn’t guarantee current support.

Can a Wall Hop Practice script get your Roblox account banned?

Yes. Third-party scripts can violate Roblox rules and may put an account at risk. Only use code from a source you trust, never enter your Roblox password into a script or executor, and test on an alternate account first.

Does the Wall Hop Practice script work on mobile?

Check whether both the executor and the script support your device and the current Roblox version. Mobile executor support does not guarantee that every script will work.

Check out our Roblox Scripts hub and Roblox Games Directory for more.

Leave a Comment