OP Blade Ball Script Keyless Auto Parry

OP Blade Ball Script Keyless Auto Parry

Blade Ball 1 month ago
364 views
OP Blade Ball Script Keyless Auto Parry Keyless

Description

This Blade Ball script helps you automatically parry incoming balls during matches.
It also includes a spam parry feature for faster and more consistent parries.
The script is open source and does not require a key.

Features

  • + Auto Parry – Automatically parries incoming attacks.
  • + Spam Parry – Quickly performs parries when needed.
  • + Open Source – The script source is available for review and improvement.
  • + Keyless – No key system is required to use the script.
Features
Compatible Executors

Script

local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local localPlayer = Players.LocalPlayer
local localName = localPlayer.Name
local button = localPlayer.PlayerGui.Hotbar.Block
local mb1up = button.MouseButton1Up
local gfs = type(firesignal) == "function" and firesignal or type(getconnections) == "function" and getconnections
local useFiresignal = gfs == firesignal
local ballsFolder = workspace.Balls
local colorRed = Color3.fromRGB(255, 30, 30)
local colorGray = Color3.fromRGB(128, 128, 128)

if not gfs then
    game:GetService("StarterGui"):SetCore("SendNotification", {
        Title = "Error",
        Text = "Your executor is not supported",
        Duration = 5,
    })
    return
end

local targetedBall = nil
local posBall = nil
local root = nil
local lastRadius = 15
local lastRadiusSq = 225
local fired = false
local spamConnection = nil

local sphere = Instance.new("SphereHandleAdornment")
sphere.Radius = 15
sphere.Color3 = colorGray
sphere.AlwaysOnTop = true
sphere.Transparency = 0.75
sphere.Parent = workspace

local function fireMB1Up()
    if useFiresignal then
        gfs(mb1up)
    else
        for _, c in gfs(mb1up) do c:Fire() end
    end
end

local screenGui = Instance.new("ScreenGui")
screenGui.ResetOnSpawn = false
screenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
screenGui.Parent = localPlayer.PlayerGui

local frame = Instance.new("Frame")
frame.Size = UDim2.new(0, 120, 0, 36)
frame.Position = UDim2.new(0.5, -60, 0, 20)
frame.BackgroundColor3 = Color3.fromRGB(30, 30, 30)
frame.BorderSizePixel = 0
frame.Parent = screenGui

local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 6)
corner.Parent = frame

local stroke = Instance.new("UIStroke")
stroke.Color = Color3.fromRGB(255, 255, 255)
stroke.Thickness = 1.5
stroke.ApplyStrokeMode = Enum.ApplyStrokeMode.Border
stroke.Parent = frame

local spamButton = Instance.new("TextButton")
spamButton.Size = UDim2.new(1, 0, 1, 0)
spamButton.BackgroundTransparency = 1
spamButton.TextColor3 = Color3.fromRGB(255, 255, 255)
spamButton.Font = Enum.Font.GothamBold
spamButton.TextSize = 14
spamButton.Text = "SPAM: OFF"
spamButton.Parent = frame

local function makeDraggable(f, handle)
    handle = handle or f
    local dragInput, dragStart, startPos
    handle.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
            dragInput = input
            dragStart = input.Position
            startPos = f.Position
        end
    end)
    handle.InputChanged:Connect(function(input)
        if dragInput and input == dragInput then
            local delta = input.Position - dragStart
            f.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
        end
    end)
    UserInputService.InputEnded:Connect(function(input)
        if input == dragInput then dragInput = nil end
    end)
end

makeDraggable(frame, spamButton)

spamButton.Activated:Connect(function()
    if spamConnection then
        spamConnection:Disconnect()
        spamConnection = nil
        spamButton.Text = "SPAM: OFF"
        spamButton.TextColor3 = Color3.fromRGB(255, 255, 255)
    else
        spamButton.Text = "SPAM: ON"
        spamButton.TextColor3 = Color3.fromRGB(255, 80, 80)
        spamConnection = RunService.Heartbeat:Connect(function()
            fireMB1Up()
        end)
    end
end)

local handlerPool = {}
local ballHandlers = {}

local function onTargetChanged(ball)
    if ball:GetAttribute("target") == localName then
        targetedBall = ball
    elseif targetedBall == ball then
        targetedBall = nil
        fired = false
    end
    sphere.Color3 = targetedBall and colorRed or colorGray
end

local function trackBall(ball)
    local h = table.remove(handlerPool)
    if h then
        h.ball = ball
    else
        h = { ball = ball }
        h.fn = function()
            onTargetChanged(h.ball)
        end
    end
    ballHandlers[ball] = h
    onTargetChanged(ball)
    ball:GetAttributeChangedSignal("target"):Connect(h.fn)
end

local function untrackBall(ball)
    local h = ballHandlers[ball]
    if not h then return end
    ballHandlers[ball] = nil
    h.ball = nil
    handlerPool[#handlerPool + 1] = h
end

local children = ballsFolder:GetChildren()
for _, obj in children do trackBall(obj) end
posBall = children[1]

ballsFolder.ChildAdded:Connect(function(obj)
    trackBall(obj)
    if not posBall then posBall = obj end
end)

ballsFolder.ChildRemoved:Connect(function(obj)
    untrackBall(obj)
    if targetedBall == obj then
        targetedBall = nil
        fired = false
        sphere.Color3 = colorGray
    end
    if posBall == obj then posBall = next(ballHandlers) end
end)

localPlayer.CharacterAdded:Connect(function(char)
    root = char:WaitForChild("HumanoidRootPart")
    sphere.Adornee = root
end)
if localPlayer.Character then
    root = localPlayer.Character:WaitForChild("HumanoidRootPart")
    sphere.Adornee = root
end

RunService.Heartbeat:Connect(function()
    if not root or not posBall then return end

    local radius = 15 + posBall.AssemblyLinearVelocity.Magnitude * 0.15
    if radius ~= lastRadius then
        sphere.Radius = radius
        lastRadius = radius
        lastRadiusSq = radius * radius
    end

    if not targetedBall then return end
    if targetedBall:GetAttribute("target") ~= localName then
        fired = false
        return
    end
    if fired then return end

    local diff = posBall.Position - root.Position
    if diff:Dot(diff) <= lastRadiusSq then
        fireMB1Up()
        fired = true
    end
end)

Comments (0)

No comments yet. Be the first!