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)
No comments yet. Be the first!