Further enhance and use an advanced auto-block callback system with the remotes, and also an advanced predictor that doesn't rely on local blockDirection = 8. It'll randomly chooses the default blockDirection based-off swinging animations but it'll also use advanced methods. Make it block slaps too when it detects. There's no other remotes than this.

Anim ID's:

```
local animIDs = {
    ["RightSwing"] = 12625839385,
    ["OverheadSwing"] = 12625841878,
    ["LeftSwing"] = 12625843823,
    ["BackLeftSwing"] = 12625846167,
    ["FrontRightSwing"] = 12625848489,
    ["BackRightSwing"] = 12625851115,
    ["FrontLeftSwing"] = 12625853257,
    ["RightBlock"] = 12625856098,
    ["LeftBlock"] = 12625858434,
    ["FrontLeftBlock"] = 12625860439,
    ["FrontRightBlock"] = 12625862519,
    ["FrontBlock"] = 12625864413,
    ["BackLeftBlock"] = 12625866538,
    ["BackRightBlock"] = 12625868684,
    ["Grab"] = 12625870437,
    ["Slap"] = 12625891544,
    ["SlappedLegs"] = 12671715182,
    ["SlappedArms"] = 12625896358,
    ["KickUp"] = 12625897944,
    ["KickBack"] = 12625899752,
    ["LeftRoll"] = 12625901874,
    ["RightRoll"] = 12625904322,
    ["Aerial"] = 12625908201,
    ["Idle"] = 13956175510,
    ["Throw"] = 12626569448,
    ["ForcePush"] = 12645928786,
    ["CrouchWalkRight"] = 12699256551,
    ["CrouchWalkLeft"] = 12699989478,
    ["CrouchWalkBack"] = 12699390244,
    ["CrouchWalkForward"] = 12699464592,
    ["FrontRoll"] = 12708915962,
    ["RightCrouchRoll"] = 12713661639,
    ["LeftCrouchRoll"] = 12713663289,
    ["Kata"] = 12735531097,
    ["Choking"] = 12814275189,
    ["Choke"] = 12815930160,
}
```

```
-- Super Advanced Auto Block Script for Saber Showdown
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local StarterGui = game:GetService("StarterGui")

local player = Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")

local isBlocking = false
local blockDirection = 8 -- Default block direction (can be changed)

-- Create ScreenGui and UI elements for notification
local screenGui = Instance.new("ScreenGui", player:WaitForChild("PlayerGui"))

-- Create the black box
local blackBox = Instance.new("Frame", screenGui)
blackBox.Size = UDim2.new(0.25, 0, 0.1, 0)
blackBox.Position = UDim2.new(0, 0, 0.9, 0)
blackBox.BackgroundColor3 = Color3.fromRGB(0, 0, 0)
blackBox.BackgroundTransparency = 0.5

-- Create the green loading bar
local loadingBar = Instance.new("Frame", blackBox)
loadingBar.Size = UDim2.new(1, 0, 0.2, 0)
loadingBar.Position = UDim2.new(0, 0, -0.2, 0)
loadingBar.BackgroundColor3 = Color3.fromRGB(0, 255, 0)
loadingBar.BackgroundTransparency = 0.3

-- Create the text label
local messageBox = Instance.new("TextLabel", blackBox)
messageBox.Size = UDim2.new(1, 0, 1, 0)
messageBox.Position = UDim2.new(0, 0, 0, 0)
messageBox.BackgroundTransparency = 1
messageBox.TextColor3 = Color3.fromRGB(255, 255, 255)
messageBox.TextScaled = true
messageBox.Text = "Press 'Q' to activate auto block"

-- Function to start blocking
local function startBlocking()
    if not isBlocking then
        isBlocking = true
        ReplicatedStorage.LightsaberRemotes.Block:FireServer()
        print("Blocking started")
    end
end

-- Function to update block direction
local function updateBlockDirection(direction)
    ReplicatedStorage.LightsaberRemotes.UpdateBlockDirection:FireServer(direction)
end

-- Function to stop blocking
local function stopBlocking()
    if isBlocking then
        isBlocking = false
        ReplicatedStorage.LightsaberRemotes.Unblock:FireServer()
        print("Blocking stopped")
    end
end

-- Function to determine hit direction based on the position of the attacker
local function getHitDirection(attackerPosition)
    local characterPosition = character.PrimaryPart.Position
    local direction = (attackerPosition - characterPosition).unit
    local angle = math.deg(math.atan2(direction.Z, direction.X))
    if angle < 0 then angle = angle + 360 end

    if angle >= 0 and angle < 45 then
        return 1 -- Forward
    elseif angle >= 45 and angle < 135 then
        return 2 -- Right
    elseif angle >= 135 and angle < 225 then
        return 3 -- Backward
    elseif angle >= 225 and angle < 315 then
        return 4 -- Left
    else
        return 1 -- Forward (default wrap-around)
    end
end

-- Simulating hit detection (replace this with actual game logic)
local function onIncomingHit(attackerPosition)
    blockDirection = getHitDirection(attackerPosition)
    updateBlockDirection(blockDirection)
    startBlocking()
end

-- Example incoming hit simulation (replace with actual hit detection)
RunService.Heartbeat:Connect(function()
    local incomingHitDetected = false
    local attackerPosition = Vector3.new(0, 0, 0)

    if math.random() < 0.1 then
        incomingHitDetected = true
        attackerPosition = character.PrimaryPart.Position + Vector3.new(math.random(-10, 10), 0, math.random(-10, 10))
    end

    if incomingHitDetected then
        onIncomingHit(attackerPosition)
    elseif isBlocking then
        stopBlocking()
    end
end)

-- Key binding for manual blocking toggle
UserInputService.InputBegan:Connect(function(input, gameProcessedEvent)
    if not gameProcessedEvent and input.KeyCode == Enum.KeyCode.Q then
        if isBlocking then
            stopBlocking()
        else
            startBlocking()
        end
    end
end)