Sword Fight Bot For This Follower Game
Key Required

Sword Fight Bot For This Follower Game

Followers simulator1kzuya1kzuya 2.4K views 1.1K executesUpdated Dec 1, 2025
5.0/ 5(3 votes)
30100% Positive
Lua Script•342 lines (11727 chars)
local Players           = game:GetService("Players")
local RunService        = game:GetService("RunService")
local UserInputService  = game:GetService("UserInputService")
local CoreGui           = game:GetService("CoreGui")

local LocalPlayer       = Players.LocalPlayer
local Character         = LocalPlayer.Character or LocalPlayer.CharacterAdded:Wait()
local Humanoid          = Character:WaitForChild("Humanoid")
local RootPart          = Character:WaitForChild("HumanoidRootPart")

-- Update references when character respawns
LocalPlayer.CharacterAdded:Connect(function(newChar)
    Character   = newChar
    Humanoid    = newChar:WaitForChild("Humanoid")
    RootPart    = newChar:WaitForChild("HumanoidRootPart")
end)

-- === CONFIGURABLE SETTINGS ===
local ArenaCenter       = workspace["ExeDi's SwordFight Model"].Part.OuterRing.Position
local ArenaRadius       = 45        -- Max distance from center to still be considered "in arena"
local AttackRange       = 4         -- How close you need to be to start circling/attacking
local ToolAttackRadius  = math.random(6, 8)  -- Distance for tool auto-attack (randomized a bit)

local BotEnabled        = false
local WalkSpeed         = 16
local JumpPower         = 50

local IdleWanderMode    = false
local NextWanderTime    = 0
local WanderChancePerFrame = 0.1

-- === UTILITY FUNCTIONS ===
local function GetRandomPointInRing()
    local angle = math.random() * math.pi * 2
    local distance = math.random() * (ArenaRadius - 5)
    return ArenaCenter + Vector3.new(math.cos(angle) * distance, 0, math.sin(angle) * distance)
end

local function MoveTo(pos)
    if Humanoid then
        Humanoid:MoveTo(pos)
    end
end

local function IsInsideArena()
    if (RootPart.Position - ArenaCenter).Magnitude > ArenaRadius - 5 then
        MoveTo(ArenaCenter)
        return false
    end
    return true
end

local function PlayerHasTool(plr)
    if not plr.Character then return false end
    return plr.Character:FindFirstChildOfClass("Tool") or plr.Backpack:FindFirstChildOfClass("Tool")
end

-- Returns all valid enemies inside the arena that have a tool equipped/in backpack
local function GetEnemiesInArena()
    local enemies = {}
    for _, plr in ipairs(Players:GetPlayers()) do
        if plr ~= LocalPlayer and plr.Character and plr.Character:FindFirstChild("HumanoidRootPart") then
            local hrp = plr.Character.HumanoidRootPart
            local hum = plr.Character:FindFirstChild("Humanoid")
            if hum and hum.Health > 0
                and (hrp.Position - ArenaCenter).Magnitude <= ArenaRadius
                and PlayerHasTool(plr) then
                table.insert(enemies, plr)
            end
        end
    end
    return enemies
end

-- Returns the closest valid enemy
local function GetClosestEnemy()
    local closestPlayer = nil
    local closestDist = math.huge

    for _, plr in ipairs(GetEnemiesInArena()) do
        local theirRoot = plr.Character:FindFirstChild("HumanoidRootPart")
        local theirHum  = plr.Character:FindFirstChild("Humanoid")
        if theirRoot and theirHum and theirHum.Health > 0 then
            local dist = (theirRoot.Position - RootPart.Position).Magnitude
            if dist < closestDist then
                closestDist = dist
                closestPlayer = plr
            end
        end
    end
    return closestPlayer
end

-- === AUTO-ATTACK WITH TOOL (RenderStepped) ===
RunService.RenderStepped:Connect(function()
    if not BotEnabled then return end

    for _, plr in ipairs(Players:GetPlayers()) do
        if plr == LocalPlayer then continue end
        local char = plr.Character
        if not char or not char:FindFirstChild("Humanoid") or char.Humanoid.Health <= 0 then continue end

        local theirRoot = char.HumanoidRootPart
        if LocalPlayer:DistanceFromCharacter(theirRoot.Position) > ToolAttackRadius then continue end
        if not PlayerHasTool(LocalPlayer) then continue end

        local tool = LocalPlayer.Character:FindFirstChildOfClass("Tool")
        if tool and tool:FindFirstChild("Handle") then
            tool:Activate()  -- Swing/activate the tool
            for _, part in ipairs(char:GetChildren()) do
                if part:IsA("BasePart") then
                    firetouchinterest(tool.Handle, part, 0)
                    firetouchinterest(tool.Handle, part, 1)
                end
            end
        end
    end
end)

