-- ============================================== -- 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")