--[[
Dev Hub — Complete Edition
Aimbot | ESP | Hitbox | Recursive Gun Giver | Admin Panel | Stats
]]
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local Workspace = game:GetService("Workspace")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local TweenService = game:GetService("TweenService")
local CoreGui = game:GetService("CoreGui")
local LocalPlayer = Players.LocalPlayer
local Camera = Workspace:FindFirstChild("CustomCamera")
if not Camera or not Camera:IsA("Camera") then
Camera = Workspace.CurrentCamera
end
--// SETTINGS
local Settings = {
AimEnabled = true,
AimKey = Enum.UserInputType.MouseButton2,
FOV = 150,
Smoothness = 1.0,
YOffset = 1.5,
VisCheck = false,
TeamCheck = false,
AutoSwitch = true,
OverrideCam = false,
ESPEnabled = true,
ESPBoxes = true,
ESPTracers = true,
ESPInfo = true,
ESPDrawFOV = true,
ESPMaxDist = 5000,
HitboxEnabled = false,
HitboxSize = 10,
HitboxTransparency = 0.6,
Notifications = true,
}
--// STATE
local CurrentTarget = nil
local HoldingAim = false
local ESPTable = {}
local ScriptActive = true
local ListeningForKey = false
local UI = {}
--// REMOTES (discovered from game)
local Remotes = {
CheckAdmin = ReplicatedStorage:FindFirstChild("CheckAdminPermission"),
GetPerms = ReplicatedStorage:FindFirstChild("GetPlayerPermissions"),
PermEdit = ReplicatedStorage:FindFirstChild("PermEditorEvent"),
ExploitBan = ReplicatedStorage:FindFirstChild("ExploitBan"),
Teleport = ReplicatedStorage:FindFirstChild("TeleportPlayer"),
AimPos = ReplicatedStorage:FindFirstChild("UpdateAimPositionEvent"),
AdminSkin = ReplicatedStorage:FindFirstChild("AdminSkinManager"),
AdminEvent = ReplicatedStorage:FindFirstChild("AdminEvent"),
NPCRemote = ReplicatedStorage:FindFirstChild("NPCRemoteEvent"),
LoadMap = ReplicatedStorage:FindFirstChild("LoadCurrentMap"),
Spectate = ReplicatedStorage:FindFirstChild("SpectateEvent"),
Badge = ReplicatedStorage:FindFirstChild("BadgeNotification"),
}
--// DRAWING
local FOVDraw = Drawing.new("Circle")
FOVDraw.Thickness = 1
FOVDraw.NumSides = 64
FOVDraw.Filled = false
FOVDraw.ZIndex = 1
FOVDraw.Transparency = 1
FOVDraw.Color = Color3.fromRGB(255, 255, 255)
local TargetDraw = Drawing.new("Circle")
TargetDraw.Thickness = 2.5
TargetDraw.NumSides = 32
TargetDraw.Filled = false
TargetDraw.ZIndex = 5
TargetDraw.Color = Color3.fromRGB(255, 50, 50)
--// FUNCTIONS
local function Notify(text)
if not Settings.Notifications then return end
local gui = Instance.new("ScreenGui")
gui.Name = "DevNotify"
gui.ResetOnSpawn = false
local ok = pcall(function() gui.Parent = CoreGui end)
if not ok then gui.Parent = LocalPlayer:WaitForChild("PlayerGui") end
local frame = Instance.new("TextLabel", gui)
frame.Size = UDim2.new(0, 360, 0, 34)
frame.Position = UDim2.new(0.5, -180, 0, -50)
frame.BackgroundColor3 = Color3.fromRGB(20, 20, 20)
frame.BorderSizePixel = 0
frame.Text = text
frame.TextColor3 = Color3.new(1, 1, 1)
frame.Font = Enum.Font.SourceSansSemibold
frame.TextSize = 15
Instance.new("UICorner", frame).CornerRadius = UDim.new(0, 6)
TweenService:Create(frame, TweenInfo.new(0.3), {Position = UDim2.new(0.5, -180, 0, 20)}):Play()
task.delay(2.5, function()
TweenService:Create(frame, TweenInfo.new(0.3), {Position = UDim2.new(0.5, -180, 0, -50)}):Play()
task.wait(0.35)
gui:Destroy()
end)
end
local function IsAlive(char)
if not char then return false end
local hum = char:FindFirstChildOfClass("Humanoid")
return hum and hum.Health > 0
end
local function GetAimPart(char)
return char:FindFirstChild("HumanoidRootPart") or char.PrimaryPart
end
local function GetAimPosition(part)
return part.Position + Vector3.new(0, Settings.YOffset, 0)
end
local function GetHealth(char)
local hum = char:FindFirstChildOfClass("Humanoid")
if hum then
return math.floor(hum.Health), math.floor(hum.MaxHealth)
end
return 0, 100
end
local function IsVisible(character, worldPos)
if not Settings.VisCheck then return true end
local origin = Camera.CFrame.Position
local direction = worldPos - origin
local rayParams = RaycastParams.new()
rayParams.FilterDescendantsInstances = {LocalPlayer.Character, Camera}
rayParams.FilterType = Enum.RaycastFilterType.Blacklist
local result = Workspace:Raycast(origin, direction, rayParams)
if result and result.Instance then
return result.Instance:IsDescendantOf(character)
end
return true
end
local function IsTargetValid(player)
if player == LocalPlayer then return false end
if Settings.TeamCheck and player.Team == LocalPlayer.Team then return false end
return true
end
--// ESP SYSTEM
local function GetESP(player)
if not ESPTable[player] then
local box = Drawing.new("Square")
box.Thickness = 1
box.Filled = false
box.Visible = false
local tracer = Drawing.new("Line")
tracer.Thickness = 1
tracer.Visible = false
local info = Drawing.new("Text")
info.Size = 13
info.Center = true
info.Outline = true
info.Font = 2
info.Visible = false
ESPTable[player] = {Box = box, Tracer = tracer, Info = info}
end
return ESPTable[player]
end
local function RemoveESP(player)
local data = ESPTable[player]
if data then
data.Box:Remove()
data.Tracer:Remove()
data.Info:Remove()
ESPTable[player] = nil
end
end
--// CLOSEST TARGET
local function GetClosestPlayer()
local screenCenter = Camera.ViewportSize / 2
local closest = nil
local closestDist = math.huge
for _, player in ipairs(Players:GetPlayers()) do
if not IsTargetValid(player) then continue end
local char = player.Character
local part = char and GetAimPart(char)
if not part or not IsAlive(char) then continue end
local aimPos = GetAimPosition(part)
local pos, onScreen = Camera:WorldToViewportPoint(aimPos)
if not onScreen then continue end
local screenDist = (Vector2.new(pos.X, pos.Y) - screenCenter).Magnitude
if screenDist > Settings.FOV then continue end
if not IsVisible(char, aimPos) then continue end
local dist3D = (part.Position - Camera.CFrame.Position).Magnitude
if dist3D < closestDist then
closestDist = dist3D
closest = {
Player = player,
Part = part,
Position = pos,
Distance = dist3D,
Notified = false,
}
end
end
return closest
end
--// UI BUILDER
local function BuildUI()
local screen = Instance.new("ScreenGui")
screen.Name = "DevHubUI"
screen.ResetOnSpawn = false
screen.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
local ok = pcall(function() screen.Parent = CoreGui end)
if not ok then screen.Parent = LocalPlayer:WaitForChild("PlayerGui") end
local main = Instance.new("Frame", screen)
main.Name = "Main"
main.Size = UDim2.new(0, 540, 0, 400)
main.Position = UDim2.new(0.5, -270, 0.5, -200)
main.BackgroundColor3 = Color3.fromRGB(25, 25, 25)
main.BorderSizePixel = 0
main.Active = true
main.Draggable = true
Instance.new("UICorner", main).CornerRadius = UDim.new(0, 6)
local title = Instance.new("TextLabel", main)
title.Size = UDim2.new(1, 0, 0, 34)
title.BackgroundColor3 = Color3.fromRGB(18, 18, 18)
title.BorderSizePixel = 0
title.Text = " Dev Hub | Developer Testing"
title.TextColor3 = Color3.new(1, 1, 1)
title.Font = Enum.Font.SourceSansBold
title.TextSize = 18
title.TextXAlignment = Enum.TextXAlignment.Left
Instance.new("UICorner", title).CornerRadius = UDim.new(0, 6)
local sidebar = Instance.new("Frame", main)
sidebar.Position = UDim2.new(0, 6, 0, 42)
sidebar.Size = UDim2.new(0, 100, 1, -50)
sidebar.BackgroundColor3 = Color3.fromRGB(35, 35, 35)
Instance.new("UICorner", sidebar).CornerRadius = UDim.new(0, 6)
local content = Instance.new("Frame", main)
content.Position = UDim2.new(0, 112, 0, 42)
content.Size = UDim2.new(1, -120, 1, -50)
content.BackgroundColor3 = Color3.fromRGB(32, 32, 32)
Instance.new("UICorner", content).CornerRadius = UDim.new(0, 6)
local tabButtons = {}
local tabFrames = {}
local function SwitchTab(name)
for k, btn in pairs(tabButtons) do
btn.BackgroundColor3 = (k == name) and Color3.fromRGB(60, 130, 220) or Color3.fromRGB(50, 50, 50)
end
for k, frame in pairs(tabFrames) do
frame.Visible = (k == name)
end
end
local function AddTab(name, order)
local btn = Instance.new("TextButton", sidebar)
btn.Size = UDim2.new(1, -10, 0, 30)
btn.Position = UDim2.new(0, 5, 0, 5 + (order - 1) * 35)
btn.BackgroundColor3 = Color3.fromRGB(50, 50, 50)
btn.BorderSizePixel = 0
btn.Text = name
btn.TextColor3 = Color3.new(1, 1, 1)
btn.Font = Enum.Font.SourceSansSemibold
btn.TextSize = 15
Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 4)
btn.MouseButton1Click:Connect(function() SwitchTab(name) end)
tabButtons[name] = btn
local frame = Instance.new("ScrollingFrame", content)
frame.Name = name
frame.Size = UDim2.new(1, -8, 1, -8)
frame.Position = UDim2.new(0, 4, 0, 4)
frame.BackgroundTransparency = 1
frame.BorderSizePixel = 0
frame.ScrollBarThickness = 3
frame.AutomaticCanvasSize = Enum.AutomaticSize.Y
local layout = Instance.new("UIListLayout", frame)
layout.Padding = UDim.new(0, 5)
tabFrames[name] = frame
frame.Visible = false
return frame
end
local pageAim = AddTab("Aim", 1)
local pageESP = AddTab("ESP", 2)
local pageHit = AddTab("Hitbox", 3)
local pageGun = AddTab("Guns", 4)
local pageAdmin = AddTab("Admin", 5)
local pageStats = AddTab("Stats", 6)
local pageMisc = AddTab("Misc", 7)
SwitchTab("Aim")
-- Helpers
local function AddToggle(parent, text, setting, callback)
local f = Instance.new("Frame", parent)
f.Size = UDim2.new(1, 0, 0, 28)
f.BackgroundTransparency = 1
local lbl = Instance.new("TextLabel", f)
lbl.Size = UDim2.new(1, -60, 1, 0)
lbl.BackgroundTransparency = 1
lbl.Text = text
lbl.TextColor3 = Color3.fromRGB(230, 230, 230)
lbl.Font = Enum.Font.SourceSans
lbl.TextSize = 16
lbl.TextXAlignment = Enum.TextXAlignment.Left
local btn = Instance.new("TextButton", f)
btn.Size = UDim2.new(0, 52, 0, 22)
btn.Position = UDim2.new(1, -56, 0.5, -11)
btn.BackgroundColor3 = Settings[setting] and Color3.fromRGB(45, 200, 75) or Color3.fromRGB(200, 55, 55)
btn.BorderSizePixel = 0
btn.Text = Settings[setting] and "ON" or "OFF"
btn.TextColor3 = Color3.new(1, 1, 1)
btn.Font = Enum.Font.SourceSansBold
btn.TextSize = 13
Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 4)
btn.MouseButton1Click:Connect(function()
Settings[setting] = not Settings[setting]
btn.Text = Settings[setting] and "ON" or "OFF"
btn.BackgroundColor3 = Settings[setting] and Color3.fromRGB(45, 200, 75) or Color3.fromRGB(200, 55, 55)
if callback then callback(Settings[setting]) end
end)
end
local function AddSlider(parent, text, setting, min, max, inc)
local f = Instance.new("Frame", parent)
f.Size = UDim2.new(1, 0, 0, 42)
f.BackgroundTransparency = 1
local lbl = Instance.new("TextLabel", f)
lbl.Size = UDim2.new(1, 0, 0, 18)
lbl.BackgroundTransparency = 1
lbl.Text = text .. ": " .. Settings[setting]
lbl.TextColor3 = Color3.fromRGB(230, 230, 230)
lbl.Font = Enum.Font.SourceSans
lbl.TextSize = 15
lbl.TextXAlignment = Enum.TextXAlignment.Left
local track = Instance.new("Frame", f)
track.Size = UDim2.new(1, -12, 0, 8)
track.Position = UDim2.new(0, 6, 0, 26)
track.BackgroundColor3 = Color3.fromRGB(55, 55, 55)
track.BorderSizePixel = 0
Instance.new("UICorner", track).CornerRadius = UDim.new(1, 0)
track.Active = true
local fill = Instance.new("Frame", track)
local pct = (Settings[setting] - min) / (max - min)
fill.Size = UDim2.new(pct, 0, 1, 0)
fill.BackgroundColor3 = Color3.fromRGB(60, 130, 220)
fill.BorderSizePixel = 0
Instance.new("UICorner", fill).CornerRadius = UDim.new(1, 0)
local function Update(input)
local rel = math.clamp((input.Position.X - track.AbsolutePosition.X) / track.AbsoluteSize.X, 0, 1)
local val = min + (max - min) * rel
if inc then val = math.floor(val / inc + 0.5) * inc end
val = math.clamp(val, min, max)
val = tonumber(string.format("%.3f", val))
Settings[setting] = val
lbl.Text = text .. ": " .. val
local npct = (val - min) / (max - min)
fill.Size = UDim2.new(npct, 0, 1, 0)
end
track.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 then
Update(input)
end
end)
track.InputChanged:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseMovement and UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1) then
Update(input)
end
end)
end
local function AddButton(parent, text, callback)
local btn = Instance.new("TextButton", parent)
btn.Size = UDim2.new(1, 0, 0, 28)
btn.BackgroundColor3 = Color3.fromRGB(60, 130, 220)
btn.BorderSizePixel = 0
btn.Text = text
btn.TextColor3 = Color3.new(1, 1, 1)
btn.Font = Enum.Font.SourceSansSemibold
btn.TextSize = 16
Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 4)
btn.MouseButton1Click:Connect(callback)
return btn
end
local function AddLabel(parent, text)
local lbl = Instance.new("TextLabel", parent)
lbl.Size = UDim2.new(1, 0, 0, 16)
lbl.BackgroundTransparency = 1
lbl.Text = text
lbl.TextColor3 = Color3.fromRGB(180, 180, 180)
lbl.Font = Enum.Font.SourceSansItalic
lbl.TextSize = 14
lbl.TextWrapped = true
lbl.TextXAlignment = Enum.TextXAlignment.Left
end
-- AIM TAB
AddToggle(pageAim, "Enable Aim Lock", "AimEnabled", function(v) Notify("Aim: " .. tostring(v)) end)
AddSlider(pageAim, "FOV Radius", "FOV", 10, 800, 1)
AddSlider(pageAim, "Smoothness (1=Hard)", "Smoothness", 0.01, 1, 0.01)
AddSlider(pageAim, "Y-Offset", "YOffset", 0, 5, 0.1)
AddToggle(pageAim, "Visibility Check", "VisCheck")
AddToggle(pageAim, "Team Check", "TeamCheck")
AddToggle(pageAim, "Auto Switch", "AutoSwitch")
AddToggle(pageAim, "Override Camera", "OverrideCam")
local kf = Instance.new("Frame", pageAim)
kf.Size = UDim2.new(1, 0, 0, 28)
kf.BackgroundTransparency = 1
local kl = Instance.new("TextLabel", kf)
kl.Size = UDim2.new(1, -130, 1, 0)
kl.BackgroundTransparency = 1
kl.Text = "Aim Key: RightMouse"
kl.TextColor3 = Color3.fromRGB(230, 230, 230)
kl.Font = Enum.Font.SourceSans
kl.TextSize = 16
kl.TextXAlignment = Enum.TextXAlignment.Left
local kb = Instance.new("TextButton", kf)
kb.Size = UDim2.new(0, 120, 0, 24)
kb.Position = UDim2.new(1, -125, 0.5, -12)
kb.BackgroundColor3 = Color3.fromRGB(70, 70, 70)
kb.BorderSizePixel = 0
kb.Text = "Change"
kb.TextColor3 = Color3.new(1, 1, 1)
kb.Font = Enum.Font.SourceSansBold
kb.TextSize = 14
Instance.new("UICorner", kb).CornerRadius = UDim.new(0, 4)
kb.MouseButton1Click:Connect(function()
ListeningForKey = true
kb.Text = "Press key..."
kb.BackgroundColor3 = Color3.fromRGB(200, 150, 0)
end)
UI.KeyBtn = kb
UI.KeyLbl = kl
-- ESP TAB
AddToggle(pageESP, "Master ESP", "ESPEnabled")
AddToggle(pageESP, "Boxes", "ESPBoxes")
AddToggle(pageESP, "Tracers", "ESPTracers")
AddToggle(pageESP, "Player Info", "ESPInfo")
AddToggle(pageESP, "FOV Circle", "ESPDrawFOV")
AddSlider(pageESP, "Max Distance", "ESPMaxDist", 50, 5000, 10)
-- HITBOX TAB
AddToggle(pageHit, "Hitbox Expander", "HitboxEnabled", function(v) Notify("Hitbox: " .. tostring(v)) end)
AddSlider(pageHit, "Hitbox Size", "HitboxSize", 1, 30, 0.5)
AddSlider(pageHit, "Hitbox Visibility", "HitboxTransparency", 0, 1, 0.1)
-- GUN TAB — recursively scans GunModels for Tools
AddLabel(pageGun, "Recursively scanning GunModels...")
local function RecursiveFindTools(folder, path, results)
results = results or {}
for _, obj in ipairs(folder:GetChildren()) do
if obj:IsA("Tool") then
table.insert(results, {Path = path .. obj.Name, Tool = obj})
elseif obj:IsA("Folder") or obj:IsA("Model") then
RecursiveFindTools(obj, path .. obj.Name .. ".", results)
end
end
return results
end
local function RefreshGunButtons()
for _, c in ipairs(pageGun:GetChildren()) do
if c:IsA("TextButton") and c.Text ~= "Refresh Gun List" then c:Destroy() end
end
local folder = ReplicatedStorage:FindFirstChild("GunModels")
if not folder then
AddLabel(pageGun, "No GunModels folder!")
return
end
local guns = RecursiveFindTools(folder, "GunModels.")
if #guns == 0 then
AddLabel(pageGun, "No Tools found inside GunModels.")
return
end
for _, entry in ipairs(guns) do
AddButton(pageGun, entry.Path, function()
local bp = LocalPlayer:FindFirstChildOfClass("Backpack")
if not bp then Notify("No backpack found!") return end
local clone = entry.Tool:Clone()
clone.Parent = bp
local char = LocalPlayer.Character
local hum = char and char:FindFirstChildOfClass("Humanoid")
if hum and char and not char:FindFirstChildOfClass("Tool") then
pcall(function() hum:EquipTool(clone) end)
end
Notify("Gave: " .. entry.Path)
end)
end
end
AddButton(pageGun, "Refresh Gun List", function()
RefreshGunButtons()
Notify("Gun list refreshed. Found tools in nested folders.")
end)
RefreshGunButtons()
-- ADMIN PANEL
AddLabel(pageAdmin, "Fire discovered remotes. Use with caution.")
AddLabel(pageAdmin, "Remotes scan:")
for name, remote in pairs(Remotes) do
if remote then
AddButton(pageAdmin, "Fire: " .. name, function()
local ok, err = pcall(function()
if remote:IsA("RemoteEvent") then
remote:FireServer()
elseif remote:IsA("RemoteFunction") then
remote:InvokeServer()
elseif remote:IsA("BindableEvent") then
remote:Fire()
end
end)
if ok then
Notify("Fired: " .. name)
else
Notify("Failed: " .. name .. " | " .. tostring(err))
end
end)
else
AddLabel(pageAdmin, "Missing: " .. name)
end
end
AddButton(pageAdmin, "Give Admin (Try PermEdit)", function()
if Remotes.PermEdit then
Remotes.PermEdit:FireServer(LocalPlayer.Name, "Admin")
Notify("Sent PermEdit for Admin")
else
Notify("PermEditorEvent not found")
end
end)
AddButton(pageAdmin, "Teleport to Target (test)", function()
if Remotes.Teleport then
Remotes.Teleport:FireServer(workspace.CurrentCamera.CFrame.Position + Vector3.new(0,5,0))
Notify("Fired TeleportPlayer")
end
end)
-- STATS TAB (leaderstats editor)
AddLabel(pageStats, "Edit your leaderstats directly.")
local function AddStatEdit(name, statName)
local f = Instance.new("Frame", pageStats)
f.Size = UDim2.new(1, 0, 0, 28)
f.BackgroundTransparency = 1
local lbl = Instance.new("TextLabel", f)
lbl.Size = UDim2.new(0.4, 0, 1, 0)
lbl.BackgroundTransparency = 1
lbl.Text = name .. ":"
lbl.TextColor3 = Color3.fromRGB(230, 230, 230)
lbl.Font = Enum.Font.SourceSans
lbl.TextSize = 16
lbl.TextXAlignment = Enum.TextXAlignment.Left
local box = Instance.new("TextBox", f)
box.Size = UDim2.new(0.3, 0, 1, -4)
box.Position = UDim2.new(0.42, 0, 0, 2)
box.BackgroundColor3 = Color3.fromRGB(50, 50, 50)
box.TextColor3 = Color3.new(1, 1, 1)
box.Text = "0"
box.Font = Enum.Font.SourceSans
box.TextSize = 16
Instance.new("UICorner", box).CornerRadius = UDim.new(0, 4)
local btn = Instance.new("TextButton", f)
btn.Size = UDim2.new(0.24, 0, 1, -4)
btn.Position = UDim2.new(0.75, 0, 0, 2)
btn.BackgroundColor3 = Color3.fromRGB(60, 130, 220)
btn.Text = "Set"
btn.TextColor3 = Color3.new(1, 1, 1)
btn.Font = Enum.Font.SourceSansBold
btn.TextSize = 14
Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 4)
btn.MouseButton1Click:Connect(function()
local ls = LocalPlayer:FindFirstChild("leaderstats")
if not ls then Notify("No leaderstats!") return end
local stat = ls:FindFirstChild(statName)
if stat and stat:IsA("IntValue") or stat:IsA("NumberValue") then
stat.Value = tonumber(box.Text) or 0
Notify(name .. " set to " .. stat.Value)
else
Notify("Stat not found: " .. statName)
end
end)
end
AddStatEdit("Kills", "Kills")
AddStatEdit("Deaths", "Deaths")
AddStatEdit("HZM", "HZM")
AddStatEdit("XP", "XP")
AddStatEdit("Level", "Level")
AddStatEdit("RequiredXP", "RequiredXP")
AddStatEdit("Headshots", "Headshots")
-- MISC TAB
AddToggle(pageMisc, "Notifications", "Notifications")
AddButton(pageMisc, "Unload Script", function()
ScriptActive = false
for _, p in ipairs(Players:GetPlayers()) do
RemoveESP(p)
end
FOVDraw:Remove()
TargetDraw:Remove()
screen:Destroy()
Notify("Unloaded.")
end)
end
--// INPUT
UserInputService.InputBegan:Connect(function(input, gameProcessed)
if gameProcessed then return end
if ListeningForKey then
local key = input.UserInputType == Enum.UserInputType.Keyboard and input.KeyCode or input.UserInputType
Settings.AimKey = key
local name = tostring(key):gsub("Enum%.UserInputType%.", ""):gsub("Enum%.KeyCode%.", "")
UI.KeyLbl.Text = "Aim Key: " .. name
UI.KeyBtn.Text = "Change"
UI.KeyBtn.BackgroundColor3 = Color3.fromRGB(70, 70, 70)
ListeningForKey = false
Notify("Key set: " .. name)
return
end
local match = false
if Settings.AimKey.EnumType == Enum.KeyCode then
match = input.KeyCode == Settings.AimKey
elseif Settings.AimKey.EnumType == Enum.UserInputType then
match = input.UserInputType == Settings.AimKey
end
if match then
HoldingAim = true
end
end)
UserInputService.InputEnded:Connect(function(input, gameProcessed)
local match = false
if Settings.AimKey.EnumType == Enum.KeyCode then
match = input.KeyCode == Settings.AimKey
elseif Settings.AimKey.EnumType == Enum.UserInputType then
match = input.UserInputType == Settings.AimKey
end
if match then
HoldingAim = false
CurrentTarget = nil
end
end)
--// RENDER LOOP
RunService.RenderStepped:Connect(function()
if not ScriptActive then return end
if not Camera or not Camera.Parent then
Camera = Workspace:FindFirstChild("CustomCamera")
if not Camera or not Camera:IsA("Camera") then
Camera = Workspace.CurrentCamera
end
end
if not Camera then return end
-- FOV Circle
if Settings.ESPDrawFOV then
FOVDraw.Position = Camera.ViewportSize / 2
FOVDraw.Radius = Settings.FOV
FOVDraw.Visible = true
else
FOVDraw.Visible = false
end
-- AIMBOT
if Settings.AimEnabled and HoldingAim then
local valid = false
if CurrentTarget then
local char = CurrentTarget.Player.Character
local part = char and GetAimPart(char)
if part and IsAlive(char) and IsTargetValid(CurrentTarget.Player) then
local aimPos = GetAimPosition(part)
local pos, onScreen = Camera:WorldToViewportPoint(aimPos)
if onScreen then
local sd = (Vector2.new(pos.X, pos.Y) - Camera.ViewportSize / 2).Magnitude
if sd = 0.99 then
Camera.CFrame = targetCF
else
Camera.CFrame = Camera.CFrame:Lerp(targetCF, Settings.Smoothness)
end
local pos, onScreen = Camera:WorldToViewportPoint(aimPos)
if onScreen then
TargetDraw.Position = Vector2.new(pos.X, pos.Y)
TargetDraw.Radius = math.clamp(500 / pos.Z, 5, 30)
TargetDraw.Visible = true
else
TargetDraw.Visible = false
end
if not CurrentTarget.Notified then
CurrentTarget.Notified = true
Notify("Locked: " .. CurrentTarget.Player.Name .. " | " .. math.floor(CurrentTarget.Distance) .. "s")
end
else
TargetDraw.Visible = false
end
else
CurrentTarget = nil
TargetDraw.Visible = false
end
-- ESP
for _, player in ipairs(Players:GetPlayers()) do
if player == LocalPlayer then continue end
local data = GetESP(player)
data.Box.Visible = false
data.Tracer.Visible = false
data.Info.Visible = false
if not Settings.ESPEnabled then continue end
local char = player.Character
local part = char and GetAimPart(char)
if not part or not IsAlive(char) or not IsTargetValid(player) then continue end
local dist = (part.Position - Camera.CFrame.Position).Magnitude
if dist > Settings.ESPMaxDist then continue end
local pos, onScreen = Camera:WorldToViewportPoint(part.Position)
if not onScreen then continue end
local screenPos = Vector2.new(pos.X, pos.Y)
local hp, maxHp = GetHealth(char)
local locked = CurrentTarget and CurrentTarget.Player == player
if Settings.ESPTracers then
data.Tracer.From = Vector2.new(Camera.ViewportSize.X / 2, Camera.ViewportSize.Y)
data.Tracer.To = screenPos
data.Tracer.Color = locked and Color3.fromRGB(255, 0, 0) or Color3.fromRGB(255, 255, 255)
data.Tracer.Transparency = locked and 1 or 0.6
data.Tracer.Visible = true
end
if Settings.ESPBoxes then
local scale = math.clamp(800 / pos.Z, 20, 90)
data.Box.Size = Vector2.new(scale / 2, scale)
data.Box.Position = screenPos - data.Box.Size / 2
data.Box.Color = locked and Color3.fromRGB(255, 0, 0) or Color3.fromRGB(0, 255, 100)
data.Box.Visible = true
end
if Settings.ESPInfo then
data.Info.Position = screenPos - Vector2.new(0, 40)
data.Info.Text = player.Name .. "\nHP:" .. hp .. "/" .. maxHp .. " | " .. math.floor(dist) .. "s"
data.Info.Color = locked and Color3.fromRGB(255, 200, 50) or Color3.fromRGB(255, 255, 255)
data.Info.Visible = true
end
end
-- HITBOX EXPANDER
if Settings.HitboxEnabled then
for _, player in ipairs(Players:GetPlayers()) do
if player == LocalPlayer then continue end
local char = player.Character
if not char then continue end
local hrp = char:FindFirstChild("HumanoidRootPart")
if not hrp then continue end
local expander = char:FindFirstChild("DevHitbox")
if not expander then
expander = Instance.new("Part")
expander.Name = "DevHitbox"
expander.Shape = Enum.PartType.Ball
expander.Material = Enum.Material.ForceField
expander.Color = Color3.fromRGB(255, 0, 0)
expander.CanCollide = false
expander.Anchored = false
expander.Parent = char
local weld = Instance.new("Weld", expander)
weld.Part0 = hrp
weld.Part1 = expander
end
expander.Size = Vector3.new(Settings.HitboxSize, Settings.HitboxSize, Settings.HitboxSize)
expander.Transparency = 1 - Settings.HitboxTransparency
end
else
for _, player in ipairs(Players:GetPlayers()) do
if player == LocalPlayer then continue end
local char = player.Character
if char then
local old = char:FindFirstChild("DevHitbox")
if old then old:Destroy() end
end
end
end
end)
--// CLEANUP
Players.PlayerRemoving:Connect(function(player)
RemoveESP(player)
if CurrentTarget and CurrentTarget.Player == player then
CurrentTarget = nil
end
end)
--// INIT
BuildUI()
Notify("Dev Hub Loaded | Recursive Guns | Admin Panel Ready")