Anti AFK
Key RequiredUniversal

Anti AFK

Universal Scriptmain_vopmain_vop 1.1K views 425 executesUpdated Feb 19, 2026
5.0/ 5(1 votes)
10100% Positive
Lua Script•251 lines (5995 chars)
local Players = game:GetService("Players")
local Lighting = game:GetService("Lighting")
local RunService = game:GetService("RunService")
local VirtualUser = game:GetService("VirtualUser")
local UIS = game:GetService("UserInputService")

local player = Players.LocalPlayer
local camera = workspace.CurrentCamera

local gui = Instance.new("ScreenGui")
gui.ResetOnSpawn = false
gui.IgnoreGuiInset = true
gui.Parent = player:WaitForChild("PlayerGui")

local black = Instance.new("Frame")
black.Parent = gui
black.Size = UDim2.fromScale(1,1)
black.BackgroundColor3 = Color3.fromRGB(0,0,0)
black.ZIndex = 5
black.Visible = false

local btn = Instance.new("TextButton")
btn.Parent = gui
btn.Size = UDim2.fromOffset(140,36)
btn.AnchorPoint = Vector2.new(1,0)
btn.BackgroundColor3 = Color3.fromRGB(25,25,25)
btn.TextColor3 = Color3.fromRGB(255,255,255)
btn.TextScaled = true
btn.Font = Enum.Font.SourceSansBold
btn.Text = "Anti AFK"
btn.ZIndex = 6

task.wait()
btn.Position = UDim2.fromOffset(gui.AbsoluteSize.X - 20, 60)

local blur = Instance.new("BlurEffect")
blur.Size = 0
blur.Parent = Lighting

local removedColorMaps = {}
local storedParts = {}
local disabledLights = {}
local disabledFX = {}

local function removeShaders()
	for _,v in ipairs(Lighting:GetChildren()) do
		if v:IsA("BloomEffect") or v:IsA("SunRaysEffect") or v:IsA("DepthOfFieldEffect") then
			v.Enabled = false
		elseif v:IsA("ColorCorrectionEffect") then
			table.insert(removedColorMaps, v:Clone())
			v:Destroy()
		end
	end
end

local function restoreShaders()
	for _,v in ipairs(Lighting:GetChildren()) do
		if v:IsA("BloomEffect") or v:IsA("SunRaysEffect") or v:IsA("DepthOfFieldEffect") then
			v.Enabled = true
		end
	end
	for _,cc in ipairs(removedColorMaps) do
		cc.Parent = Lighting
	end
	removedColorMaps = {}
end

local function toggleLights(on)
	for _,v in ipairs(workspace:GetDescendants()) do
		if v:IsA("PointLight") or v:IsA("SpotLight") or v:IsA("SurfaceLight") then
			if on then
				if v.Enabled then
					disabledLights[v] = true
					v.Enabled = false
				end
			else
				if disabledLights[v] then
					v.Enabled = true
				end
			end
		end
	end
	if not on then disabledLights = {} end
end

local function toggleFX(on)
	for _,v in ipairs(workspace:GetDescendants()) do
		if v:IsA("ParticleEmitter") or v:IsA("Trail") then
			if on then
				if v.Enabled then
					disabledFX[v] = true
					v.Enabled = false
				end
			else
				if disabledFX[v] then
					v.Enabled = true
				end
			end
		end
	end
	if not on then disabledFX = {} end
end

local function potatoWorld(on)
	for _, obj in ipairs(workspace:GetDescendants()) do
		if obj:IsA("BasePart") then
			if on then
				storedParts[obj] = {obj.Material, obj.CastShadow}
				obj.Material = Enum.Material.Plastic
				obj.CastShadow = false
			else
				if storedParts[obj] then
					obj.Material = storedParts[obj][1]
					obj.CastShadow = storedParts[obj][2]
				end
			end
		elseif obj:IsA("Texture") or obj:IsA("Decal") or obj:IsA("SurfaceAppearance") then
			obj.Transparency = on and 1 or 0
		end
	end
	if not on then storedParts = {} end
