52 27 No KeyRealistic Home Defense Script (Delta Mobile) – HD Menu: Aimbot, Chams
Realistic Home Defense · RobloxDescription
HD Menu is a Realistic Home Defense script you can run in Delta on Android, iOS or PC. It includes aimbot, fov radius, wall check and more. The creator warns that Rage mode can get you banned. Created by sordiway. No key.
Key Features
- Aimbot with FOV radius
- Target nearest or lowest health
- Wall Check option
- Chams with fill and outline settings
- Rage mode
- Max distance setting
- English or Afrikaans menu
- Menu toggle key
Realistic Home Defense is round-based: defenders hold the house, invaders break in, one life each, three minutes on the clock. sordiway’s HD Menu Realistic Home Defense script plugs into that loop with four pages (Aimbot, Visuals, Rage and Settings) and team check hard-wired on, so blue teammates are never targeted.
Read this before you execute
Every module starts enabled. Out of the box the aimbot snaps instantly (Smoothness 1) to heads inside a 400-pixel FOV, chams are on, and Rage is armed on the X key. The creator warns that Rage mode can get you banned. Open the menu with RightShift and go through the switches first.
The four pages
- Aimbot: hold-to-aim on right mouse, or “Always On (no key needed)”. FOV radius with an optional circle, smoothness, target part (Head, UpperTorso or HumanoidRootPart), Nearest or Lowest Health targeting, Wall Check and Max Distance (2000 by default).
- Visuals: chams with show enemies/teammates, red and blue colours, fill and outline transparency, and visibility through walls.
- Rage: Teleport Now, a teleport key, Stick Behind (hold key), distance behind, height offset, face target and a cooldown between teleports.
- Settings: English or Afrikaans labels and the menu toggle key.
Setting it up on Delta
The code box holds the whole thing. Nothing is fetched from the internet and there’s no key. Join a round, paste it in and execute. On a touchscreen with no right mouse button, switch the aimbot to Always On and use the Teleport Now button for Rage. If you’re not on Delta, the tested row also covers Codex and Fluxus, Arceus X, and PC.
FAQ
Why does Rage say “No alive enemy found”? It only picks players on the other team. If everyone is on one side, for example while bots fill the lobby, there’s nothing to teleport behind.
Is there another RHD script on the site? Yes, one by s0ftkillz. This listing is the open-source menu with chams and Rage.
Do walls stop the aimbot? Only if you turn Wall Check on. It’s off by default, which means it locks through walls.
Round tip: the game’s guns already shoot through thin walls. Chams plus Wall Check off will pull your aim onto invaders behind drywall, which is very visible to spectators. Raise Smoothness above 1 to keep it believable.
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")
local LocalPlayer = Players.LocalPlayer
local Camera = workspace.CurrentCamera
------------------------------------------------------------------
-- CONFIG (everything here is editable live from the menu)
------------------------------------------------------------------
local Config = {
Aimbot = {
Enabled = true,
AlwaysOn = false, -- true = locks without holding a key
AimKey = Enum.UserInputType.MouseButton2,
TargetPart = "Head", -- Head / UpperTorso / HumanoidRootPart
Smoothness = 1, -- 1 = instant snap (blatant), higher = slower
FOV = 400, -- radius in pixels
ShowFOV = true,
WallCheck = false, -- false = locks through walls
MaxDistance = 2000,
-- TeamCheck is hard-wired on, there is no option to disable it.
},
Chams = {
Enabled = true,
ShowTeammates = true,
ShowEnemies = true,
TeamColor = Color3.fromRGB(0, 120, 255), -- blue
EnemyColor = Color3.fromRGB(255, 0, 0), -- red
FillTransparency = 0.5,
OutlineTransparency = 0,
AlwaysOnTop = true,
},
Rage = {
Enabled = true,
TeleportKey = Enum.KeyCode.X, -- press to teleport behind an enemy
StickMode = false, -- true = stay glued behind the enemy while key is held
TargetMode = "Nearest", -- "Nearest" or "Lowest Health"
Distance = 4, -- studs behind the enemy
Height = 0, -- studs above the enemy's root
Cooldown = 0.5, -- seconds between teleports (tap mode)
FaceTarget = true,
},
Menu = {
ToggleKey = Enum.KeyCode.RightShift,
Language = "English", -- "English" or "Afrikaans"
},
}
local TARGET_PARTS = { "Head", "UpperTorso", "HumanoidRootPart" }
------------------------------------------------------------------
-- LANGUAGES (add more by copying the Afrikaans table)
------------------------------------------------------------------
local Strings = {
Afrikaans = {
["REALISTIC HOME DEFENSE"] = "REALISTIESE HUISVERDEDIGING",
["Aimbot"] = "Teikenbot",
["Visuals"] = "Visuele",
["Settings"] = "Instellings",
["Enable Aimbot"] = "Aktiveer Teikenbot",
["Always On (no key needed)"] = "Altyd Aan (geen sleutel nodig)",
["Aim Key (hold)"] = "Teiksleutel (hou)",
["Target Part"] = "Teikendeel",
["Smoothness (1 = snap)"] = "Gladheid (1 = onmiddellik)",
["FOV Radius"] = "Gesigsveld-radius",
["Show FOV Circle"] = "Wys Gesigsveld-sirkel",
["Wall Check"] = "Muurkontrole",
["Max Distance"] = "Maksimum Afstand",
["Enable Chams"] = "Aktiveer Chams",
["Show Teammates"] = "Wys Spanmaats",
["Show Enemies"] = "Wys Vyande",
["Teammate Colour (blue)"] = "Spanmaatkleur (blou)",
["Enemy Colour (red)"] = "Vyandkleur (rooi)",
["Fill Transparency"] = "Vul-deursigtigheid",
["Outline Transparency"] = "Buitelyn-deursigtigheid",
["Visible Through Walls"] = "Sigbaar Deur Mure",
["Rage"] = "Rage",
["Enable Rage"] = "Aktiveer Rage",
["Teleport Now"] = "Teleporteer Nou",
["Teleport Key"] = "Teleporteer-sleutel",
["Stick Behind (hold key)"] = "Bly Agter Vyand (hou sleutel)",
["Target Mode"] = "Teikenmodus",
["Nearest"] = "Naaste",
["Lowest Health"] = "Laagste Gesondheid",
["Distance Behind"] = "Afstand Agter",
["Height Offset"] = "Hoogte-verskuiwing",
["Teleport Cooldown"] = "Teleporteer-afkoeltyd",
["Face Target"] = "Kyk na Teiken",
["Menu Toggle Key"] = "Kieslys-sleutel",
["Language / Taal"] = "Language / Taal",
["Team check is always enabled.\nTeammates = blue, enemies = red."] =
"Spankontrole is altyd aan.\nSpanmaats = blou, vyande = rooi.",
["Head"] = "Kop",
["UpperTorso"] = "Bolyf",
["HumanoidRootPart"] = "Worteldeel",
["Mouse 1"] = "Muis 1",
["Mouse 2"] = "Muis 2",
["Mouse 3"] = "Muis 3",
["press a key..."] = "druk 'n sleutel...",
},
}
local translatables = {}
local function T(s)
local map = Strings[Config.Menu.Language]
return (map and map[s]) or s
end
local function bind(inst, fn)
local function upd() inst.Text = fn() end
upd()
table.insert(translatables, upd)
return upd
end
local function refreshLanguage()
for _, upd in ipairs(translatables) do upd() end
end
------------------------------------------------------------------
-- HELPERS
------------------------------------------------------------------
local function isEnemy(plr)
if plr == LocalPlayer then return false end
-- Always team-checked: same team (or both teamless) = not an enemy
if not LocalPlayer.Team or not plr.Team then return false end
return plr.Team ~= LocalPlayer.Team
end
local function isTeammate(plr)
if plr == LocalPlayer then return false end
return LocalPlayer.Team ~= nil and plr.Team == LocalPlayer.Team
end
local function getAlive(plr)
local char = plr.Character
if not char then return end
local hum = char:FindFirstChildOfClass("Humanoid")
if not hum or hum.Health <= 0 then return end
return char, hum
end
local function getPart(char)
local name = Config.Aimbot.TargetPart
return char:FindFirstChild(name)
or char:FindFirstChild("Head")
or char:FindFirstChild("HumanoidRootPart")
end
------------------------------------------------------------------
-- CHAMS
------------------------------------------------------------------
local highlights = {}
local function removeHighlight(plr)
local h = highlights[plr]
if h then h:Destroy() end
highlights[plr] = nil
end
local function updateChams()
local cfg = Config.Chams
for _, plr in ipairs(Players:GetPlayers()) do
if plr ~= LocalPlayer then
local char = getAlive(plr)
local team, enemy = isTeammate(plr), isEnemy(plr)
local want = cfg.Enabled and char
and ((team and cfg.ShowTeammates) or (enemy and cfg.ShowEnemies))
if want then
local h = highlights[plr]
if not h or h.Parent ~= char then
if h then h:Destroy() end
h = Instance.new("Highlight")
h.Name = "HD_Cham"
h.Parent = char
highlights[plr] = h
end
h.Adornee = char
h.FillColor = team and cfg.TeamColor or cfg.EnemyColor
h.OutlineColor = team and cfg.TeamColor or cfg.EnemyColor
h.FillTransparency = cfg.FillTransparency
h.OutlineTransparency = cfg.OutlineTransparency
h.DepthMode = cfg.AlwaysOnTop
and Enum.HighlightDepthMode.AlwaysOnTop
or Enum.HighlightDepthMode.Occluded
else
removeHighlight(plr)
end
end
end
end
Players.PlayerRemoving:Connect(removeHighlight)
------------------------------------------------------------------
-- AIMBOT
------------------------------------------------------------------
local aimHeld = false
local function matchesAimKey(input)
local key = Config.Aimbot.AimKey
return input.KeyCode == key or input.UserInputType == key
end
local rayParams = RaycastParams.new()
rayParams.FilterType = Enum.RaycastFilterType.Exclude
local function visible(part, char)
rayParams.FilterDescendantsInstances = { LocalPlayer.Character, Camera }
local origin = Camera.CFrame.Position
local result = workspace:Raycast(origin, part.Position - origin, rayParams)
return result == nil or result.Instance:IsDescendantOf(char)
end
local function getTarget()
local cfg = Config.Aimbot
local mouse = UserInputService:GetMouseLocation()
local best, bestDist
for _, plr in ipairs(Players:GetPlayers()) do
if isEnemy(plr) then -- team check always enforced
local char = getAlive(plr)
local part = char and getPart(char)
if part then
local worldDist = (part.Position - Camera.CFrame.Position).Magnitude
if worldDist <= cfg.MaxDistance then
local pos, onScreen = Camera:WorldToViewportPoint(part.Position)
if onScreen then
local d = (Vector2.new(pos.X, pos.Y) - mouse).Magnitude
if d <= cfg.FOV and (not bestDist or d < bestDist)
and (not cfg.WallCheck or visible(part, char)) then
best, bestDist = part, d
end
end
end
end
end
end
return best
end
RunService:BindToRenderStep("HD_Aimbot", Enum.RenderPriority.Camera.Value + 1, function()
Camera = workspace.CurrentCamera
local cfg = Config.Aimbot
if not cfg.Enabled then return end
if not (cfg.AlwaysOn or aimHeld) then return end
local target = getTarget()
if not target then return end
local goal = CFrame.new(Camera.CFrame.Position, target.Position)
if cfg.Smoothness <= 1 then
Camera.CFrame = goal
else
Camera.CFrame = Camera.CFrame:Lerp(goal, 1 / cfg.Smoothness)
end
end)
------------------------------------------------------------------
-- RAGE: teleport behind enemies (team check always enforced)
------------------------------------------------------------------
local lastRebind = 0 -- used so rebinding a key doesn't also trigger it
local rageHeld = false
local rageTarget = nil
local lastTP = 0
local function matchesKey(input, key)
return input.KeyCode == key or input.UserInputType == key
end
local function getRoot(char)
return char and (char:FindFirstChild("HumanoidRootPart")
or char.PrimaryPart
or char:FindFirstChild("UpperTorso")
or char:FindFirstChild("Torso"))
end
local function findRageTarget()
local myRoot = getRoot(LocalPlayer.Character)
if not myRoot then return end
local best, bestScore
for _, plr in ipairs(Players:GetPlayers()) do
if isEnemy(plr) then
local char, hum = getAlive(plr)
local root = getRoot(char)
if root then
local score = (Config.Rage.TargetMode == "Lowest Health")
and hum.Health or (root.Position - myRoot.Position).Magnitude
if not bestScore or score < bestScore then
best, bestScore = char, score
end
end
end
end
return best
end
local function teleportBehind(targetChar)
local cfg = Config.Rage
local myChar = LocalPlayer.Character
local myRoot = getRoot(myChar)
local tRoot = getRoot(targetChar)
if not (myChar and myRoot and tRoot) then return end
local pos = tRoot.Position - tRoot.CFrame.LookVector * cfg.Distance + Vector3.new(0, cfg.Height, 0)
local cf
if cfg.FaceTarget then
cf = CFrame.new(pos, Vector3.new(tRoot.Position.X, pos.Y, tRoot.Position.Z))
else
cf = CFrame.new(pos)
end
myRoot.AssemblyLinearVelocity = Vector3.zero
myChar:PivotTo(cf)
end
local function rageTeleportNow()
local t = findRageTarget()
if t then
teleportBehind(t)
else
warn("[HD Rage] No alive enemy found (are players on different Teams?)")
end
end
UserInputService.InputBegan:Connect(function(input)
if UserInputService:GetFocusedTextBox() then return end
if os.clock() - lastRebind < 0.25 then return end
local cfg = Config.Rage
if not cfg.Enabled or not matchesKey(input, cfg.TeleportKey) then return end
rageHeld = true
rageTarget = findRageTarget()
if not rageTarget then
warn("[HD Rage] No alive enemy found (are players on different Teams?)")
return
end
if not cfg.StickMode and os.clock() - lastTP >= cfg.Cooldown then
lastTP = os.clock()
teleportBehind(rageTarget)
end
end)
UserInputService.InputEnded:Connect(function(input)
if matchesKey(input, Config.Rage.TeleportKey) then
rageHeld = false
rageTarget = nil
end
end)
RunService.Heartbeat:Connect(function()
local cfg = Config.Rage
if not (cfg.Enabled and cfg.StickMode and rageHeld) then return end
local tPlr = rageTarget and Players:GetPlayerFromCharacter(rageTarget)
if not tPlr or not rageTarget.Parent or not getAlive(tPlr) then
rageTarget = findRageTarget()
end
if rageTarget then teleportBehind(rageTarget) end
end)
------------------------------------------------------------------
-- GUI
------------------------------------------------------------------
local ACCENT = Color3.fromRGB(255, 70, 70)
local BG = Color3.fromRGB(18, 18, 24)
local PANEL = Color3.fromRGB(28, 28, 38)
local ELEMENT = Color3.fromRGB(38, 38, 52)
local TEXT = Color3.fromRGB(235, 235, 245)
local SUBTEXT = Color3.fromRGB(150, 150, 170)
local gui = Instance.new("ScreenGui")
gui.Name = "HD_Menu"
gui.ResetOnSpawn = false
gui.IgnoreGuiInset = true
gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
gui.Parent = LocalPlayer:WaitForChild("PlayerGui")
local function corner(inst, r)
local c = Instance.new("UICorner"); c.CornerRadius = UDim.new(0, r or 8); c.Parent = inst
end
local function stroke(inst, color, th)
local s = Instance.new("UIStroke"); s.Color = color; s.Thickness = th or 1
s.ApplyStrokeMode = Enum.ApplyStrokeMode.Border; s.Parent = inst; return s
end
local function label(parent, text, size, color, font, static)
local l = Instance.new("TextLabel")
l.BackgroundTransparency = 1
l.Text = text; l.TextSize = size or 14
l.TextColor3 = color or TEXT
l.Font = font or Enum.Font.GothamMedium
l.TextXAlignment = Enum.TextXAlignment.Left
l.Parent = parent
if not static then bind(l, function() return T(text) end) end
return l
end
-- FOV circle
local fovCircle = Instance.new("Frame")
fovCircle.AnchorPoint = Vector2.new(0.5, 0.5)
fovCircle.BackgroundTransparency = 1
fovCircle.Parent = gui
corner(fovCircle, 9999)
local fovStroke = stroke(fovCircle, ACCENT, 1.5)
RunService.RenderStepped:Connect(function()
local cfg = Config.Aimbot
fovCircle.Visible = cfg.Enabled and cfg.ShowFOV
fovCircle.Size = UDim2.fromOffset(cfg.FOV * 2, cfg.FOV * 2)
local m = UserInputService:GetMouseLocation()
fovCircle.Position = UDim2.fromOffset(m.X, m.Y)
end)
-- Main window
local main = Instance.new("Frame")
main.Name = "Main"
main.Size = UDim2.fromOffset(420, 460)
main.Position = UDim2.new(0.5, -210, 0.5, -230)
main.BackgroundColor3 = BG
main.BorderSizePixel = 0
main.Parent = gui
corner(main, 12)
stroke(main, ACCENT, 1.5)
local titleBar = Instance.new("Frame")
titleBar.Size = UDim2.new(1, 0, 0, 44)
titleBar.BackgroundColor3 = PANEL
titleBar.BorderSizePixel = 0
titleBar.Parent = main
corner(titleBar, 12)
local title = label(titleBar, "REALISTIC HOME DEFENSE", 16, TEXT, Enum.Font.GothamBold)
title.Position = UDim2.fromOffset(16, 0)
title.Size = UDim2.new(1, -60, 1, 0)
local closeBtn = Instance.new("TextButton")
closeBtn.Size = UDim2.fromOffset(28, 28)
closeBtn.Position = UDim2.new(1, -38, 0, 8)
closeBtn.BackgroundColor3 = ELEMENT
closeBtn.Text = "X"
closeBtn.TextColor3 = TEXT
closeBtn.Font = Enum.Font.GothamBold
closeBtn.TextSize = 14
closeBtn.Parent = titleBar
corner(closeBtn, 6)
-- Invisible modal button: frees the mouse cursor while the menu is open
-- (fixes buttons/sliders not being clickable in first-person / mouse-locked games)
local modalBtn = Instance.new("TextButton")
modalBtn.Size = UDim2.fromOffset(1, 1)
modalBtn.BackgroundTransparency = 1
modalBtn.Text = ""
modalBtn.Modal = true
modalBtn.Parent = main
-- Dragging
do
local dragging, dragStart, startPos
titleBar.InputBegan:Connect(function(i)
if i.UserInputType == Enum.UserInputType.MouseButton1 then
dragging, dragStart, startPos = true, i.Position, main.Position
end
end)
UserInputService.InputChanged:Connect(function(i)
if dragging and i.UserInputType == Enum.UserInputType.MouseMovement then
local d = i.Position - dragStart
main.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + d.X,
startPos.Y.Scale, startPos.Y.Offset + d.Y)
end
end)
UserInputService.InputEnded:Connect(function(i)
if i.UserInputType == Enum.UserInputType.MouseButton1 then dragging = false end
end)
end
-- Tabs
local tabBar = Instance.new("Frame")
tabBar.Size = UDim2.new(1, -24, 0, 34)
tabBar.Position = UDim2.fromOffset(12, 52)
tabBar.BackgroundTransparency = 1
tabBar.Parent = main
local tabLayout = Instance.new("UIListLayout")
tabLayout.FillDirection = Enum.FillDirection.Horizontal
tabLayout.Padding = UDim.new(0, 8)
tabLayout.Parent = tabBar
local pages, tabButtons = {}, {}
local function selectTab(name)
for n, p in pairs(pages) do
p.Visible = (n == name)
tabButtons[n].BackgroundColor3 = (n == name) and ACCENT or ELEMENT
tabButtons[n].TextColor3 = (n == name) and Color3.new(1, 1, 1) or SUBTEXT
end
end
local function makePage(name)
local page = Instance.new("ScrollingFrame")
page.Size = UDim2.new(1, -24, 1, -100)
page.Position = UDim2.fromOffset(12, 92)
page.BackgroundTransparency = 1
page.BorderSizePixel = 0
page.ScrollBarThickness = 4
page.ScrollBarImageColor3 = ACCENT
page.CanvasSize = UDim2.new()
page.AutomaticCanvasSize = Enum.AutomaticSize.Y
page.Visible = false
page.Parent = main
local l = Instance.new("UIListLayout"); l.Padding = UDim.new(0, 8); l.Parent = page
pages[name] = page
local btn = Instance.new("TextButton")
btn.Size = UDim2.fromOffset(92, 34)
btn.BackgroundColor3 = ELEMENT
btn.Text = name
btn.TextColor3 = SUBTEXT
btn.Font = Enum.Font.GothamBold
btn.TextSize = 13
btn.Parent = tabBar
corner(btn, 8)
tabButtons[name] = btn
bind(btn, function() return T(name) end)
btn.MouseButton1Click:Connect(function() selectTab(name) end)
return page
end
local function rowFrame(parent, h)
local f = Instance.new("Frame")
f.Size = UDim2.new(1, -8, 0, h or 38)
f.BackgroundColor3 = PANEL
f.BorderSizePixel = 0
f.Parent = parent
corner(f, 8)
return f
end
local function addToggle(parent, text, get, set)
local f = rowFrame(parent)
local l = label(f, text, 14); l.Position = UDim2.fromOffset(12, 0); l.Size = UDim2.new(1, -70, 1, 0)
local box = Instance.new("TextButton")
box.Size = UDim2.fromOffset(44, 22); box.Position = UDim2.new(1, -56, 0.5, -11)
box.Text = ""; box.AutoButtonColor = false; box.Parent = f
corner(box, 11)
local knob = Instance.new("Frame")
knob.Size = UDim2.fromOffset(18, 18); knob.BackgroundColor3 = Color3.new(1, 1, 1)
knob.Parent = box; corner(knob, 9)
local function render()
local on = get()
TweenService:Create(box, TweenInfo.new(0.15), { BackgroundColor3 = on and ACCENT or ELEMENT }):Play()
TweenService:Create(knob, TweenInfo.new(0.15),
{ Position = on and UDim2.fromOffset(24, 2) or UDim2.fromOffset(2, 2) }):Play()
end
box.MouseButton1Click:Connect(function() set(not get()); render() end)
render()
end
local activeSlider
local function addSlider(parent, text, min, max, step, get, set)
local f = rowFrame(parent, 52)
local l = label(f, text, 14); l.Position = UDim2.fromOffset(12, 4); l.Size = UDim2.new(1, -90, 0, 20)
local v = label(f, "", 14, SUBTEXT, nil, true); v.TextXAlignment = Enum.TextXAlignment.Right
v.Position = UDim2.new(1, -82, 0, 4); v.Size = UDim2.fromOffset(70, 20)
local track = Instance.new("Frame")
track.Size = UDim2.new(1, -24, 0, 6); track.Position = UDim2.fromOffset(12, 36)
track.BackgroundColor3 = ELEMENT; track.BorderSizePixel = 0; track.Parent = f
corner(track, 3)
local fill = Instance.new("Frame")
fill.BackgroundColor3 = ACCENT; fill.BorderSizePixel = 0; fill.Parent = track
corner(fill, 3)
local function render()
local a = (get() - min) / (max - min)
fill.Size = UDim2.new(math.clamp(a, 0, 1), 0, 1, 0)
v.Text = tostring(get())
end
local function fromX(x)
local a = math.clamp((x - track.AbsolutePosition.X) / track.AbsoluteSize.X, 0, 1)
local val = min + (max - min) * a
val = math.floor(val / step + 0.5) * step
set(math.round(val * 1000) / 1000)
render()
end
track.InputBegan:Connect(function(i)
if i.UserInputType == Enum.UserInputType.MouseButton1 then
activeSlider = fromX; fromX(i.Position.X)
end
end)
render()
end
UserInputService.InputChanged:Connect(function(i)
if activeSlider and i.UserInputType == Enum.UserInputType.MouseMovement then
activeSlider(i.Position.X)
end
end)
UserInputService.InputEnded:Connect(function(i)
if i.UserInputType == Enum.UserInputType.MouseButton1 then activeSlider = nil end
end)
local rebinding
local function keyName(k)
if k.EnumType == Enum.UserInputType then
return k == Enum.UserInputType.MouseButton1 and T("Mouse 1")
or k == Enum.UserInputType.MouseButton2 and T("Mouse 2")
or k == Enum.UserInputType.MouseButton3 and T("Mouse 3") or k.Name
end
return k.Name
end
local function addKeybind(parent, text, get, set)
local f = rowFrame(parent)
local l = label(f, text, 14); l.Position = UDim2.fromOffset(12, 0); l.Size = UDim2.new(1, -130, 1, 0)
local b = Instance.new("TextButton")
b.Size = UDim2.fromOffset(110, 26); b.Position = UDim2.new(1, -122, 0.5, -13)
b.BackgroundColor3 = ELEMENT; b.TextColor3 = TEXT
b.Font = Enum.Font.GothamBold; b.TextSize = 13
b.Parent = f
local upd = bind(b, function() return keyName(get()) end)
corner(b, 6)
b.MouseButton1Click:Connect(function()
b.Text = T("press a key...")
rebinding = function(key) lastRebind = os.clock(); set(key); upd() end
end)
end
local function addCycle(parent, text, options, get, set, raw)
local f = rowFrame(parent)
local l = label(f, text, 14); l.Position = UDim2.fromOffset(12, 0); l.Size = UDim2.new(1, -150, 1, 0)
local b = Instance.new("TextButton")
b.Size = UDim2.fromOffset(130, 26); b.Position = UDim2.new(1, -142, 0.5, -13)
b.BackgroundColor3 = ELEMENT; b.TextColor3 = TEXT
b.Font = Enum.Font.GothamBold; b.TextSize = 13
b.Parent = f
local upd = bind(b, function() return raw and get() or T(get()) end)
corner(b, 6)
b.MouseButton1Click:Connect(function()
local idx = table.find(options, get()) or 0
set(options[idx % #options + 1]); upd()
end)
end
local function addColor(parent, text, get, set)
local presets = {
Color3.fromRGB(0, 120, 255), Color3.fromRGB(255, 0, 0), Color3.fromRGB(0, 255, 100),
Color3.fromRGB(255, 220, 0), Color3.fromRGB(180, 0, 255), Color3.fromRGB(255, 255, 255),
}
local f = rowFrame(parent)
local l = label(f, text, 14); l.Position = UDim2.fromOffset(12, 0); l.Size = UDim2.new(1, -100, 1, 0)
local sw = Instance.new("TextButton")
sw.Size = UDim2.fromOffset(60, 24); sw.Position = UDim2.new(1, -72, 0.5, -12)
sw.Text = ""; sw.BackgroundColor3 = get(); sw.Parent = f
corner(sw, 6)
sw.MouseButton1Click:Connect(function()
local idx = 0
for i, c in ipairs(presets) do if c == get() then idx = i break end end
local nxt = presets[idx % #presets + 1]
set(nxt); sw.BackgroundColor3 = nxt
end)
end
-- Aimbot tab
local A = Config.Aimbot
local aimPage = makePage("Aimbot")
addToggle(aimPage, "Enable Aimbot", function() return A.Enabled end, function(v) A.Enabled = v end)
addToggle(aimPage, "Always On (no key needed)", function() return A.AlwaysOn end, function(v) A.AlwaysOn = v end)
addKeybind(aimPage, "Aim Key (hold)", function() return A.AimKey end, function(k) A.AimKey = k end)
addCycle(aimPage, "Target Part", TARGET_PARTS, function() return A.TargetPart end, function(v) A.TargetPart = v end)
addSlider(aimPage, "Smoothness (1 = snap)", 1, 20, 1, function() return A.Smoothness end, function(v) A.Smoothness = v end)
addSlider(aimPage, "FOV Radius", 20, 1000, 10, function() return A.FOV end, function(v) A.FOV = v end)
addToggle(aimPage, "Show FOV Circle", function() return A.ShowFOV end, function(v) A.ShowFOV = v end)
addToggle(aimPage, "Wall Check", function() return A.WallCheck end, function(v) A.WallCheck = v end)
addSlider(aimPage, "Max Distance", 50, 5000, 50, function() return A.MaxDistance end, function(v) A.MaxDistance = v end)
-- Visuals tab
local C = Config.Chams
local visPage = makePage("Visuals")
addToggle(visPage, "Enable Chams", function() return C.Enabled end, function(v) C.Enabled = v end)
addToggle(visPage, "Show Teammates", function() return C.ShowTeammates end, function(v) C.ShowTeammates = v end)
addToggle(visPage, "Show Enemies", function() return C.ShowEnemies end, function(v) C.ShowEnemies = v end)
addColor(visPage, "Teammate Colour (blue)", function() return C.TeamColor end, function(v) C.TeamColor = v end)
addColor(visPage, "Enemy Colour (red)", function() return C.EnemyColor end, function(v) C.EnemyColor = v end)
addSlider(visPage, "Fill Transparency", 0, 1, 0.05, function() return C.FillTransparency end, function(v) C.FillTransparency = v end)
addSlider(visPage, "Outline Transparency", 0, 1, 0.05, function() return C.OutlineTransparency end, function(v) C.OutlineTransparency = v end)
addToggle(visPage, "Visible Through Walls", function() return C.AlwaysOnTop end, function(v) C.AlwaysOnTop = v end)
local function addButton(parent, text, callback)
local f = rowFrame(parent)
local b = Instance.new("TextButton")
b.Size = UDim2.new(1, -16, 0, 26); b.Position = UDim2.fromOffset(8, 6)
b.BackgroundColor3 = ACCENT; b.TextColor3 = Color3.new(1, 1, 1)
b.Font = Enum.Font.GothamBold; b.TextSize = 14; b.Parent = f
corner(b, 6)
bind(b, function() return T(text) end)
b.MouseButton1Click:Connect(callback)
end
-- Rage tab
local R = Config.Rage
local ragePage = makePage("Rage")
addToggle(ragePage, "Enable Rage", function() return R.Enabled end, function(v) R.Enabled = v end)
addButton(ragePage, "Teleport Now", rageTeleportNow)
addKeybind(ragePage, "Teleport Key", function() return R.TeleportKey end, function(k) R.TeleportKey = k end)
addToggle(ragePage, "Stick Behind (hold key)", function() return R.StickMode end, function(v) R.StickMode = v end)
addCycle(ragePage, "Target Mode", { "Nearest", "Lowest Health" }, function() return R.TargetMode end, function(v) R.TargetMode = v end)
addSlider(ragePage, "Distance Behind", 1, 15, 0.5, function() return R.Distance end, function(v) R.Distance = v end)
addSlider(ragePage, "Height Offset", 0, 10, 0.5, function() return R.Height end, function(v) R.Height = v end)
addSlider(ragePage, "Teleport Cooldown", 0, 5, 0.1, function() return R.Cooldown end, function(v) R.Cooldown = v end)
addToggle(ragePage, "Face Target", function() return R.FaceTarget end, function(v) R.FaceTarget = v end)
-- Settings tab
local setPage = makePage("Settings")
addKeybind(setPage, "Menu Toggle Key", function() return Config.Menu.ToggleKey end, function(k) Config.Menu.ToggleKey = k end)
addCycle(setPage, "Language / Taal", { "English", "Afrikaans" },
function() return Config.Menu.Language end,
function(v) Config.Menu.Language = v; refreshLanguage() end, true)
local info = label(setPage, "Team check is always enabled.\nTeammates = blue, enemies = red.", 13, SUBTEXT)
info.Size = UDim2.new(1, -8, 0, 40)
info.TextWrapped = true
selectTab("Aimbot")
-- Open / close
local function setMenu(open)
main.Visible = open
end
closeBtn.MouseButton1Click:Connect(function() setMenu(false) end)
------------------------------------------------------------------
-- INPUT
------------------------------------------------------------------
UserInputService.InputBegan:Connect(function(input, processed)
-- Rebinding takes priority
if rebinding then
local key
if input.UserInputType == Enum.UserInputType.Keyboard then
key = input.KeyCode
elseif input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.MouseButton2
or input.UserInputType == Enum.UserInputType.MouseButton3 then
key = input.UserInputType
end
if key and key ~= Enum.UserInputType.MouseButton1 then
local cb = rebinding; rebinding = nil; cb(key)
end
return
end
if input.KeyCode == Config.Menu.ToggleKey then
setMenu(not main.Visible)
return
end
if matchesAimKey(input) then aimHeld = true end
end)
UserInputService.InputEnded:Connect(function(input)
if matchesAimKey(input) then aimHeld = false end
end)
------------------------------------------------------------------
-- LOOP
------------------------------------------------------------------
RunService.Heartbeat:Connect(function()
local ok, err = pcall(updateChams)
if not ok then warn("[HD Chams] " .. tostring(err)) end
end)
-- Clean up highlights when a player's character is removed / respawns
local function hookPlayer(plr)
plr.CharacterRemoving:Connect(function() removeHighlight(plr) end)
end
for _, plr in ipairs(Players:GetPlayers()) do hookPlayer(plr) end
Players.PlayerAdded:Connect(hookPlayer)


