local Debug = true -- Set this to true if you want my debug output.
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local Players = game:GetService("Players")
     
    local Player = Players.LocalPlayer or Players.PlayerAdded:Wait()
    local Remotes = ReplicatedStorage:WaitForChild("Remotes", 9e9) -- A second argument in waitforchild what could it mean?
    local Balls = workspace:WaitForChild("Balls", 9e9)
     
    -- Functions
     
    local function print(...) -- Debug print.
        if Debug then
            warn(...)
        end
    end
     
    local function VerifyBall(Ball) -- Returns nil if the ball isn't a valid projectile; true if it's the right ball.
        if typeof(Ball) == "Instance" and Ball:IsA("BasePart") and Ball:IsDescendantOf(Balls) and Ball:GetAttribute("realBall") == true then
            return true
        end
    end
     
    local function IsTarget() -- Returns true if we are the current target.
        return (Player.Character and Player.Character:FindFirstChild("Highlight"))
    end
     
    local function Parry() -- Parries.
        Remotes:WaitForChild("ParryButtonPress"):Fire()
    end
     
    -- The actual code
     
    Balls.ChildAdded:Connect(function(Ball)
        if not VerifyBall(Ball) then
            return
        end
     
        print(`Ball Spawned: {Ball}`)
     
        local OldPosition = Ball.Position
        local OldTick = tick()
     
        Ball:GetPropertyChangedSignal("Position"):Connect(function()
            if IsTarget() then -- No need to do the math if we're not being attacked.
                local Distance = (Ball.Position - workspace.CurrentCamera.Focus.Position).Magnitude
                local Velocity = (OldPosition - Ball.Position).Magnitude -- Fix for .Velocity not working. Yes I got the lowest possible grade in accuplacer math.
     
                print(`Distance: {Distance}\nVelocity: {Velocity}\nTime: {Distance / Velocity}`)
     
                if (Distance / Velocity) <= 10 then -- Sorry for the magic number. This just works. No, you don't get a slider for this because it's 2am.
                    Parry()
                end
            end
     
            if (tick() - OldTick >= 1/60) then -- Don't want it to update too quickly because my velocity implementation is aids. Yes, I tried Ball.Velocity. No, it didn't work.
                OldTick = tick()
                OldPosition = Ball.Position
            end
        end)
    end)

  local NotificationHolder = loadstring(game:HttpGet("https://[Log in to view URL]"))()
  local Notification = loadstring(game:HttpGet("https://[Log in to view URL]"))()
  
  Notification:Notify(
    {Title = "Private hub beta", Description = "Auto Parry : On"},
    {OutlineColor = Color3.fromRGB(80, 80, 80), Time = 10, Type = "option"},
    {Image = "http://[Log in to view URL]", ImageColor = Color3.fromRGB(255, 84, 84), Callback = function(State) print(tostring(State)) end}
  )
end

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: