-- ROCKET Universal ESP & Aimbot (full rewrite)
-- Language: Luau (Roblox)
-- Функционал: ESP (Highlight + имя + дистанция с корректной обработкой респавна и поздних подключений),
-- Aimbot (плавное наведение на ближайшую цель в радиусе FOV)
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local Camera = workspace.CurrentCamera
local LocalPlayer = Players.LocalPlayer
local PlayerGui = LocalPlayer:WaitForChild("PlayerGui")
-- ================= НАСТРОЙКИ =================
local Settings = {
ESP = {
Enabled = true,
Color = Color3.fromRGB(255, 0, 0),
FillTransparency = 0.5,
ShowName = true,
ShowDistance = true,
},
Aimbot = {
Enabled = false,
FOV = 150, -- радиус поиска цели в пикселях
Smoothness = 0.25, -- чем меньше — тем резче
TargetPart = "Head", -- "Head" / "HumanoidRootPart" / "UpperTorso"
TeamCheck = false,
},
}
-- ================= ESP =================
local espObjects = {} -- [Player] = { Highlight, BillboardGui, NameLabel, DistanceLabel, Character }
local function DestroyESP(player)
local data = espObjects[player]
if data then
if data.Highlight and data.Highlight.Parent then data.Highlight:Destroy() end
if data.BillboardGui and data.BillboardGui.Parent then data.BillboardGui:Destroy() end
espObjects[player] = nil
end
end
local function SetupCharacter(player, character)
if player == LocalPlayer then return end
if not character or not character.Parent then return end
-- Ждём Head и Humanoid (важно для только что зашедших и для респавна)
local head = character:WaitForChild("Head", 5)
local humanoid = character:WaitForChild("Humanoid", 5)
if not head or not humanoid then return end
-- Если уже настроено для этого же персонажа — не пересоздаём
local existing = espObjects[player]
if existing
and existing.Character == character
and existing.Highlight and existing.Highlight.Parent
and existing.BillboardGui and existing.BillboardGui.Parent
then
return
end
DestroyESP(player)
-- Highlight
local highlight = Instance.new("Highlight")
highlight.Name = "ROCKET_ESP"
highlight.FillColor = Settings.ESP.Color
highlight.FillTransparency = Settings.ESP.FillTransparency
highlight.OutlineColor = Settings.ESP.Color
highlight.OutlineTransparency = 0
highlight.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
highlight.Enabled = Settings.ESP.Enabled
highlight.Parent = character
-- BillboardGui (имя + дистанция)
local billboard = Instance.new("BillboardGui")
billboard.Name = "ROCKET_ESP_Billboard"
billboard.Adornee = head
billboard.Size = UDim2.new(0, 150, 0, 50)
billboard.StudsOffset = Vector3.new(0, 2.5, 0)
billboard.AlwaysOnTop = true
billboard.Enabled = Settings.ESP.Enabled
billboard.Parent = head
local nameLabel = Instance.new("TextLabel")
nameLabel.Name = "NameLabel"
nameLabel.Size = UDim2.new(1, 0, 0.5, 0)
nameLabel.BackgroundTransparency = 1
nameLabel.Text = player.Name
nameLabel.TextColor3 = Settings.ESP.Color
nameLabel.TextStrokeTransparency = 0
nameLabel.TextScaled = true
nameLabel.Font = Enum.Font.SourceSansBold
nameLabel.Parent = billboard
local distLabel = Instance.new("TextLabel")
distLabel.Name = "DistanceLabel"
distLabel.Size = UDim2.new(1, 0, 0.5, 0)
distLabel.Position = UDim2.new(0, 0, 0.5, 0)
distLabel.BackgroundTransparency = 1
distLabel.Text = ""
distLabel.TextColor3 = Settings.ESP.Color
distLabel.TextStrokeTransparency = 0
distLabel.TextScaled = true
distLabel.Font = Enum.Font.SourceSans
distLabel.Parent = billboard
espObjects[player] = {
Highlight = highlight,
BillboardGui = billboard,
NameLabel = nameLabel,
DistanceLabel = distLabel,
Character = character,
}
end
local function CreateESP(player)
if player == LocalPlayer then return end
-- Если персонаж уже есть — настраиваем сразу
if player.Character then
task.spawn(SetupCharacter, player, player.Character)
end
-- Подписка на появление / респавн персонажа
player.CharacterAdded:Connect(function(character)
SetupCharacter(player, character)
end)
end
-- ВАЖНО: сначала подписка, потом обработка существующих
Players.PlayerAdded:Connect(CreateESP)
Players.PlayerRemoving:Connect(DestroyESP)
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LocalPlayer then
CreateESP(player)
end
end
local function UpdateESP()
for player, data in pairs(espObjects) do
local character = player.Character
if not character or not character.Parent then
DestroyESP(player)
continue
end
-- Смена персонажа (респавн) — пересоздаём
if data.Character ~= character then
SetupCharacter(player, character)
continue
end
if data.Highlight and data.Highlight.Parent then
data.Highlight.Enabled = Settings.ESP.Enabled
end
if data.BillboardGui and data.BillboardGui.Parent then
data.BillboardGui.Enabled = Settings.ESP.Enabled
end
if Settings.ESP.Enabled and Settings.ESP.ShowDistance then
local root = character:FindFirstChild("HumanoidRootPart")
if root and data.DistanceLabel and data.DistanceLabel.Parent then
local dist = (Camera.CFrame.Position - root.Position).Magnitude
data.DistanceLabel.Text = string.format("%d studs", math.floor(dist))
end
end
if data.NameLabel and data.NameLabel.Parent then
data.NameLabel.Visible = Settings.ESP.ShowName
end
end
end
-- ================= AIMBOT =================
local function GetClosestTarget()
local mousePos = UserInputService:GetMouseLocation()
local closestPart
local shortestDist = Settings.Aimbot.FOV
for _, player in ipairs(Players:GetPlayers()) do
if player == LocalPlayer then continue end
if not player.Character then continue end
if Settings.Aimbot.TeamCheck and player.Team == LocalPlayer.Team then
continue
end
local humanoid = player.Character:FindFirstChildOfClass("Humanoid")
if not humanoid or humanoid.Health <= 0 then continue end
local targetPart = player.Character:FindFirstChild(Settings.Aimbot.TargetPart)
if not targetPart then continue end
local screenPos, onScreen = Camera:WorldToViewportPoint(targetPart.Position)
if not onScreen then continue end
local dist = (Vector2.new(screenPos.X, screenPos.Y) - mousePos).Magnitude
if dist < shortestDist then
shortestDist = dist
closestPart = targetPart
end
end
return closestPart
end
local aimbotConnection
local function StartAimbot()
if aimbotConnection then return end
aimbotConnection = RunService.RenderStepped:Connect(function()
if not Settings.Aimbot.Enabled then return end
local targetPart = GetClosestTarget()
if not targetPart then return end
local currentCFrame = Camera.CFrame
local desiredCFrame = CFrame.new(currentCFrame.Position, targetPart.Position)
Camera.CFrame = currentCFrame:Lerp(desiredCFrame, Settings.Aimbot.Smoothness)
end)
end
local function StopAimbot()
if aimbotConnection then
aimbotConnection:Disconnect()
aimbotConnection = nil
end
end
-- ================= GUI =================
local screenGui = Instance.new("ScreenGui")
screenGui.Name = "ROCKET_GUI"
screenGui.ResetOnSpawn = false
screenGui.Parent = PlayerGui
local frame = Instance.new("Frame")
frame.Size = UDim2.new(0, 200, 0, 120)
frame.Position = UDim2.new(0, 10, 0, 10)
frame.BackgroundColor3 = Color3.fromRGB(30, 30, 30)
frame.BorderSizePixel = 0
frame.Parent = screenGui
local frameCorner = Instance.new("UICorner")
frameCorner.CornerRadius = UDim.new(0, 8)
frameCorner.Parent = frame
local espBtn = Instance.new("TextButton")
espBtn.Size = UDim2.new(1, -20, 0, 40)
espBtn.Position = UDim2.new(0, 10, 0, 10)
espBtn.BackgroundColor3 = Color3.fromRGB(60, 180, 60)
espBtn.Text = "ESP: ON"
espBtn.TextColor3 = Color3.new(1, 1, 1)
espBtn.Font = Enum.Font.SourceSansBold
espBtn.TextSize = 18
espBtn.Parent = frame
local espCorner = Instance.new("UICorner")
espCorner.CornerRadius = UDim.new(0, 6)
espCorner.Parent = espBtn
espBtn.MouseButton1Click:Connect(function()
Settings.ESP.Enabled = not Settings.ESP.Enabled
espBtn.Text = "ESP: " .. (Settings.ESP.Enabled and "ON" or "OFF")
espBtn.BackgroundColor3 = Settings.ESP.Enabled and Color3.fromRGB(60, 180, 60) or Color3.fromRGB(180, 60, 60)
end)
local aimBtn = Instance.new("TextButton")
aimBtn.Size = UDim2.new(1, -20, 0, 40)
aimBtn.Position = UDim2.new(0, 10, 0, 60)
aimBtn.BackgroundColor3 = Color3.fromRGB(180, 60, 60)
aimBtn.Text = "AIMBOT: OFF"
aimBtn.TextColor3 = Color3.new(1, 1, 1)
aimBtn.Font = Enum.Font.SourceSansBold
aimBtn.TextSize = 18
aimBtn.Parent = frame
local aimCorner = Instance.new("UICorner")
aimCorner.CornerRadius = UDim.new(0, 6)
aimCorner.Parent = aimBtn
aimBtn.MouseButton1Click:Connect(function()
Settings.Aimbot.Enabled = not Settings.Aimbot.Enabled
aimBtn.Text = "AIMBOT: " .. (Settings.Aimbot.Enabled and "ON" or "OFF")
aimBtn.BackgroundColor3 = Settings.Aimbot.Enabled and Color3.fromRGB(60, 180, 60) or Color3.fromRGB(180, 60, 60)
if Settings.Aimbot.Enabled then
StartAimbot()
else
StopAimbot()
end
end)
-- ================= LOOP =================
RunService.RenderStepped:Connect(UpdateESP)