
Key Required VerifiedUniversal

-- ==============================================
-- SCRIPT DEV - BLADE BALL (SUDAH DIPERBAIKI & PASTI BERFUNGSI)
-- Auto Parry aktif langsung saat diaktifkan
-- ==============================================
if _G.dev_script then return end
_G.dev_script = true
repeat task.wait() until game:IsLoaded()
-- Perbaiki fungsi dasar jika belum ada
cloneref = cloneref or function(obj) return obj end
isfile = isfile or function(path) return pcall(readfile, path) end
isfolder = isfolder or function(path) return pcall(listfiles, path) end
makefolder = makefolder or function(path) pcall(writefile, path.."test.tmp", "") pcall(delfile, path.."test.tmp") end
-- Layanan Game
local ReplicatedStorage = cloneref(game:GetService("ReplicatedStorage"))
local UserInputService = cloneref(game:GetService("UserInputService"))
local HttpService = cloneref(game:GetService("HttpService"))
local RunService = cloneref(game:GetService("RunService"))
local Players = cloneref(game:GetService("Players"))
local Debris = cloneref(game:GetService("Debris"))
local Stats = cloneref(game:GetService("Stats"))
local LocalPlayer = Players.LocalPlayer
-- Pengaturan Default
_G.config = {
accuracy = 80,
spam_threshold = 2,
curve_keybind = false,
manual_notify = false,
curve_notify = false,
curve_method = 'Camera',
skin_changer = false,
manual_spam = false,
ability_esp = false,
auto_parry = true,
ball_debug = false,
auto_spam = false,
anti_phantom = false,
names = '',
}
-- Sistem Simpan/Muat Konfigurasi
if not isfolder("Dev/cfg") then makefolder("Dev/cfg") end
local CONFIG_PATH = "Dev/cfg/blade_ball.json"
local function saveConfig() pcall(function() writefile(CONFIG_PATH, HttpService:JSONEncode(_G.config)) end) end
local function loadConfig() pcall(function() if isfile(CONFIG_PATH) then _G.config = HttpService:JSONDecode(readfile(CONFIG_PATH)) end end) end
loadConfig()
task.spawn(function() repeat saveConfig() task.wait(2) until not _G.dev_script end)
-- Muat Perpustakaan UI
local Fluent = loadstring(game:HttpGet("https://github.com/dawid-scripts/Fluent/releases/latest/download/main.lua"))()
-- Buat Jendela Utama (Nama: Dev)
local Window = Fluent:CreateWindow({
Title = "Dev",
SubTitle = "Blade Ball Auto Parry",
TabWidth = 130,
Size = UDim2.fromOffset(520, 400),
Acrylic = false,
Theme = "Dark",
MinimizeKey = Enum.KeyCode.LeftControl,
})
-- Buat Tab Menu
local InstructionsTab = Window:AddTab({ Title = "Instructions", Icon = "info" })
local BlatantTab = Window:AddTab({ Title = "Blatant", Icon = "sword" })
local DetectionsTab = Window:AddTab({ Title = "Detections", Icon = "shield" })
local VisualTab = Window:AddTab({ Title = "Visual", Icon = "eye" })
local MiscTab = Window:AddTab({ Title = "Misc", Icon = "book" })
-- Petunjuk Penggunaan
InstructionsTab:AddParagraph({
Title = "⚠️ Cara Pakai",
Content = "✅ Aktifkan tombol Auto Parry di tab Blatant\n✅ Lakukan Parry Manual 2 kali pertama agar sistem bekerja\n✅ Tekan Kiri Ctrl untuk sembunyikan/tampilkan menu"
})
-- Variabel Utama
local activeConnections = {}
local Util = { ball = { properties = { aerodynamic_time = tick(), last_warping = tick(), lerp_radians = 0, curving = tick() } } }
local currentAnimation, hookedRemotes, hookedMetatables, lastActionName = nil, {}, {}, nil
local isTouchDevice = UserInputService.TouchEnabled and not UserInputService.MouseEnabled
local closestTarget, CurrentTarget = nil, nil
-- Fungsi Bantu
local function linearPredict(from, to, alpha) return from + (to - from) * alpha end
-- Cari & Kaitkan Remote Parry Otomatis
local function isValidRemoteArgs(args)
return #args == 7 and type(args[2]) == "string" and type(args[3]) == "number" and typeof(args[4]) == "CFrame" and type(args[5]) == "table" and type(args[6]) == "table" and type(args[7]) == "boolean"
end
local function hookRemote(remote)
if hookedRemotes[remote] then return end
local mt = getrawmetatable(remote)
if hookedMetatables[mt] then return end
hookedMetatables[mt] = true
setreadonly(mt, false)
local originalIndex = mt.__index
mt.__index = function(self, key)
if (key == "FireServer" and self:IsA("RemoteEvent")) or (key == "InvokeServer" and self:IsA("RemoteFunction")) then
return function(selfArg, ...)
local args = {...}
if isValidRemoteArgs(args) and not hookedRemotes[self] then
hookedRemotes[self] = args; lastActionName = args[2]
end
return originalIndex(self, key)(selfArg, unpack(args))
end
end
return originalIndex(self, key)
end
setreadonly(mt, true)
end
task.spawn(function()
repeat
for _, child in ReplicatedStorage:GetChildren() do
if child:IsA("RemoteEvent") or child:IsA("RemoteFunction") then hookRemote(child) end
end
task.wait(1)
until next(hookedRemotes) ~= nil
ReplicatedStorage.ChildAdded:Connect(function(child) if child:IsA("RemoteEvent") or child:IsA("RemoteFunction") then hookRemote(child) end end)
end)
-- Fungsi Ambil Bola
function Util.get_ball()
local balls = workspace:FindFirstChild("Balls")
if not balls then return nil end
for _, ball in balls:GetChildren() do if ball:GetAttribute("realBall") then return ball end end
end
function Util.get_balls()
local t, balls = {}, workspace:FindFirstChild("Balls")
if not balls then return t end
for _, ball in balls:GetChildren() do if ball:GetAttribute("realBall") then table.insert(t, ball) end end
return t
end
-- Fungsi Cari Pemain Terdekat
function Util.closest_player()
local minDist, closest = math.huge, nil
local alive = workspace:FindFirstChild("Alive")
if not alive then return nil end
for _, char in alive:GetChildren() do
if char ~= LocalPlayer.Character and char.PrimaryPart then
local dist = LocalPlayer:DistanceFromCharacter(char.PrimaryPart.Position)
if dist < minDist then minDist = dist; closest = char end
end
end
closestTarget, CurrentTarget = closest, closest
return closest
end
-- Fungsi Dapatkan Sudut Pandang Kurva
function Util.getCurveCFrame()
local cam, hrp = workspace.CurrentCamera, LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart")
if not hrp then return cam.CFrame end
local method = _G.config.curve_method
local target = CurrentTarget or closestTarget
local targetPos = target and target.PrimaryPart and target.PrimaryPart.Position or (hrp.Position + cam.CFrame.LookVector * 1000)
local toTarget = (targetPos - hrp.Position).Unit
local curves = {
Camera = function() return cam.CFrame end,
Dot = function() return CFrame.lookAt(hrp.Position, targetPos + Vector3.new(0, 1.75, 0)) end,
Backwards = function() return CFrame.new(hrp.Position, hrp.Position + (-toTarget) * 1000) end,
Slow = function() return CFrame.new(hrp.Position, hrp.Position + Vector3.new(0, -350, 0)) end,
Random = function() return CFrame.new(hrp.Position, targetPos + Vector3.new(math.random(-1000,1000), math.random(-350,1000), math.random(-1000,1000))) end
}
return curves[method] and curves[method]() or cam.CFrame
end
-- Fungsi Lakukan Parry (DIPERBAIKI AGAR PASTI BERHASIL)
local parryCount = 0
function Util.parry()
if not next(hookedRemotes) then return end
local char = LocalPlayer.Character
if not char or not char.PrimaryPart then return end
if parryCount > 8 then return end
parryCount += 1
task.delay(0.5, function() parryCount = math.max(0, parryCount - 1) end)
local curveCFrame = Util.getCurveCFrame()
local mouse = pcall(UserInputService.GetMouseLocation, UserInputService) and select(2, UserInputService:GetMouseLocation()) or {0,0}
local cursorPos = isTouchDevice and {workspace.CurrentCamera.ViewportSize.X/2, workspace.CurrentCamera.ViewportSize.Y/2} or {mouse.X, mouse.Y}
local playerScreen = {}
local alive = workspace:FindFirstChild("Alive")
if alive then for _, c in alive:GetChildren() do if c.PrimaryPart then
local ok, sp = pcall(function() return workspace.CurrentCamera:WorldToScreenPoint(c.PrimaryPart.Position) end)
if ok then playerScreen[c.Name] = sp end
end end end
for remote, args in pairs(hookedRemotes) do
pcall(function()
local mod = {args[1], args[2], args[3], curveCFrame, playerScreen, cursorPos, args[7]}
if remote:IsA("RemoteEvent") then remote:FireServer(unpack(mod)) end
if remote:IsA("RemoteFunction") then remote:InvokeServer(unpack(mod)) end
end)
end
end
-- Deteksi Bola Melengkung
function Util.ball_curved()
local ball = Util.get_ball()
if not ball then return false end
local zoomies = ball:FindFirstChild("zoomies")
if not zoomies then return false end
local vel, dir = zoomies.VectorVelocity, zoomies.VectorVelocity.Unit
local hrp = LocalPlayer.Character.PrimaryPart
local toPlayer = (hrp.Position - ball.Position).Unit
local dot = toPlayer:Dot(dir)
local speed, dist = vel.Magnitude, (hrp.Position - ball.Position).Magnitude
local ping = Stats.Network.ServerStatsItem["Data Ping"]:GetValue()
local pingThres = 0.5 - (ping / 1000)
local timeTo = dist / speed - (ping / 1000)
local parryDist = 25 - math.min(dist/1000,25) + math.min(speed/100,40)
if speed > 100 and timeTo > ping/10 then parryDist = math.max(parryDist-15,15) end
if dist < parryDist then return false end
return dot < pingThres
end
-- === TOMBOL AUTO PARRY YANG BERFUNGSI ===
local accuracyMultiplier = 0.7
local isOnCooldown = false
BlatantTab:AddToggle("AutoParryToggle", {
Title = "✅ Auto Parry",
Default = _G.config.auto_parry,
Callback = function(enabled)
_G.config.auto_parry = enabled
if enabled then
print("✅ Auto Parry AKTIF - Siap digunakan!")
activeConnections.auto_parry = RunService.Heartbeat:Connect(function()
local char = LocalPlayer.Character
if not char or not char.PrimaryPart or isOnCooldown or not next(hookedRemotes) then return end
local hrp = char.PrimaryPart
local balls = Util.get_balls()
if not balls then return end
for _, ball in pairs(Util.get_balls()) do
local target = ball:GetAttribute("target")
if target ~= LocalPlayer.Name then return end
local dist = (hrp.Position - ball.Position).Magnitude
local ping = Stats.Network.ServerStatsItem["Data Ping"]:GetValue() / 10
local pingAdj = math.clamp(ping/10, 5, 17)
local zoomies = ball:FindFirstChild("zoomies")
local speed = zoomies and zoomies.VectorVelocity.Magnitude or 0
local parryRange = pingAdj + math.max(speed / (2.4 * accuracyMultiplier), 9.5)
if dist <= parryRange and not Util.ball_curved() then
Util.parry()
isOnCooldown = true
task.delay(0.35, function() isOnCooldown = false end)
end
end
end)
else
print("❌ Auto Parry DIMATIKAN")
if activeConnections.auto_parry then
activeConnections.auto_parry:Disconnect()
activeConnections.auto_parry = nil
end
end
end
})
-- Pengaturan Tambahan
BlatantTab:AddSlider("AccuracySet", {
Title = "Akurasi Parry",
Default = _G.config.accuracy,
Min = 1, Max = 100, Rounding = 1,
Callback = function(v) _G.config.accuracy = v; accuracyMultiplier = 0.015 * v end
})
BlatantTab:AddDropdown("CurveSelect", {
Title = "Metode Kurva",
Values = {"Camera", "Dot", "Backwards", "Slow", "Random"},
Default = _G.config.curve_method,
Callback = function(v) _G.config.curve_method = v end
})
-- Selesai Memuat
Window:SelectTab(1)
print("✅ SCRIPT DEV BERHASIL DIMUAT!")
print("📌 Nama Menu: Dev")
print("📌 Auto Parry sudah siap aktif saat tombol ditekan")
print("⌨️ Tekan Kiri Ctrl untuk sembunyikan/tampilkan menu")No comments yet for this script.



