Extorius Swordfighting AI v4 REMAKE
Key RequiredUniversal

Extorius Swordfighting AI v4 REMAKE

Universal ScriptHosterOnCrackHosterOnCrack 5.9K views 123 executesUpdated Jun 22, 2025
5.0/ 5(2 votes)
20100% Positive
Lua Script•432 lines (12503 chars)
--[[

EXTORIUS SWORD FIGHTING AI V4

CREDITS: Noxu - Lead Dev of Extorius, Creator

Optimal performance, no effort needed.

]]

local Rayfield = loadstring(game:HttpGet('https://sirius.menu/rayfield'))()

local Window = Rayfield:CreateWindow({
	Name = "Swordfighting AI v4 REMAKE | Original by Noxu, remake by script_A.",
	Icon = 0,
	LoadingTitle = "Swordfighting AI V4 REMAKE",
	LoadingSubtitle = "by Script_A",
	ShowText = "Rayfield",
	Theme = "Default",

	ToggleUIKeybind = "K",

	DisableRayfieldPrompts = false,
	DisableBuildWarnings = false,

	ConfigurationSaving = {
		Enabled = true,
		FolderName = nil,
		FileName = "stuff"
	},

	Discord = {
		Enabled = false,
		Invite = "noinvitelink",
		RememberJoins = true
	},

	KeySystem = false,
	KeySettings = {
		Title = "Untitled",
		Subtitle = "Key System",
		Note = "No method of obtaining the key is provided",
		FileName = "Key",
		SaveKey = true,
		GrabKeyFromSite = false,
		Key = {"Hello"}
	}
})

local Tab = Window:CreateTab("Configurations", 534533607)

local players = game.Players
local player = players.LocalPlayer

local char = player.Character or player.CharacterAdded:Wait()
local humanoid = char:FindFirstChildOfClass("Humanoid")
local root = char:FindFirstChild("HumanoidRootPart")

local enabled = true

local autoMove = Tab:CreateToggle({
	Name = "Auto-Move",
	CurrentValue = true,
	Flag = "Auto Movement",
	Callback = function(Value)
		enabled = not enabled
	end,
})

local aimUsesOffset = false

local aimUseOffset = Tab:CreateToggle({
	Name = "Aim uses Offset (Broken)",
	CurrentValue = false,
	Flag = "Aim use Offset",
	Callback = function(Value)
		aimUsesOffset = not aimUsesOffset
	end,
})

local autoEquip = true

local autoEq = Tab:CreateToggle({
	Name = "Auto-Equip",
	CurrentValue = true,
	Flag = "Auto-Equip",
	Callback = function(Value)
		autoEquip = not autoEquip
	end,
})

repeat
	wait()
	humanoid = char:FindFirstChildOfClass("Humanoid")
	root = char:FindFirstChild("HumanoidRootPart")
until humanoid and root

local runService = game:GetService("RunService")
local RS = game:GetService("ReplicatedStorage")
local UIS = game:GetService("UserInputService")

local strafe = 1
local strafeTime = 0
local lastStrafe = 0

local strafeOffset = Tab:CreateSlider({
	Name = "Strafe Amount",
	Range = {0, 10},
	Increment = 1,
	Suffix = "BotStrafe",
	CurrentValue = 1,
	Flag = "StrafeAmount", -- A flag is the identifier for the configuration file, make sure every element has a different flag if you're using configuration saving to ensure no overlaps
	Callback = function(Value)
		strafe = Value
	end,
})

local turnStrafeOffset = 1

local turnStrafe = Tab:CreateSlider({
	Name = "Turn Strafe",
	Range = {0, 10},
	Increment = 1,
	Suffix = "StrafeTurnAmount",
	CurrentValue = 1,
	Flag = "Turning Strafe Amount", -- A flag is the identifier for the configuration file, make sure every element has a different flag if you're using configuration saving to ensure no overlaps
	Callback = function(Value)
		turnStrafeOffset = Value
	end,
})

local aimOffset = 4

