--[[ Azan fov aimbot hub this script made by Azan - Dark red draggable hub, mobile friendly - Draggable "A" button (tap to open/close the hub, drag to move it) - Silent Aimbot (redirects your shots) with a very strict wall check - Hit part toggles: Head, Torso, Right Arm, Left Arm, Right Leg, Left Leg - Auto Shoot toggle (no delay: fires every frame while a gun is held and a target is inside the FOV circle, no camera movement) + status line showing what it is doing - ESP Tracers toggle (orange = inmates, blue = cops, red = criminals) - Smoothness slider 0-150 (camera glide when YOU shoot; 0 = camera never moves) - Toggles: Silent Aimbot, Auto Shoot, Tracers, Team Check, Wall Check, FOV Check, Ignore Cops, Ignore Inmates, Ignore Criminals, 6 hit parts - FOV size slider (default 1000), red FOV circle shown whenever Silent Aimbot is on - Settings and hub survive death / respawn / team change - Only runs in Prison Life and Life in Prison (kicks you with "game not supported" anywhere else) - Shows a notification on load and shows any error instead of failing silently - Re-executing cleans up the previous copy first ]] --// ========== CONFIG ========== local CONFIG = { -- CHANGE YOUR KEYBINDS HERE ----------------------------------------- HubKey = Enum.KeyCode.RightShift, -- show/hide the hub (PC) SilentKey = Enum.KeyCode.Q, -- turn Silent Aimbot on/off (PC) AutoShootKey = Enum.KeyCode.V, -- turn Auto Shoot on/off (PC) -- -------------------------------------------------------------------- DefaultFOV = 1000, -- FOV size (radius in pixels) DefaultSmoothness = 100, -- 0 = camera never moves, 1 = instant snap, 150 = slowest glide CircleColor = Color3.fromRGB(255, 0, 0), -- red FOV outline -- Wall check strictness: any part you can see (Transparency below this number) or any -- solid part blocks the target. Raise it toward 1 to be even stricter, lower it to ignore -- more see-through parts (like glass). WallTransparencyLimit = 0.95, -- Body part names for each Hit toggle (R6 and R15 names; the first one found is used) HitParts = { Head = { "Head" }, Torso = { "UpperTorso", "Torso", "HumanoidRootPart" }, RightArm = { "RightUpperArm", "Right Arm", "RightHand" }, LeftArm = { "LeftUpperArm", "Left Arm", "LeftHand" }, RightLeg = { "RightUpperLeg", "Right Leg", "RightFoot" }, LeftLeg = { "LeftUpperLeg", "Left Leg", "LeftFoot" }, }, -- Tracer colors by team TracerColors = { Inmates = Color3.fromRGB(255, 140, 0), -- orange Cops = Color3.fromRGB(0, 120, 255), -- blue Criminals = Color3.fromRGB(255, 0, 0), -- red Other = Color3.fromRGB(255, 255, 255), -- any team that isn't one of the three }, TracerThickness = 1.5, -- Auto Shoot settings AutoShootDelay = 0, -- seconds between auto shots (0 = no delay, fires every frame) FireMethod = "All", -- "All" = the game's shoot remote + tool:Activate() together -- "Remote" = only the game's shoot remote -- "Tool" = only tool:Activate() -- "Mouse" = only an executor mouse click -- "Everything" = remote + tool + mouse click -- Team name keywords for the Ignore toggles and tracer colors -- (lowercase, matched against the team's name). -- If a game uses different team names, add them here. TeamKeywords = { Cops = { "guard", "cop", "police", "officer" }, Inmates = { "inmate", "prisoner" }, Criminals = { "criminal" }, }, -- Game restriction: the script only runs in the games listed below. -- In any other game the player is kicked with KickMessage. -- Set RestrictToGames = false to let it run anywhere (no kick). RestrictToGames = true, KickMessage = "game not supported", AllowedGames = { [155615604] = "Prison Life", [72659788689464] = "Life in Prison", }, } --// ========== SERVICES ========== local Players = game:GetService("Players") local UIS = game:GetService("UserInputService") local RunService = game:GetService("RunService") local Workspace = game:GetService("Workspace") local StarterGui = game:GetService("StarterGui") local ReplicatedStorage = game:GetService("ReplicatedStorage") local LocalPlayer = Players.LocalPlayer local Mouse = LocalPlayer:GetMouse() local function notify(text) pcall(function() StarterGui:SetCore("SendNotification", { Title = "Azan fov aimbot hub", Text = string.sub(tostring(text), 1, 200), Duration = 8, }) end) end -- Tells you right away that the script started, and which game IDs it sees notify("Loading... (Place " .. tostring(game.PlaceId) .. " / Game " .. tostring(game.GameId) .. ")") --// ========== MAIN (wrapped so any error is shown instead of failing silently) ========== local function main() --// ========== GAME CHECK (runs first, kicks if the game isn't supported) ========== -- Checks both the Place ID and the Game (universe) ID against the list local gameName = CONFIG.AllowedGames[game.PlaceId] or CONFIG.AllowedGames[game.GameId] if CONFIG.RestrictToGames and not gameName then warn("[Azan fov aimbot hub] " .. CONFIG.KickMessage .. " (Place " .. tostring(game.PlaceId) .. " / Game " .. tostring(game.GameId) .. ")") pcall(function() LocalPlayer:Kick(CONFIG.KickMessage) end) return end --// ========== CLEANUP IF EXECUTED TWICE ========== local env = (getgenv and getgenv()) or _G local CLEANUP_KEY = "__AzanFovAimbotHubCleanup" if type(env[CLEANUP_KEY]) == "function" then pcall(env[CLEANUP_KEY]) env[CLEANUP_KEY] = nil end --// ========== EXECUTOR CHECKS (missing features turn off only that feature) ========== local hasDrawing = false pcall(function() hasDrawing = type(Drawing.new) == "function" end) local canHook = (hookmetamethod ~= nil) and (getnamecallmethod ~= nil) and (checkcaller ~= nil) and (newcclosure ~= nil) if not hasDrawing then warn("[Azan fov aimbot hub] No Drawing support: the FOV circle and tracers are disabled.") notify("No Drawing support: FOV circle and tracers are disabled.") end if not canHook then warn("[Azan fov aimbot hub] No hookmetamethod support: Silent Aimbot can't redirect shots.") notify("No hook support: Silent Aimbot can't redirect shots.") end local connections = {} local function track(conn) table.insert(connections, conn) return conn end --// ========== STATE (kept outside the script so death can't reset it) ========== local DEFAULTS = { SilentAim = false, AutoShoot = false, Tracers = false, TeamCheck = true, WallCheck = true, FOVCheck = true, IgnoreCops = false, IgnoreInmates = false, IgnoreCriminals = false, HitHead = true, -- only Head is on by default HitTorso = false, HitRightArm = false, HitLeftArm = false, HitRightLeg = false, HitLeftLeg = false, FOV = CONFIG.DefaultFOV, Smoothness = CONFIG.DefaultSmoothness, } env.__AzanSilentSettings = env.__AzanSilentSettings or {} local state = env.__AzanSilentSettings for key, value in pairs(DEFAULTS) do if state[key] == nil then state[key] = value -- fills in any setting that doesn't exist yet end end state.Smoothness = math.clamp(state.Smoothness, 0, 150) -- slider range is 0-150 -- The six Hit toggles: which body part group, which state key, and the hub label local HIT_TOGGLES = { { group = "Head", key = "HitHead", label = "Hit Head" }, { group = "Torso", key = "HitTorso", label = "Hit Torso" }, { group = "RightArm", key = "HitRightArm", label = "Hit Right Arm" }, { group = "LeftArm", key = "HitLeftArm", label = "Hit Left Arm" }, { group = "RightLeg", key = "HitRightLeg", label = "Hit Right Leg" }, { group = "LeftLeg", key = "HitLeftLeg", label = "Hit Left Leg" }, } local function anyHitPartEnabled() for _, info in ipairs(HIT_TOGGLES) do if state[info.key] then return true end end return false end --// ========== HELPERS ========== local function create(class, props, children) local inst = Instance.new(class) for key, value in pairs(props) do inst[key] = value end for _, child in ipairs(children or {}) do child.Parent = inst end return inst end local function getGuiParent() if gethui then local ok, ui = pcall(gethui) if ok and ui then return ui end end local ok = pcall(function() return game:GetService("CoreGui"):GetChildren() end) if ok then return game:GetService("CoreGui") end return LocalPlayer:WaitForChild("PlayerGui") end local function isAlive(character) local hum = character and character:FindFirstChildOfClass("Humanoid") return hum ~= nil and hum.Health > 0 end -- Returns "Cops", "Inmates", "Criminals", or nil based on the player's team name local function getTeamGroup(player) local team = player.Team if not team then return nil end local name = string.lower(team.Name) for group, keywords in pairs(CONFIG.TeamKeywords) do for _, keyword in ipairs(keywords) do if string.find(name, keyword, 1, true) then return group end end end return nil end -- Returns the body parts of a character for every Hit toggle that is ON local function getHitParts(character) local parts = {} for _, info in ipairs(HIT_TOGGLES) do if state[info.key] then for _, name in ipairs(CONFIG.HitParts[info.group]) do local part = character:FindFirstChild(name) if part and part:IsA("BasePart") then table.insert(parts, part) break -- first name found for this body part end end end end return parts end local COLORS = { Window = Color3.fromRGB(38, 8, 8), -- dark red background Title = Color3.fromRGB(78, 12, 12), -- title bar Element = Color3.fromRGB(70, 14, 14), -- rows Accent = Color3.fromRGB(190, 25, 25), -- slider fill / buttons On = Color3.fromRGB(190, 25, 25), Off = Color3.fromRGB(45, 45, 45), Text = Color3.fromRGB(240, 230, 230), SubText = Color3.fromRGB(200, 150, 150), } --// ========== FOV CIRCLE ========== local circle local function makeCircle() if not hasDrawing then return { Remove = function() end } -- harmless stand-in when Drawing isn't supported end local c = Drawing.new("Circle") c.Thickness = 2 c.NumSides = 100 c.Filled = false c.Transparency = 1 c.Color = CONFIG.CircleColor c.Radius = state.FOV c.Visible = false return c end circle = makeCircle() --// ========== GUI ========== local screenGui = create("ScreenGui", { Name = "AzanFovAimbotHub", ResetOnSpawn = false, ZIndexBehavior = Enum.ZIndexBehavior.Sibling, }) pcall(function() if syn and syn.protect_gui then syn.protect_gui(screenGui) end end) screenGui.Parent = getGuiParent() local window = create("Frame", { Name = "Window", Size = UDim2.fromOffset(290, 360), Position = UDim2.new(0.5, -145, 0.5, -180), BackgroundColor3 = COLORS.Window, BorderSizePixel = 0, Parent = screenGui, }, { create("UICorner", { CornerRadius = UDim.new(0, 10) }), create("UIStroke", { Color = COLORS.Accent, Thickness = 1.5 }), }) -- Title bar (drag the hub by holding this) local titleBar = create("Frame", { Size = UDim2.new(1, 0, 0, 34), BackgroundColor3 = COLORS.Title, BorderSizePixel = 0, Parent = window, }, { create("UICorner", { CornerRadius = UDim.new(0, 10) }), }) create("TextLabel", { Size = UDim2.new(1, -44, 1, 0), Position = UDim2.fromOffset(12, 0), BackgroundTransparency = 1, Text = "Azan fov aimbot hub", TextColor3 = COLORS.Text, Font = Enum.Font.GothamBold, TextSize = 15, TextXAlignment = Enum.TextXAlignment.Left, Parent = titleBar, }) local closeButton = create("TextButton", { Size = UDim2.fromOffset(28, 28), Position = UDim2.new(1, -32, 0, 3), BackgroundTransparency = 1, Text = "X", TextColor3 = COLORS.Text, Font = Enum.Font.GothamBold, TextSize = 15, Parent = titleBar, }) create("TextLabel", { Size = UDim2.new(1, -24, 0, 18), Position = UDim2.fromOffset(12, 36), BackgroundTransparency = 1, Text = "this script made by Azan", TextColor3 = COLORS.SubText, Font = Enum.Font.Gotham, TextSize = 12, TextXAlignment = Enum.TextXAlignment.Left, Parent = window, }) local content = create("ScrollingFrame", { Size = UDim2.new(1, -20, 1, -64), Position = UDim2.fromOffset(10, 58), BackgroundTransparency = 1, BorderSizePixel = 0, ScrollBarThickness = 3, ScrollBarImageColor3 = COLORS.Accent, CanvasSize = UDim2.new(), AutomaticCanvasSize = Enum.AutomaticSize.Y, Parent = window, }, { create("UIListLayout", { Padding = UDim.new(0, 6), SortOrder = Enum.SortOrder.LayoutOrder, }), }) -- Floating button to show/hide the hub (drag to move, tap to toggle) local floatButton = create("TextButton", { Name = "FloatToggle", Size = UDim2.fromOffset(42, 42), Position = UDim2.new(0, 10, 0.5, -21), BackgroundColor3 = COLORS.Accent, Text = "A", TextColor3 = Color3.new(1, 1, 1), Font = Enum.Font.GothamBlack, TextSize = 20, AutoButtonColor = false, Parent = screenGui, }, { create("UICorner", { CornerRadius = UDim.new(1, 0) }), }) --// ========== TOGGLE / LABEL BUILDERS ========== local layoutCounter = 0 local function nextOrder() layoutCounter += 1 return layoutCounter end -- Small section heading in the hub list local function createLabel(text) return create("TextLabel", { Size = UDim2.new(1, -6, 0, 20), BackgroundTransparency = 1, Text = text, TextColor3 = COLORS.SubText, Font = Enum.Font.GothamBold, TextSize = 12, TextXAlignment = Enum.TextXAlignment.Left, LayoutOrder = nextOrder(), Parent = content, }) end local function createToggle(text, initial, onChange) local row = create("Frame", { Size = UDim2.new(1, -6, 0, 36), BackgroundColor3 = COLORS.Element, BorderSizePixel = 0, LayoutOrder = nextOrder(), Parent = content, }, { create("UICorner", { CornerRadius = UDim.new(0, 6) }), }) create("TextLabel", { Size = UDim2.new(1, -80, 1, 0), Position = UDim2.fromOffset(10, 0), BackgroundTransparency = 1, Text = text, TextColor3 = COLORS.Text, Font = Enum.Font.Gotham, TextSize = 14, TextXAlignment = Enum.TextXAlignment.Left, Parent = row, }) local switch = create("TextButton", { Size = UDim2.fromOffset(58, 24), Position = UDim2.new(1, -66, 0.5, -12), Text = "", TextColor3 = Color3.new(1, 1, 1), Font = Enum.Font.GothamBold, TextSize = 12, AutoButtonColor = false, Parent = row, }, { create("UICorner", { CornerRadius = UDim.new(0, 6) }), }) local value = initial local function set(newValue) value = newValue switch.Text = value and "ON" or "OFF" switch.BackgroundColor3 = value and COLORS.On or COLORS.Off onChange(value) end track(switch.MouseButton1Click:Connect(function() set(not value) end)) set(initial) return set end --// ========== SLIDER BUILDER ========== local function createSlider(labelText, min, max, initial, onChange) local holder = create("Frame", { Size = UDim2.new(1, -6, 0, 54), BackgroundColor3 = COLORS.Element, BorderSizePixel = 0, LayoutOrder = nextOrder(), Parent = content, }, { create("UICorner", { CornerRadius = UDim.new(0, 6) }), }) local label = create("TextLabel", { Size = UDim2.new(1, -20, 0, 22), Position = UDim2.fromOffset(10, 4), BackgroundTransparency = 1, TextColor3 = COLORS.Text, Font = Enum.Font.Gotham, TextSize = 13, TextXAlignment = Enum.TextXAlignment.Left, Parent = holder, }) local trackBar = create("TextButton", { Size = UDim2.new(1, -28, 0, 8), Position = UDim2.fromOffset(14, 36), BackgroundColor3 = Color3.fromRGB(25, 5, 5), AutoButtonColor = false, Text = "", Parent = holder, }, { create("UICorner", { CornerRadius = UDim.new(1, 0) }), }) local fill = create("Frame", { Size = UDim2.fromScale(0, 1), BackgroundColor3 = COLORS.Accent, BorderSizePixel = 0, Parent = trackBar, }, { create("UICorner", { CornerRadius = UDim.new(1, 0) }), }) local knob = create("Frame", { Size = UDim2.fromOffset(18, 18), BackgroundColor3 = Color3.new(1, 1, 1), BorderSizePixel = 0, Parent = trackBar, }, { create("UICorner", { CornerRadius = UDim.new(1, 0) }), }) local function setValue(value) value = math.clamp(math.floor(value + 0.5), min, max) local alpha = (value - min) / (max - min) fill.Size = UDim2.fromScale(alpha, 1) knob.Position = UDim2.new(alpha, -9, 0.5, -9) label.Text = string.format("%s: %d", labelText, value) onChange(value) end local dragging = false local function updateFromX(x) local alpha = math.clamp( (x - trackBar.AbsolutePosition.X) / trackBar.AbsoluteSize.X, 0, 1 ) setValue(min + alpha * (max - min)) end track(trackBar.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true content.ScrollingEnabled = false -- stop the list scrolling while sliding updateFromX(input.Position.X) end end)) track(UIS.InputChanged:Connect(function(input) if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then updateFromX(input.Position.X) end end)) track(UIS.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = false content.ScrollingEnabled = true end end)) setValue(initial) return setValue end --// ========== STATUS LINE (shows what Auto Shoot is doing) ========== local hooksOk = false -- set to true further down once the Silent Aimbot hooks are installed local statusLabel = create("TextLabel", { Size = UDim2.new(1, -6, 0, 20), BackgroundTransparency = 1, Text = "Status: idle", TextColor3 = COLORS.SubText, Font = Enum.Font.Gotham, TextSize = 12, TextXAlignment = Enum.TextXAlignment.Left, LayoutOrder = nextOrder(), Parent = content, }) local lastStatus = "" local function setStatus(text) text = (hooksOk and "" or "NO HOOK: ") .. text if text ~= lastStatus then -- only touch the label when the text changes lastStatus = text statusLabel.Text = "Status: " .. text end end --// ========== HUB CONTROLS ========== local setSilent = createToggle("Silent Aimbot", state.SilentAim, function(v) state.SilentAim = v end) -- Auto Shoot ON = fires your equipped gun by itself the moment a target is inside the FOV circle -- (no delay, no camera movement) local setAutoShoot = createToggle("Auto Shoot", state.AutoShoot, function(v) state.AutoShoot = v end) -- Tracers ON = lines from the bottom of the screen to every player, colored by team createToggle("Tracers", state.Tracers, function(v) state.Tracers = v end) createToggle("Team Check", state.TeamCheck, function(v) state.TeamCheck = v end) -- Wall Check ON = players behind anything solid or visible are never targeted (very strict) createToggle("Wall Check", state.WallCheck, function(v) state.WallCheck = v end) -- FOV Check ON = only targets players inside the circle -- FOV Check OFF = targets anyone on screen (the circle still shows) createToggle("FOV Check", state.FOVCheck, function(v) state.FOVCheck = v end) -- Ignore toggles: when ON, players on that team are never targeted createToggle("Ignore Cops", state.IgnoreCops, function(v) state.IgnoreCops = v end) createToggle("Ignore Inmates", state.IgnoreInmates, function(v) state.IgnoreInmates = v end) createToggle("Ignore Criminals", state.IgnoreCriminals, function(v) state.IgnoreCriminals = v end) -- Hit part toggles: choose where your shots land. -- With several ON, the one closest to the center of the circle is used. createLabel("HIT PARTS") for _, info in ipairs(HIT_TOGGLES) do createToggle(info.label, state[info.key], function(v) state[info.key] = v end) end createSlider("FOV Size", 50, 1500, state.FOV, function(v) state.FOV = v end) -- Smoothness: camera glide when YOU shoot. 0 = camera never moves, 1 = instant snap, 150 = slowest createSlider("Smoothness", 0, 150, state.Smoothness, function(v) state.Smoothness = v end) --// ========== DRAGGING THE HUB (mouse + touch) ========== do local dragging, dragStart, startPos = false, nil, nil track(titleBar.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true dragStart = input.Position startPos = window.Position end end)) track(UIS.InputChanged:Connect(function(input) if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then local delta = input.Position - dragStart window.Position = UDim2.new( startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y ) end end)) track(UIS.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = false end end)) end --// ========== SHOW / HIDE ========== local function toggleHub() window.Visible = not window.Visible end -- Makes any button draggable (touch or mouse). A quick tap still counts as a click. local function makeDraggable(guiObject, onTap) local dragging, moved = false, false local dragInput, dragStart, startAbs track(guiObject.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then dragging, moved = true, false dragInput = input dragStart = input.Position startAbs = guiObject.AbsolutePosition end end)) track(UIS.InputChanged:Connect(function(input) if not dragging then return end if input ~= dragInput and input.UserInputType ~= Enum.UserInputType.MouseMovement then return end local delta = input.Position - dragStart if delta.Magnitude > 8 then moved = true -- past 8 pixels counts as a drag, not a tap end if not moved then return end -- Keep the button fully on screen local screenSize = screenGui.AbsoluteSize local size = guiObject.AbsoluteSize local x = math.clamp(startAbs.X + delta.X, 0, screenSize.X - size.X) local y = math.clamp(startAbs.Y + delta.Y, 0, screenSize.Y - size.Y) guiObject.Position = UDim2.fromOffset(x, y) end)) track(UIS.InputEnded:Connect(function(input) if not dragging then return end if input == dragInput or input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = false if not moved and onTap then onTap() end end end)) end makeDraggable(floatButton, toggleHub) track(closeButton.MouseButton1Click:Connect(function() window.Visible = false end)) track(UIS.InputBegan:Connect(function(input, gameProcessed) if gameProcessed then return end -- ignore while typing in chat if input.KeyCode == CONFIG.HubKey then toggleHub() elseif input.KeyCode == CONFIG.SilentKey then setSilent(not state.SilentAim) elseif input.KeyCode == CONFIG.AutoShootKey then setAutoShoot(not state.AutoShoot) end end)) --// ========== WALL CHECK (very strict) ========== local rayParams = RaycastParams.new() rayParams.FilterType = Enum.RaycastFilterType.Exclude rayParams.IgnoreWater = true -- Returns true if something blocks the line from `origin` to `targetPos`. -- ANY solid part (CanCollide) or any part you can see (Transparency below the limit) blocks it. -- Only invisible, non-solid parts (triggers, zones) are skipped. local function rayBlocked(origin, targetPos, ignore) local direction = targetPos - origin for _ = 1, 15 do rayParams.FilterDescendantsInstances = ignore local hit = Workspace:Raycast(origin, direction, rayParams) if not hit then return false -- clear line end local inst = hit.Instance if inst.CanCollide or inst.Transparency < CONFIG.WallTransparencyLimit then return true -- a wall is in the way end table.insert(ignore, inst) -- invisible and non-solid: skip it and keep checking end return true -- too many things in the way, treat it as blocked end -- A target counts as visible only if the line is clear from BOTH your camera -- and your own character's head (so peeking past corners or a clipped camera can't fool it). -- Player characters never count as walls. local function isVisible(camera, part, baseIgnore) local ignore = table.clone(baseIgnore) if rayBlocked(camera.CFrame.Position, part.Position, ignore) then return false end local myCharacter = LocalPlayer.Character local myHead = myCharacter and (myCharacter:FindFirstChild("Head") or myCharacter:FindFirstChild("HumanoidRootPart")) if myHead and rayBlocked(myHead.Position, part.Position, ignore) then return false end return true end --// ========== TARGETING ========== local function isIgnored(player) -- Team Check: skip your own teammates if state.TeamCheck and player.Team ~= nil and player.Team == LocalPlayer.Team then return true end -- Ignore Cops / Inmates / Criminals toggles local group = getTeamGroup(player) if group == "Cops" and state.IgnoreCops then return true end if group == "Inmates" and state.IgnoreInmates then return true end if group == "Criminals" and state.IgnoreCriminals then return true end return false end -- Finds the enabled body part (across all players) that is closest to the center of the circle local function getClosestTarget(camera, center, baseIgnore) local best = nil local bestDist = state.FOVCheck and state.FOV or math.huge for _, player in ipairs(Players:GetPlayers()) do if player ~= LocalPlayer then local character = player.Character if character and isAlive(character) and not isIgnored(player) then for _, part in ipairs(getHitParts(character)) do local screenPos, onScreen = camera:WorldToViewportPoint(part.Position) if onScreen then local dist = (Vector2.new(screenPos.X, screenPos.Y) - center).Magnitude -- the wall check only runs when this part would actually be the new best if dist < bestDist and (not state.WallCheck or isVisible(camera, part, baseIgnore)) then best, bestDist = part, dist end end end end end end return best end --// ========== FIRING (Auto Shoot + manual shot detection) ========== local lastFire = 0 -- last time YOU fired your gun yourself local lastAuto = 0 -- last time Auto Shoot fired -- Notes when you fire your equipped weapon yourself, so the camera glide knows you're shooting. -- Shots caused by Auto Shoot are ignored so Auto Shoot never moves the camera. local watchedTools = setmetatable({}, { __mode = "k" }) local function watchTool(tool) if tool:IsA("Tool") and not watchedTools[tool] then watchedTools[tool] = true track(tool.Activated:Connect(function() if os.clock() - lastAuto > 0.15 then lastFire = os.clock() end end)) end end local function watchCharacter(character) for _, child in ipairs(character:GetChildren()) do watchTool(child) end track(character.ChildAdded:Connect(watchTool)) end if LocalPlayer.Character then watchCharacter(LocalPlayer.Character) end track(LocalPlayer.CharacterAdded:Connect(watchCharacter)) local function getEquippedTool() local character = LocalPlayer.Character return character and character:FindFirstChildOfClass("Tool") end -- Fires the game's own shoot remote straight at the target (Prison Life uses "ShootEvent"). -- Returns true if a remote was found and fired. local function fireRemote(tool, target) local shootEvent = ReplicatedStorage:FindFirstChild("ShootEvent") if not (shootEvent and shootEvent:IsA("RemoteEvent")) then return false end local camera = Workspace.CurrentCamera local handle = tool:FindFirstChild("Handle") local origin = (handle and handle:IsA("BasePart") and handle.Position) or camera.CFrame.Position local offset = target.Position - origin local hit = { RayObject = Ray.new(origin, offset.Unit * 1000), Distance = offset.Magnitude, Cframe = CFrame.new(target.Position), Hit = target, } shootEvent:FireServer({ hit }, tool) return true end -- Fires the equipped gun at the target using every method FireMethod allows. -- Returns a text list of the methods that were used (shown in the status line). local function fireWeapon(tool, target) local method = CONFIG.FireMethod local used = {} if method == "All" or method == "Everything" or method == "Remote" then local ok, sent = pcall(fireRemote, tool, target) if ok and sent then table.insert(used, "remote") end end if method == "All" or method == "Everything" or method == "Tool" then pcall(function() tool:Activate() end) table.insert(used, "tool") end if method == "Mouse" or method == "Everything" then -- The click is skipped while the hub is open so it can't press hub buttons if mouse1click and not window.Visible then task.spawn(function() pcall(mouse1click) end) table.insert(used, "mouse") end end if #used == 0 then return "nothing (check FireMethod / close the hub)" end return table.concat(used, " + ") end --// ========== SILENT AIMBOT HOOKS ========== -- The hooks are installed once per server and read env.__AzanSilentGetTarget. -- When the script is re-executed or cleaned up, that function is swapped/removed, -- so old hooks simply pass everything through instead of stacking up. -- Each hook is installed inside pcall, so a failing hook can't stop the script from loading. local currentTarget = nil -- best target this frame (updated by the loop below) env.__AzanSilentGetTarget = function() if state.SilentAim then return currentTarget end return nil end if canHook then -- Redirect raycasts that the game uses for shooting local namecallOk = true if env.__AzanHookNamecall ~= game.JobId then namecallOk = pcall(function() local oldNamecall oldNamecall = hookmetamethod(game, "__namecall", newcclosure(function(self, ...) local getTarget = env.__AzanSilentGetTarget if getTarget and self == Workspace and not checkcaller() then local method = getnamecallmethod() local target = getTarget() if target then if method == "Raycast" then local args = table.pack(...) local origin, direction = args[1], args[2] if typeof(origin) == "Vector3" and typeof(direction) == "Vector3" then args[2] = (target.Position - origin).Unit * direction.Magnitude return oldNamecall(self, table.unpack(args, 1, args.n)) end elseif method == "FindPartOnRay" or method == "FindPartOnRayWithIgnoreList" or method == "FindPartOnRayWithWhitelist" then local args = table.pack(...) local ray = args[1] if typeof(ray) == "Ray" then args[1] = Ray.new( ray.Origin, (target.Position - ray.Origin).Unit * ray.Direction.Magnitude ) return oldNamecall(self, table.unpack(args, 1, args.n)) end end end end return oldNamecall(self, ...) end)) end) if namecallOk then env.__AzanHookNamecall = game.JobId end end -- Redirect Mouse.Hit / Mouse.Target for games that shoot toward the mouse local indexOk = true if env.__AzanHookIndex ~= game.JobId then indexOk = pcall(function() local oldIndex oldIndex = hookmetamethod(game, "__index", newcclosure(function(self, key) local getTarget = env.__AzanSilentGetTarget if getTarget and self == Mouse and not checkcaller() then if key == "Hit" or key == "Target" then local target = getTarget() if target then if key == "Hit" then return CFrame.new(target.Position) end return target end end end return oldIndex(self, key) end)) end) if indexOk then env.__AzanHookIndex = game.JobId end end hooksOk = namecallOk or indexOk if not hooksOk then warn("[Azan fov aimbot hub] The Silent Aimbot hooks failed to install.") notify("Silent Aimbot hooks failed to install (executor limitation).") end end --// ========== MAIN LOOP ========== track(RunService.RenderStepped:Connect(function(dt) local camera = Workspace.CurrentCamera if not camera then currentTarget = nil return end -- The circle is shown whenever Silent Aimbot is on local center = camera.ViewportSize / 2 circle.Position = center circle.Radius = state.FOV circle.Visible = state.SilentAim if not state.SilentAim then currentTarget = nil setStatus("turn on Silent Aimbot") return end if not anyHitPartEnabled() then currentTarget = nil setStatus("turn on at least one hit part") return end -- Characters to ignore for the wall check (rebuilt every frame so respawns are covered) local baseIgnore = {} for _, player in ipairs(Players:GetPlayers()) do if player.Character then table.insert(baseIgnore, player.Character) end end currentTarget = getClosestTarget(camera, center, baseIgnore) if not currentTarget then setStatus("no target in the circle") return end local now = os.clock() -- Is the target inside the FOV circle? (checked even when FOV Check is off) local screenPos = camera:WorldToViewportPoint(currentTarget.Position) local inCircle = (Vector2.new(screenPos.X, screenPos.Y) - center).Magnitude <= state.FOV -- Auto Shoot: the moment a gun is held and a target is inside the circle, it fires -- (no delay with AutoShootDelay = 0, and no camera movement) if not state.AutoShoot then setStatus("target found (Auto Shoot is off)") elseif not inCircle then setStatus("target is outside the circle") else local tool = getEquippedTool() if not tool then setStatus("equip a gun to auto shoot") elseif now - lastAuto >= CONFIG.AutoShootDelay then lastAuto = now setStatus("firing via " .. fireWeapon(tool, currentTarget)) end end -- Smoothness: when YOU shoot, the camera glides toward the target. -- 0 = camera never moves, 1 = instant snap, 150 = slowest glide. Frame-rate independent. if state.Smoothness > 0 and now - lastFire < 0.3 then local step = math.clamp(1 / state.Smoothness, 0, 1) local alpha = 1 - (1 - step) ^ (dt * 60) local goal = CFrame.new(camera.CFrame.Position, currentTarget.Position) camera.CFrame = camera.CFrame:Lerp(goal, alpha) end end)) --// ========== ESP TRACERS ========== -- One line per player, from the bottom center of the screen to the player. -- Color depends on the player's team: orange = inmates, blue = cops, red = criminals. local tracers = {} local function removeTracer(player) local line = tracers[player] if line then pcall(function() line:Remove() end) tracers[player] = nil end end local function getTracer(player) local line = tracers[player] if not line then if hasDrawing then line = Drawing.new("Line") line.Thickness = CONFIG.TracerThickness line.Transparency = 1 line.Visible = false else line = { Remove = function() end } -- harmless stand-in when Drawing isn't supported end tracers[player] = line end return line end local function getTracerColor(player) local group = getTeamGroup(player) return (group and CONFIG.TracerColors[group]) or CONFIG.TracerColors.Other end track(Players.PlayerRemoving:Connect(removeTracer)) track(RunService.RenderStepped:Connect(function() local camera = Workspace.CurrentCamera -- Tracers off (or no camera): hide everything if not camera or not state.Tracers then for _, line in pairs(tracers) do line.Visible = false end return end local viewport = camera.ViewportSize local origin = Vector2.new(viewport.X / 2, viewport.Y) for _, player in ipairs(Players:GetPlayers()) do if player ~= LocalPlayer then local line = getTracer(player) local character = player.Character local root = character and character:FindFirstChild("HumanoidRootPart") if root and isAlive(character) then local pos = camera:WorldToViewportPoint(root.Position) if pos.Z > 0 then -- in front of the camera (off-screen sides still draw) line.From = origin line.To = Vector2.new(pos.X, pos.Y) line.Color = getTracerColor(player) line.Visible = true else line.Visible = false end else line.Visible = false end end end end)) --// ========== WATCHDOG (keeps everything alive through death / respawn) ========== track(RunService.Heartbeat:Connect(function() -- Re-attach the hub if the game removed it if screenGui and not screenGui.Parent then pcall(function() screenGui.Parent = getGuiParent() end) end end)) track(LocalPlayer.CharacterAdded:Connect(function() task.wait(0.5) if screenGui and not screenGui.Parent then pcall(function() screenGui.Parent = getGuiParent() end) end -- Recreate the circle in case the executor dropped it local ok = pcall(function() return circle.Radius end) if not ok then circle = makeCircle() end end)) --// ========== CLEANUP FUNCTION ========== env[CLEANUP_KEY] = function() env.__AzanSilentGetTarget = nil -- hooks now pass everything through for _, conn in ipairs(connections) do pcall(function() conn:Disconnect() end) end table.clear(connections) pcall(function() circle:Remove() end) for player in pairs(tracers) do removeTracer(player) end if screenGui then screenGui:Destroy() end end notify("Loaded" .. (gameName and (" for " .. gameName) or "") .. ". this script made by Azan") end -- end of main() local ok, err = xpcall(main, function(e) return tostring(e) end) if not ok then warn("[Azan fov aimbot hub] ERROR: " .. tostring(err)) notify("Script error: " .. tostring(err)) end