-- === GUI (Simple draggable settings window) ===
local screenGui = Instance.new("ScreenGui", CoreGui)
screenGui.Name = "AurexPVPBotGUI"
screenGui.ResetOnSpawn = false

local mainFrame = Instance.new("Frame", screenGui)
mainFrame.Size = UDim2.new(0, 320, 0, 220)
mainFrame.Position = UDim2.new(0.5, -160, 0.4, -110)
mainFrame.BackgroundColor3 = Color3.fromRGB(30, 30, 30)
mainFrame.ClipsDescendants = true
Instance.new("UICorner", mainFrame).CornerRadius = UDim.new(0, 12)

-- Title bar
local titleBar = Instance.new("Frame", mainFrame)
titleBar.Size = UDim2.new(1, 0, 0, 35)
titleBar.BackgroundColor3 = Color3.fromRGB(40, 40, 40)

local titleLabel = Instance.new("TextLabel", titleBar)
titleLabel.Size = UDim2.new(0.75, 0, 1, 0)
titleLabel.Position = UDim2.new(0, 10, 0, 0)
titleLabel.BackgroundTransparency = 1
titleLabel.Text = "PvP Bot Settings"
titleLabel.TextColor3 = Color3.new(1, 1, 1)
titleLabel.Font = Enum.Font.GothamBold
titleLabel.TextScaled = true
titleLabel.TextXAlignment = Enum.TextXAlignment.Left

local minimizeBtn = Instance.new("TextButton", titleBar)
minimizeBtn.Size = UDim2.new(0.25, 0, 1, 0)
minimizeBtn.Position = UDim2.new(0.75, 0, 0, 0)
minimizeBtn.BackgroundColor3 = Color3.fromRGB(60, 60, 60)
minimizeBtn.Text = "−"
minimizeBtn.TextColor3 = Color3.new(1, 1, 1)
minimizeBtn.Font = Enum.Font.GothamBold
minimizeBtn.TextScaled = true

-- Toggle button (visible when minimized)
local openBtn = Instance.new("TextButton", screenGui)
openBtn.Size = UDim2.new(0, 60, 0, 60)
openBtn.Position = UDim2.new(0, 20, 0, 20)
openBtn.BackgroundColor3 = Color3.fromRGB(35, 35, 35)
openBtn.Text = "PvP"
openBtn.TextColor3 = Color3.new(1, 1, 1)
openBtn.Font = Enum.Font.GothamBold
openBtn.TextScaled = true
openBtn.Visible = false

-- PvP Bot Toggle Button
local toggleBtn = Instance.new("TextButton", mainFrame)
toggleBtn.Size = UDim2.new(0.9, 0, 0, 40)
toggleBtn.Position = UDim2.new(0.05, 0, 0.2, 0)
toggleBtn.BackgroundColor3 = Color3.fromRGB(70, 70, 70)
toggleBtn.TextColor3 = Color3.new(1, 1, 1)
toggleBtn.Text = "PvP Bot: OFF"
toggleBtn.Font = Enum.Font.GothamBold
toggleBtn.TextScaled = true
Instance.new("UICorner", toggleBtn).CornerRadius = UDim.new(0, 8)

toggleBtn.MouseButton1Click:Connect(function()
    BotEnabled = not BotEnabled
    toggleBtn.Text = BotEnabled and "PvP Bot: ON" or "PvP Bot: OFF"
end)

-- WalkSpeed setting
local wsLabel = Instance.new("TextLabel", mainFrame)
wsLabel.Size = UDim2.new(0.4, 0, 0, 25)
wsLabel.Position = UDim2.new(0.05, 0, 0.5, 0)
wsLabel.BackgroundTransparency = 1
wsLabel.Text = "WalkSpeed:"
wsLabel.TextColor3 = Color3.new(1, 1, 1)
wsLabel.TextXAlignment = Enum.TextXAlignment.Left
wsLabel.Font = Enum.Font.Gotham
wsLabel.TextScaled = true

local wsBox = Instance.new("TextBox", mainFrame)
wsBox.Size = UDim2.new(0.5, 0, 0, 25)
wsBox.Position = UDim2.new(0.45, 0, 0.5, 0)
wsBox.BackgroundColor3 = Color3.fromRGB(70, 70, 70)
wsBox.TextColor3 = Color3.new(1, 1, 1)
wsBox.PlaceholderText = tostring(WalkSpeed)
wsBox.ClearTextOnFocus = false
wsBox.TextScaled = true

wsBox.FocusLost:Connect(function()
    local num = tonumber(wsBox.Text)
    if num then
        WalkSpeed = num
        Humanoid.WalkSpeed = num
    end
end)