local aimOff = Tab:CreateSlider({
	Name = "Aim Offset",
	Range = {-10, 10},
	Increment = 1,
	Suffix = "Offset",
	CurrentValue = 1,
	Flag = "Aim Offset", -- A flag is the identifier for the configuration file, make sure every element has a different flag if you're using configuration saving to ensure no overlaps
	Callback = function(Value)
		aimOffset = Value
	end,
})

local lungeDistance = 20

local lungeDistanceSlider = Tab:CreateSlider({
	Name = "Distance",
	Range = {0, 100},
	Increment = 1,
	Suffix = "Distance",
	CurrentValue = 20,
	Flag = "Lunge Distance", -- A flag is the identifier for the configuration file, make sure every element has a different flag if you're using configuration saving to ensure no overlaps
	Callback = function(Value)
		lungeDistance = Value
	end,
})

local detectionDist = math.huge

local function getnearesttarget()
	local target, detD = nil, detectionDist
	for i, v in pairs(workspace:GetDescendants()) do
		if v:IsA("Model") and v ~= char then
			local h = v:FindFirstChildOfClass("Humanoid")
			local r = v:FindFirstChild("HumanoidRootPart")
			if h and r and h.Health > 0 then
				local d = (r.Position - root.Position).Magnitude
				if d < detD then
					detD = d
					target = v
				end
			end
		end
	end
	return target
end

local function findBest(tool, part, offset)
	if not tool or not tool:FindFirstChild("Handle") or not part then return end

	local handle = tool.Handle
	local r = tool:FindFirstAncestorOfClass("Model"):FindFirstChild("HumanoidRootPart")
	if not r then return end

	local swordTipPos = (handle.CFrame * CFrame.new(0, 0, -4)).Position
	local origin = swordTipPos
	local offsets = {
		Vector3.new(0, 0, 0),
		Vector3.new(0.15, 0, 0),
		Vector3.new(0.3, 0, 0),
		Vector3.new(-0.15, 0, 0),
		Vector3.new(-0.3, 0, 0)
	}

	local bestPos, bestDist = nil, math.huge
	local bestIndex = nil
	local rayParams = RaycastParams.new()
	rayParams.FilterType = Enum.RaycastFilterType.Blacklist
	rayParams.FilterDescendantsInstances = {tool.Parent}

	local rayResults = {}

	for i, offset in ipairs(offsets) do
		local targetOffsetPos = part.Position + offset
		local direction = (targetOffsetPos - origin).Unit
		local castDir = direction * 100
		local result = workspace:Raycast(origin, castDir, rayParams)

		local visualLength = result and (result.Position - origin).Magnitude or 100
		local midpoint = origin + direction * visualLength / 2

		table.insert(rayResults, {
			result = result,
			direction = direction,
			visualLength = visualLength,
			midpoint = midpoint,
			index = i
		})

		if result then
			local dist = (result.Position - origin).Magnitude
			if dist < bestDist then
				bestDist = dist
				bestPos = result.Position
				bestIndex = i
			end
		end
	end

	--[[for i, ray in ipairs(rayResults) do
		local rayPart = Instance.new("Part")
		rayPart.Anchored = true
		rayPart.CanCollide = false
		rayPart.Size = Vector3.new(0.1, 0.1, ray.visualLength)
		rayPart.CFrame = CFrame.new(ray.midpoint, ray.midpoint + ray.direction)
		rayPart.Material = Enum.Material.Neon
		rayPart.Name = "DebugRay"
		rayPart.Parent = workspace

		if ray.result then
			if i == bestIndex then
				rayPart.Color = Color3.fromRGB(0, 255, 0)
			else
				rayPart.Color = Color3.fromRGB(255, 0, 0)
			end
		else
			rayPart.Color = Color3.fromRGB(100, 100, 100)
		end

		game:GetService("Debris"):AddItem(rayPart, 0.1)
	end]] --this is a debug

	if not aimUsesOffset then
		if bestPos then
			local flatDir = (bestPos - swordTipPos).Unit * Vector3.new(1, 0, 1)
			--bodyGyro.CFrame = CFrame.new(root.Position, root.Position + flatDir) * CFrame.Angles(0,math.rad(offset or 0),0)
			return CFrame.new(root.Position, root.Position + flatDir) * CFrame.Angles(0,math.rad(offset or 0),0)
		else
			local fallbackDir = (part.Position - swordTipPos).Unit * Vector3.new(1, 0, 1)
			--bodyGyro.CFrame = CFrame.new(root.Position, root.Position + fallbackDir) * CFrame.Angles(0,math.rad(offset or 0),0)
			return CFrame.new(root.Position, root.Position + fallbackDir) * CFrame.Angles(0,math.rad(offset or 0),0)
		end
	else
		local preDir = ((r.CFrame * CFrame.new(aimOffset,0,0)).Position - root.Position).Unit * Vector3.new(1,0,1)
		return CFrame.new(root.Position, root.Position + preDir) * CFrame.Angles(0,math.rad(offset or 0),0)
	end
