OP Blade Ball Script Keyless Auto Parry

OP Blade Ball Script Keyless Auto Parry

Blade Ball 2 weeks ago
198 views
OP Blade Ball Script Keyless Auto Parry Keyless
DeltaDev
Play Game Game Link

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!