-- JumpPower setting
local jpLabel = Instance.new("TextLabel", mainFrame)
jpLabel.Size = UDim2.new(0.4, 0, 0, 25)
jpLabel.Position = UDim2.new(0.05, 0, 0.65, 0)
jpLabel.BackgroundTransparency = 1
jpLabel.Text = "JumpPower:"
jpLabel.TextColor3 = Color3.new(1, 1, 1)
jpLabel.TextXAlignment = Enum.TextXAlignment.Left
jpLabel.Font = Enum.Font.Gotham
jpLabel.TextScaled = true

local jpBox = Instance.new("TextBox", mainFrame)
jpBox.Size = UDim2.new(0.5, 0, 0, 25)
jpBox.Position = UDim2.new(0.45, 0, 0.65, 0)
jpBox.BackgroundColor3 = Color3.fromRGB(70, 70, 70)
jpBox.TextColor3 = Color3.new(1, 1, 1)
jpBox.PlaceholderText = tostring(JumpPower)
jpBox.ClearTextOnFocus = false
jpBox.TextScaled = true

jpBox.FocusLost:Connect(function()
    local num = tonumber(jpBox.Text)
    if num then
        JumpPower = num
        Humanoid.JumpPower = num
    end
end)

-- Minimize / Restore logic
minimizeBtn.MouseButton1Click:Connect(function()
    mainFrame.Visible = false
    openBtn.Visible = true
end)

openBtn.MouseButton1Click:Connect(function()
    mainFrame.Visible = true
    openBtn.Visible = false
end)

-- Draggable window
local dragging = false
local dragInput, mouseStart, frameStart

titleBar.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 then
        dragging = true
        mouseStart = input.Position
        frameStart = mainFrame.Position

        input.Changed:Connect(function()
            if input.UserInputState == Enum.UserInputState.End then
                dragging = false
            end
        end)
    end
end)

titleBar.InputChanged:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseMovement then
        dragInput = input
    end
end)

UserInputService.InputChanged:Connect(function(input)
    if input == dragInput and dragging then
        local delta = input.Position - mouseStart
        mainFrame.Position = UDim2.new(
            frameStart.X.Scale,
            frameStart.X.Offset + delta.X,
            frameStart.Y.Scale,
            frameStart.Y.Offset + delta.Y
        )
    end
end)

-- === MAIN BOT LOGIC (Heartbeat) ===
RunService.Heartbeat:Connect(function()
    if not BotEnabled then return end
    if not IsInsideArena() then return end

    local target = GetClosestEnemy()

    if target then
        IdleWanderMode = false
        local targetRoot = target.Character.HumanoidRootPart

        if (targetRoot.Position - RootPart.Position).Magnitude > AttackRange then
            -- Walk straight to them if too far
            MoveTo(targetRoot.Position)
        else
            -- Circle around them while staying very close
            local offset = Vector3.new(math.sin(tick() * 2) * 2, 0, math.cos(tick() * 2) * 2)
            MoveTo(targetRoot.Position + offset)
        end

        -- Random jumps for evasion / style
        if math.random(1, 40) == 1 then
            Humanoid.Jump = true
        end
    else
        -- No target found
        if not IdleWanderMode then
            IdleWanderMode = true
            NextWanderTime = tick() + math.random(5, 10)
            MoveTo(GetRandomPointInRing())
        elseif tick() < NextWanderTime then
            -- Occasionally stop or change direction while waiting
            if math.random() < WanderChancePerFrame then
                Humanoid:MoveTo(RootPart.Position)  -- briefly stop
            end
            if math.random() < 0.02 then
                MoveTo(GetRandomPointInRing())
            end
        else
            -- Return to center after idle timeout
            IdleWanderMode = false
            MoveTo(ArenaCenter)
        end
    end
end)

-- Watermark (original script had this)
local watermark = Instance.new("TextLabel", CoreGui)
watermark.Size = UDim2.new(0, 300, 0, 30)
watermark.Position = UDim2.new(0.5, -150, 0, 10)
watermark.BackgroundTransparency = 0.5
watermark.BackgroundColor3 = Color3.fromRGB(20, 20, 20)
watermark.Text = "I hate black guys so muchh"
watermark.TextColor3 = Color3.new(1, 1, 1)
watermark.Font = Enum.Font.GothamBold
watermark.TextScaled = true
watermark.TextStrokeTransparency = 0

Features & Information

• Just a lame sword fight bot which kind of works and it's better to act fair instead of using reach and end up getting banned • This Follower Games Works well and gives you followers. Best way to earn follower is to make a private server which actually cost no robux and just kill your alt account.
#follower#swordfightbot

Community Comments (4)

Bloxx3rpwnerrealBloxx3rpwnerrealDec 9, 2025

PLS MAKE THIS UNIVERSAL

Replying to @Bloxx3rpwnerreal
1kzuya1kzuyaDec 12, 2025

@imsomeguyidkman99 dude this is open source you can do it by yourself or uh the chatgpt.

jeffrey_epsteinjeffrey_epsteinJan 18, 2026(edited)

*

ScripterNoScripterNoMay 7, 2026

It isn't letting me join