end


delay(0,function()
	local bodyGyro = Instance.new("BodyGyro")
	bodyGyro.MaxTorque = Vector3.new(4,4,4) * 10000000
	bodyGyro.P = 100000
	bodyGyro.D = 1
	bodyGyro.Parent = RS

	local jStInd = 0
	local jsDir = "LeftRight"
	
	local dirChosen = false

	local timer1 = 0
	local timer2 = 0
	local timer3 = 0
	local timer4 = 0

	local lowHealthLunge = 0
	
	local random1N = 80000
	
	runService.RenderStepped:Connect(function()
		if enabled then
			local target = getnearesttarget()
			if not target then bodyGyro.Parent = RS return end
			local h, r = target:FindFirstChildOfClass("Humanoid"), target:FindFirstChild("HumanoidRootPart")
			if not h and not r then bodyGyro.Parent = RS return end
			local targetPart = --[[target:FindFirstChild("Right Arm") or target:FindFirstChild("RightHand")]] r
			bodyGyro.Parent = root
			humanoid.AutoRotate = false
			local dir = ((r.CFrame * CFrame.new(aimOffset,0,0).Position) - root.Position).Unit * Vector3.new(1,0,1)
			local dist = (r.Position - root.Position).Magnitude
			local tool = char:FindFirstChildOfClass("Tool")
			local enemyTool = target:FindFirstChildOfClass("Tool")
			
			local bestCFrame = findBest(tool, targetPart, turnStrafeOffset + (turnStrafeOffset * math.random(1,random1N)) / 5000)
			local c360 = findBest(tool, targetPart, 360)
			
			if autoEquip then
				if not char:FindFirstChildOfClass("Tool") then if player.Backpack:FindFirstChildOfClass("Tool") then wait(.3)humanoid:EquipTool(player.Backpack:FindFirstChildOfClass("Tool")) end end
			end

			--local varedRandom = math.random(1,2)
			local strafeVect3 = Vector3.new(math.random(-strafe,strafe),0,math.random(-strafe,strafe)) * 10

			if math.random(1,20) > 5 then
				if r.Velocity.Magnitude > 0.1 and h.MoveDirection.Magnitude > 0.1 then
					if dist < 27 + math.random() then
						if tick() - lastStrafe > math.random(1,100) / 550 then
							lastStrafe = tick()
							humanoid:MoveTo(r.Position + r.Velocity * 0.25 + (r.Position - root.Position).Unit:Cross(Vector3.new(0,1,0)) + (strafeVect3/25))
						end
					else
						humanoid:MoveTo(r.Position + r.Velocity * 0.25 + (r.Position - root.Position).Unit:Cross(Vector3.new(0,1,0)))
					end
				else
					humanoid:MoveTo(r.Position + r.Velocity * 0.25 + (r.Position - root.Position).Unit:Cross(Vector3.new(0,1,0)) + (strafeVect3/10))
				end
				if bestCFrame then
					random1N = 80000
					bodyGyro.CFrame = bestCFrame
				else
					random1N = 80000
					bodyGyro.CFrame = CFrame.new(root.Position, root.Position + dir)
				end
			else
				if math.random(1,2) == 1 then
					if tick() - timer1 > 0.1 then
						timer1 = tick()
						humanoid:MoveTo(root.Position + root.CFrame.LookVector * -5 + strafeVect3)
						if bestCFrame then
							random1N = 5000000
							bodyGyro.CFrame = bestCFrame
						else
							random1N = 80000
							bodyGyro.CFrame = CFrame.new(root.Position, root.Position + dir)
						end
					end
				else
					if tick() - timer1 > 0.08 then
						timer1 = tick()
						humanoid:MoveTo(root.Position + root.CFrame.LookVector * -5 + (strafeVect3/10))
						if c360 then
							random1N = 80000
							bodyGyro.CFrame = c360
						else
							random1N = 80000
							bodyGyro.CFrame = CFrame.new(root.Position, root.Position + dir) * CFrame.Angles(0,math.rad(360),0)
						end
					end
				end
			end

			if target:FindFirstChildOfClass("ForceField") or humanoid.Health / humanoid.MaxHealth < 0.68 then
				if dist < 15 then
					if target:FindFirstChildOfClass("ForceField") then
						humanoid:MoveTo(r.Position - (r.Position - root.Position).Unit * 15)
					else
						if math.random(1,25) then
							if tick() - lowHealthLunge > 0.7 then
								lowHealthLunge = tick()
								humanoid:MoveTo(r.Position + r.Velocity * 0.25 + (r.Position - root.Position).Unit:Cross(Vector3.new(0,1,0)))
							end
						end
					end
				end
			end

			if math.random(1,45) == 1 then
				humanoid.Jump = true
			end

			if enemyTool and r.CFrame.LookVector.Unit:Dot((root.Position - r.Position).Unit) > 0.6 then
				enemyTool.Activated:Connect(function()
					if dist < 18 then
						if tick() - timer2 > math.random(1,15) / 100 then
							timer2 = tick()
							humanoid:MoveTo(root.Position + root.CFrame.LookVector * -4)
							humanoid.Jump = true
						end
						humanoid:MoveTo(r.Position + r.Velocity * 0.25 + (r.Position - root.Position).Unit:Cross(Vector3.new(0,1,0)) + (strafeVect3/25))
						tool:Activate()
					end
				end)
			end

			if dist < lungeDistance or math.random(1,20) == 1 then
				if tool then
					tool:Activate()
				end
			end
		else
			bodyGyro.Parent = RS
			humanoid.AutoRotate = true
		end
	end)
end)