end

local afk = false
local freezeConn
local camConn
local oldWalk
local oldJump
local oldMinZoom
local oldMaxZoom
local oldCamType
local lockedCFrame

local function freezeChar(on)
	local char = player.Character
	if not char then return end
	local hum = char:FindFirstChildOfClass("Humanoid")
	local root = char:FindFirstChild("HumanoidRootPart")
	if not hum or not root then return end

	if on then
		oldWalk = hum.WalkSpeed
		oldJump = hum.JumpPower
		oldMinZoom = player.CameraMinZoomDistance
		oldMaxZoom = player.CameraMaxZoomDistance
		oldCamType = camera.CameraType
		lockedCFrame = camera.CFrame

		hum.WalkSpeed = 0
		hum.JumpPower = 0
		root.Anchored = true

		player.CameraMinZoomDistance = 10
		player.CameraMaxZoomDistance = 10
		camera.CameraType = Enum.CameraType.Scriptable

		camConn = RunService.RenderStepped:Connect(function()
			camera.CFrame = lockedCFrame
		end)
	else
		hum.WalkSpeed = oldWalk or 16
		hum.JumpPower = oldJump or 50
		root.Anchored = false

		player.CameraMinZoomDistance = oldMinZoom or 0.5
		player.CameraMaxZoomDistance = oldMaxZoom or 400

		if camConn then camConn:Disconnect() end
		camera.CameraType = oldCamType or Enum.CameraType.Custom
	end
end

local dragging = false
local dragStart
local startPos
local activeInput

btn.InputBegan:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
		dragging = true
		activeInput = input
		dragStart = input.Position
		startPos = btn.Position
	end
end)

UIS.InputEnded:Connect(function(input)
	if input == activeInput then
		dragging = false
		activeInput = nil
	end
end)

UIS.InputChanged:Connect(function(input)
	if dragging and input == activeInput then
		local delta = input.Position - dragStart
		local newX = startPos.X.Offset + delta.X
		local newY = startPos.Y.Offset + delta.Y

		local screen = gui.AbsoluteSize
		local size = btn.AbsoluteSize

		newX = math.clamp(newX, size.X, screen.X)
		newY = math.clamp(newY, 0, screen.Y - size.Y)

		btn.Position = UDim2.fromOffset(newX, newY)
	end
end)

btn.MouseButton1Click:Connect(function()
	afk = not afk

	if afk then
		btn.Text = "Back"
		black.Visible = true
		blur.Size = 24
		removeShaders()
		potatoWorld(true)
		toggleLights(true)
		toggleFX(true)
		freezeChar(true)
		freezeConn = RunService.RenderStepped:Connect(function()
			RunService:Set3dRenderingEnabled(false)
		end)
	else
		btn.Text = "Anti AFK"
		black.Visible = false
		blur.Size = 0
		restoreShaders()
		potatoWorld(false)
		toggleLights(false)
		toggleFX(false)
		if freezeConn then freezeConn:Disconnect() end
		RunService:Set3dRenderingEnabled(true)
		freezeChar(false)
	end
end)

player.CharacterAdded:Connect(function()
	if afk then
		task.wait(1)
		freezeChar(true)
	end
end)

player.Idled:Connect(function()
	if afk then
		VirtualUser:CaptureController()
		VirtualUser:ClickButton2(Vector2.new())
	end
end)

Features & Information

This LocalScript adds an AFK Mode button and That: Can Move Toggle Around Prevents Roblox AFK kick Freezes character and camera Turns off 3D rendering for cooling Removes post effects and lights Adds optional black screen for power saving Reverts everything when AFK is turned off Good for mobile players who want to AFK without overheating or lag spikes.

Community Comments (2)

Raffle_wRaffle_wFeb 19, 2026

COOL

Replying to @Raffle_w
main_vopmain_vopFeb 19, 2026

@Raffle_w thanks

More Scripts for Universal Scripts