local function respawn()
	char = game.Players.LocalPlayer.Character or game.Players.LocalPlayer.CharacterAdded:Wait()
	humanoid = char:WaitForChild("Humanoid")
	root = char:WaitForChild("HumanoidRootPart")

	humanoid.Died:Connect(function()
		game.Players.LocalPlayer.CharacterAdded:Wait()
		respawn()
	end)
end

player.CharacterAdded:Connect(function()
	respawn()
end)

--UIS.InputBegan:Connect(function(key)
--	if key.KeyCode == Enum.KeyCode.R then
--		local focused = UIS:GetFocusedTextBox()
--		if not focused then
--			enabled = not enabled
--		end
--	end
--end)

Features & Information

Rough remake of the original Extorius Swordfighting Bot. Not too good but will get you kills, especially with a lower ping. FEATURES: Strafing, movement and aiming. Dodging Etc. RECOMMENDED ON STRONG EXECUTORS, FIND ONES WITH FAIRLY GOOD sUNC ON voxlis.net

Community Comments (2)

notpronotproSep 24, 2025

ts is * i just get killed

HosterOnCrackHosterOnCrackApr 12, 2026

I AM NO LONGER WORKING ON THIS. THE OFFICIAL GITHUB HAS BEEN PRIVATED.

More Scripts for Universal Scripts