--[[
WARNING: Heads up! This script has not been verified by ScriptBlox. Use at your own risk!
]]
local repo = "https://raw.githubusercontent.com/deividcomsono/Obsidian/main/"
local Library = loadstring(game:HttpGet(repo .. "Library.lua"))()
-- [[ SINGLETON CHECK (Using Library Notify) ]] --
if getgenv().ObsidianV1Running then
Library:Notify("v1 is Already Running!", 5)
return -- Stop the script
end
getgenv().ObsidianV1Running = true
-- [[ END CHECK ]] --
local ThemeManager = loadstring(game:HttpGet(repo .. "addons/ThemeManager.lua"))()
local SaveManager = loadstring(game:HttpGet(repo .. "addons/SaveManager.lua"))()
task.wait(0.5)
local Options = Library.Options
local Toggles = Library.Toggles
-- === LOGIC VARIABLES ===
local PerceivedPos = nil
local PerceivedVel = Vector3.new()
local LastUpdateTimeX = 0
local LastUpdateTimeY = 0
local ReactionDelayX = 0.5
local ReactionDelayY = 0.5
local TargetReactionDelay = 0.5
local JustLocked = true
local CurrentLockedTarget = nil
local TargetSwitchTimer = 0
local PendingTarget = nil
-- Global Target Variable (Used for Aimbot & Hitsound)
local Target = nil
-- Dead Delay Variable
local DeathDelayStart = 0
-- Switch Part Variables
local LastPartSwitchTime = 0
local CurrentSwitchPart = nil
-- [[ CUSTOM WINDOW & FOOTER UPDATER ]] --
local Window = Library:CreateWindow({
Title = "v1",
Footer = "Loading Data...",
NotifySide = "Right",
ShowCustomCursor = false,
})
task.spawn(function()
local Stats = game:GetService("Stats")
local StartTime = tick()
local LabelInstance = nil
-- Wait a second for UI to appear
task.wait(1)
-- AUTO-FINDER: Find the TextLabel in the Library
local Container = Library.MainFrame or game:GetService("CoreGui")
for _, obj in pairs(Container:GetDescendants()) do
if obj:IsA("TextLabel") and obj.Text == "Loading Data..." then
LabelInstance = obj
LabelInstance.RichText = true -- Enable colors/emojis
break
end
end
while true do
-- 1. Uptime Calc
local Elapsed = tick() - StartTime
local h = math.floor(Elapsed / 3600)
local m = math.floor(Elapsed / 60) % 60
local s = math.floor(Elapsed % 60)
-- 2. Ping Value
local pingVal = 0
pcall(function() pingVal = Stats.Network.ServerStatsItem["Data Ping"]:GetValue() end)
-- 3. Ping Color Logic (Green -> Yellow -> Red)
local r, g, b = 90, 255, 90 -- Green (Good)
if pingVal > 180 then
r, g, b = 255, 65, 65 -- Deep Red
elseif pingVal > 110 then
r, g, b = 255, 140, 30 -- Orange
elseif pingVal > 70 then
r, g, b = 255, 230, 80 -- Yellow
end
-- 4. Component Formatting
-- PING: NUMBERms
local pingString = string.format('%.2fms', r, g, b, pingVal)
-- VERSION: Blue Color for 1.07
local verString = 'e1.07'
-- DATE: Adds Calendar Emoji
local dateString = os.date("%B %d, %Y") .. " 📅"
-- TIME & UPTIME
local timeString = os.date("%I:%M %p")
local uptimeString = string.format("[%02d:%02d:%02d]", h, m, s)
-- 5. Construct Final String
local finalString = string.format("âš™ Core Version: %s | %s | %s | %s %s",
verString, pingString, dateString, timeString, uptimeString)
-- 6. Apply to UI
if LabelInstance and LabelInstance.Parent then
LabelInstance.RichText = true
LabelInstance.Text = finalString
elseif Window.FooterLabel then
Window.FooterLabel.RichText = true
Window.FooterLabel.Text = finalString
end
task.wait(0.5)
end
end)
-- [[ END FOOTER UPDATER ]] --
local Tabs = {
Combat = Window:AddTab("Combat", "crosshair"),
Whitelist = Window:AddTab("Whitelist", "shield"),
Misc = Window:AddTab("Miscellaneous", "cog"),
User = Window:AddTab("User", "user"),
["UI Settings"] = Window:AddTab("UI Settings", "settings"),
Hitsound = Window:AddTab("", "sound"),
}
-- Aimbot Group
local AimbotGroup = Tabs.Combat:AddLeftGroupbox("Aim")
AimbotGroup:AddToggle("AimbotEnabled", {
Text = "Aimbot",
Default = false,
Callback = function(value)
if FOVCircle then
FOVCircle.Visible = value and Toggles.FovVisible.Value
end
end,
})
-- THIS IS THE MAIN TEAM CHECK USED EVERYWHERE
AimbotGroup:AddToggle("TeamCheck", { Text = "Team Check", Default = true })
-- THIS IS THE MAIN WALL CHECK USED BY SILENT AIM TOO
AimbotGroup:AddToggle("WallCheck", { Text = "Wall Check", Default = true })
AimbotGroup:AddToggle("HealthCheck", { Text = "Health Check", Default = true })
AimbotGroup:AddToggle("ForceFieldCheck", { Text = "ForceField Check", Default = true })
AimbotGroup:AddSlider("MinHealth", {
Text = "Min Health to Aim",
Default = 0,
Min = 0,
Max = 100,
Rounding = 0,
})
AimbotGroup:AddLabel("Aimbot Key"):AddKeyPicker("AimbotKeybind", {
Default = "Q",
Mode = "Hold",
Text = "Press to aim (hold)",
DefaultModifiers = {},
})
AimbotGroup:AddDivider()
AimbotGroup:AddDropdown("WallCheckMethod", {
Values = { "Center", "MultiRay" },
Default = 1,
Text = "Wall Check Method",
})
AimbotGroup:AddDropdown("AimMethod", {
Values = { "Mouse", "Camera" },
Default = 1,
Text = "Aim Method",
})
AimbotGroup:AddSlider("Prediction", {
Text = "Prediction",
Default = 0.18,
Min = 0,
Max = 0.5,
Rounding = 3,
})
-- NEW DEAD SWITCH DELAY
AimbotGroup:AddSlider("DeadDelay", {
Text = "Dead Switch Delay",
Default = 0.2,
Min = 0,
Max = 1,
Rounding = 2,
Tooltip = "Time to wait after target dies before aiming at a new one."
})
AimbotGroup:AddSlider("ReactionTimeX", {
Text = "X ms (Drift Time)",
Default = 500,
Min = 0,
Max = 1000,
Rounding = 0,
Callback = function(val)
ReactionDelayX = val / 1000
TargetReactionDelay = (ReactionDelayX + ReactionDelayY) / 2
end
})
AimbotGroup:AddSlider("ReactionTimeY", {
Text = "Y ms (Drift Time)",
Default = 500,
Min = 0,
Max = 1000,
Rounding = 0,
Callback = function(val)
ReactionDelayY = val / 1000
TargetReactionDelay = (ReactionDelayX + ReactionDelayY) / 2
end
})
AimbotGroup:AddSlider("SnapBackSpeed", {
Text = "Snap Back Speed",
Default = 5,
Min = 1,
Max = 20,
Rounding = 1,
Tooltip = "Used when catching up from far away. 1=Instant, 20=Smooth."
})
AimbotGroup:AddSlider("XSmoothness", {
Text = "X Smoothness",
Default = 5,
Min = 1,
Max = 20,
})
AimbotGroup:AddSlider("YSmoothness", {
Text = "Y Smoothness",
Default = 5,
Min = 1,
Max = 20,
})
AimbotGroup:AddSlider("MaxDistance", {
Text = "Aim Distance",
Default = 500,
Min = 50,
Max = 2000,
})
AimbotGroup:AddDivider()
AimbotGroup:AddDropdown("AimPart", {
Values = { "Head", "UpperTorso", "HumanoidRootPart" },
Default = 1,
Text = "AimPart",
})
AimbotGroup:AddLabel("Fov Color"):AddColorPicker("FovColor", {
Default = Color3.new(1,1,1),
})
AimbotGroup:AddDivider()
AimbotGroup:AddSlider("FOVRadius", {
Text = "FOV Size",
Default = 200,
Min = 10,
Max = 500,
})
AimbotGroup:AddToggle("FovVisible", {
Text = "Show FOV Circle",
Default = true,
Callback = function(val)
if FOVCircle then
FOVCircle.Visible = Toggles.AimbotEnabled.Value and val
end
end,
})
AimbotGroup:AddToggle("RainbowFov", {
Text = "Rainbow FOV",
Default = false,
})
-- Prediction Foreshadow Settings
AimbotGroup:AddDivider()
AimbotGroup:AddToggle("PredictionForeshadow", {
Text = "Prediction Foreshadow",
Default = false,
})
AimbotGroup:AddLabel("Ghost Color"):AddColorPicker("GhostColor", {
Default = Color3.fromRGB(120, 120, 120),
})
AimbotGroup:AddSlider("GhostTransparency", {
Text = "Ghost Transparency",
Default = 0.5,
Min = 0,
Max = 1,
Rounding = 2,
})
local WhitelistGroup = Tabs.Whitelist:AddLeftGroupbox("Whitelists")
WhitelistGroup:AddDropdown("PlayerWhitelist", {
SpecialType = "Player",
ExcludeLocalPlayer = true,
Multi = true,
Text = "Player Whitelist",
Tooltip = "Whitelisted players cannot be aimed at",
})
WhitelistGroup:AddDropdown("TeamWhitelist", {
SpecialType = "Team",
Multi = true,
Text = "Team Whitelist",
Tooltip = "Whitelisted teams cannot be aimed at",
})
WhitelistGroup:AddDivider()
WhitelistGroup:AddLabel("ESP Whitelists")
WhitelistGroup:AddDropdown("ESPPlayerWhitelist", {
SpecialType = "Player",
ExcludeLocalPlayer = true,
Multi = true,
Text = "ESP Player Whitelist",
Tooltip = "Whitelisted players will not show on ESP",
})
WhitelistGroup:AddDropdown("ESPTeamWhitelist", {
SpecialType = "Team",
Multi = true,
Text = "ESP Team Whitelist",
Tooltip = "Whitelisted teams will not show on ESP",
})
-- Misc Group
local MiscGroup = Tabs.Misc:AddLeftGroupbox("Miscellaneous")
MiscGroup:AddToggle("AimNPCs", { Text = "Aim NPCs", Default = false })
MiscGroup:AddToggle("InfDistance", { Text = "Infinite Distance", Default = false })
MiscGroup:AddToggle("AimVisibleParts", { Text = "Aim Visible Parts", Default = false, Tooltip = "Automatically aims at any visible limb if main part is hidden." })
MiscGroup:AddToggle("OutwallAim", { Text = "Outwall Aim", Default = false })
-- Full Bright Implementation
local Lighting = game:GetService("Lighting")
local OriginalLighting = {
Brightness = Lighting.Brightness,
ClockTime = Lighting.ClockTime,
FogEnd = Lighting.FogEnd,
Ambient = Lighting.Ambient
}
MiscGroup:AddToggle("FullBright", {
Text = "Full Bright",
Default = false,
Callback = function(Value)
if Value then
Lighting.Brightness = 2
Lighting.ClockTime = 14
Lighting.FogEnd = 100000
Lighting.Ambient = Color3.new(1,1,1)
else
Lighting.Brightness = OriginalLighting.Brightness
Lighting.ClockTime = OriginalLighting.ClockTime
Lighting.FogEnd = OriginalLighting.FogEnd
Lighting.Ambient = OriginalLighting.Ambient
end
end
})
-- Visuals Group
local VisualsGroup = Tabs.Combat:AddRightGroupbox("Visuals")
VisualsGroup:AddToggle("ESPEnabled", {
Text = "Enable ESP",
Default = false,
Callback = function(value)
ESP.Enabled = value
end,
})
VisualsGroup:AddToggle("ESPBox", { Text = "Box", Default = true, Callback = function(value)
ESP.Drawing.Boxes.Full.Enabled = value
ESP.Drawing.Boxes.Corner.Enabled = value
end })
VisualsGroup:AddLabel("Box Color"):AddColorPicker("ESPBoxColor", { Default = Color3.new(1,1,1), Callback = function(value)
ESP.Drawing.Boxes.GradientRGB1 = value
ESP.Drawing.Boxes.GradientFillRGB1 = value
end })
VisualsGroup:AddToggle("ESPBoxFilled", { Text = "Fill Box", Default = false, Callback = function(value)
ESP.Drawing.Boxes.Filled.Enabled = value
end })
VisualsGroup:AddLabel("Filled Box Color"):AddColorPicker("ESPBoxFillColor", { Default = Color3.new(1,0,0), Callback = function(value)
ESP.Drawing.Boxes.Filled.RGB = value
end })
VisualsGroup:AddSlider("ESPBoxFillTransparency", {
Text = "Fill Box Transparency",
Default = 0.5,
Min = 0,
Max = 1,
Rounding = 2,
Callback = function(value)
ESP.Drawing.Boxes.Filled.Transparency = value * 100
end,
})
VisualsGroup:AddToggle("ESPName", { Text = "Name", Default = true, Callback = function(value)
ESP.Drawing.Names.Enabled = value
end })
VisualsGroup:AddToggle("ESPDistance", { Text = "Distance", Default = true, Callback = function(value)
ESP.Drawing.Distances.Enabled = value
end })
VisualsGroup:AddToggle("ESPHealth", { Text = "Health Bar", Default = true, Callback = function(value)
ESP.Drawing.Healthbar.Enabled = value
end })
VisualsGroup:AddToggle("ESPTool", { Text = "Tool", Default = true, Callback = function(value)
ESP.Drawing.Weapons.Enabled = value
end })
VisualsGroup:AddToggle("ESPHideTeam", { Text = "Hide Teammates", Default = true, Callback = function(value)
ESP.TeamCheck = value
end })
VisualsGroup:AddSlider("ESPMaxDistance", {
Text = "Max Distance",
Default = 200,
Min = 100,
Max = 5000,
Rounding = 0,
Callback = function(val)
ESP.MaxDistance = val
end
})
VisualsGroup:AddDivider()
VisualsGroup:AddLabel("ESP Color"):AddColorPicker("ESPColor", { Default = Color3.new(1,1,1), Callback = function(value)
ESP.Drawing.Weapons.WeaponTextRGB = value
ESP.Drawing.Healthbar.HealthTextRGB = value
ESP.Drawing.Names.RGB = value
ESP.Drawing.Distances.RGB = value
-- Add more if needed
end })
VisualsGroup:AddToggle("RainbowESP", { Text = "Rainbow ESP", Default = false })
VisualsGroup:AddToggle("ChamsEnabled", {
Text = "Chams",
Default = false,
Callback = function(value)
ESP.Drawing.Chams.Enabled = value
end,
})
VisualsGroup:AddLabel("Chams Color"):AddColorPicker("ChamsColor", { Default = Color3.new(1,1,1), Callback = function(value)
ESP.Drawing.Chams.FillRGB = value
ESP.Drawing.Chams.OutlineRGB = value
end })
VisualsGroup:AddSlider("ESPFontSize", {
Text = "Text Size",
Default = 1,
Min = 1,
Max = 3,
Rounding = 0,
Callback = function(val)
ESP.FontSize = 11 + (val - 1) * 22
end
})
-- Hitsound Group
local HitsoundGroup = Tabs.Hitsound:AddLeftGroupbox("Hitsound.")
HitsoundGroup:AddToggle("HitsoundEnabled", {
Text = "Enable Hitsound",
Default = false,
})
HitsoundGroup:AddDropdown("HitsoundType", {
Values = { "neverlose.cc", "fatality.win", "bameware.club", "skeet.cc", "rifk7.com", "primordial.dev" },
Default = 1,
Text = "Hitsound",
})
HitsoundGroup:AddSlider("HitsoundVolume", {
Text = "Volume",
Default = 3,
Min = 0,
Max = 10,
Rounding = 1,
Callback = function(val)
if HitSound then
HitSound.Volume = val
end
end,
})
-- Create the sound instance
-- REPLACED INVALID ID WITH A WORKING ONE (Rust Hitsound)
local HitSound = Instance.new("Sound")
HitSound.Parent = game:GetService("SoundService")
HitSound.SoundId = "rbxassetid://97643101798871"
HitSound.Volume = 3 -- Increased volume
-- Preload all possible hitsounds to eliminate loading delay
local ContentProvider = game:GetService("ContentProvider")
local soundIds = {
"rbxassetid://97643101798871",
"rbxassetid://106586644436584",
"rbxassetid://92614567965693",
"rbxassetid://4817809188",
"rbxassetid://76064874887167",
"rbxassetid://85340682645435"
}
ContentProvider:PreloadAsync(soundIds)
-- Options for changing HITSOUND ( by gemini 3 pro, grok 4.1 thinking)
Options.HitsoundType:OnChanged(function(value)
if value == "neverlose.cc" then
HitSound.SoundId = "rbxassetid://97643101798871"
elseif value == "fatality.win" then
HitSound.SoundId = "rbxassetid://106586644436584"
elseif value == "bameware.club" then
HitSound.SoundId = "rbxassetid://92614567965693"
elseif value == "skeet.cc" then
HitSound.SoundId = "rbxassetid://4817809188"
elseif value == "rifk7.com" then
HitSound.SoundId = "rbxassetid://76064874887167"
elseif value == "primordial.dev" then
HitSound.SoundId = "rbxassetid://85340682645435"
end
end)
-- ==========================================
-- REAL HITSOUND DETECTION LOGIC (FIXED)
-- ==========================================
local Players = game:GetService("Players")
local LocalPlayer = Players.LocalPlayer
local mouse = LocalPlayer:GetMouse() -- Ensure mouse is accessible
local Debris = game:GetService("Debris")
local function HookHitsound(char)
local hum = char:WaitForChild("Humanoid", 10)
if not hum then return end
local lastHealth = hum.Health
hum.HealthChanged:Connect(function(newHealth)
if newHealth < lastHealth then
-- Damage detected
if Toggles.HitsoundEnabled.Value then
-- CHECK 1: Is this the current aimbot/triggerbot target?
local isTarget = (Target and char == Target)
-- CHECK 2: If no locked target, is the mouse directly over this enemy? (Manual Aim)
if not isTarget then
local mouseT = mouse.Target
if mouseT and mouseT:IsDescendantOf(char) then
isTarget = true
end
end
if isTarget then
local s = HitSound:Clone()
s.Parent = HitSound.Parent
s:Play()
s.Ended:Connect(function()
s:Destroy()
end)
end
end
end
lastHealth = newHealth
end)
end
-- Hook existing players
for _, plr in ipairs(Players:GetPlayers()) do
if plr ~= LocalPlayer then
if plr.Character then HookHitsound(plr.Character) end
plr.CharacterAdded:Connect(HookHitsound)
end
end
-- Hook new players
Players.PlayerAdded:Connect(function(plr)
if plr ~= LocalPlayer then
plr.CharacterAdded:Connect(HookHitsound)
end
end)
-- ==========================================
-- Legit / Blantant Tabs inside Combat
local TabBox = Tabs.Combat:AddRightTabbox("Legit / Blantant")
-- Legit Tab
local LegitTab = TabBox:AddTab("Legit")
LegitTab:AddToggle("StickyAim", { Text = "Sticky Aim", Default = false })
LegitTab:AddToggle("StickyWallCheck", { Text = "Sticky Wall Check", Default = false })
LegitTab:AddToggle("SwitchPart", {
Text = "Switch Part",
Default = false,
Tooltip = "Randomly switches aim target to look legit."
})
LegitTab:AddSlider("SwitchPartDelay", {
Text = "Switch Part Delay (s)",
Default = 2,
Min = 0.1,
Max = 10,
Rounding = 1,
Tooltip = "How long to aim at one part before switching."
})
LegitTab:AddToggle("TriggerDistanceCheck", { Text = "Trigger Distance Check", Default = false })
LegitTab:AddSlider("TriggerMaxDistance", {
Text = "Trigger Max Distance",
Default = 500,
Min = 50,
Max = 2000,
})
LegitTab:AddToggle("TriggerbotEnabled", { Text = "Triggerbot", Default = false })
LegitTab:AddToggle("TriggerbotWallCheck", { Text = "Triggerbot Wall Check", Default = false })
LegitTab:AddLabel("Triggerbot Key"):AddKeyPicker("TriggerbotKeybind", {
Default = "E",
Mode = "Hold",
Text = "Press to trigger (hold)",
DefaultModifiers = {},
})
-- Blantant Tab
local BlantantTab = TabBox:AddTab("Blantant")
BlantantTab:AddToggle("SilentAim", {
Text = "Silent Aim",
Default = false,
Callback = function(val) SilentAimSettings.Enabled = val end
})
BlantantTab:AddDropdown("SilentMethod", {
Values = {
"Raycast",
"FindPartOnRay",
"FindPartOnRayWithIgnoreList",
"FindPartOnRayWithWhitelist",
"ViewportPointToRay",
"ScreenPointToRay",
"CounterBlox"
},
Default = 1,
Text = "Silent Aim Method",
Callback = function(val) SilentAimSettings.SilentAimMethod = val end
})
BlantantTab:AddDropdown("SilentTargetPart", {
Values = { "Head", "HumanoidRootPart", "Random" },
Default = 1,
Text = "Target Part",
Callback = function(val) SilentAimSettings.TargetPart = val end
})
BlantantTab:AddSlider("SilentHitChance", {
Text = "Hit Chance",
Default = 100,
Min = 0,
Max = 100,
Rounding = 0,
Callback = function(val) SilentAimSettings.HitChance = val end
})
-- REMOVED: Redundant Visible Check Toggle (Will use main WallCheck instead)
-- REMOVED: Redundant Team Check Toggle (Uses main TeamCheck)
BlantantTab:AddToggle("SilentAliveCheck", {
Text = "Alive Check",
Default = true,
Callback = function(val) SilentAimSettings.AliveCheck = val end
})
BlantantTab:AddToggle("BulletTP", {
Text = "Bullet Teleport",
Default = false,
Callback = function(val) SilentAimSettings.BulletTP = val end
})
BlantantTab:AddLabel("Team check and Wall check is on The Aim section.")
-- Services
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local Camera = workspace.CurrentCamera
local LocalCharacter = LocalPlayer.Character or LocalPlayer.CharacterAdded:Wait()
local LocalHumanoidRootPart = LocalCharacter:WaitForChild("HumanoidRootPart")
-- User Tab
local UserGroup = Tabs.User:AddLeftGroupbox("User Information")
UserGroup:AddLabel("Player executor: " .. (identifyexecutor() or "Unknown"))
UserGroup:AddLabel("Username: " .. LocalPlayer.Name)
UserGroup:AddLabel("Profile Name: " .. LocalPlayer.DisplayName)
local creationTime = os.time() - (LocalPlayer.AccountAge * 86400)
local creationDate = os.date("%Y-%m-%d", creationTime)
UserGroup:AddLabel("Account created: " .. creationDate)
LocalPlayer.CharacterAdded:Connect(function(char)
LocalCharacter = char
LocalHumanoidRootPart = char:WaitForChild("HumanoidRootPart")
end)
-- Initialize mouse behavior
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
UserInputService.MouseIconEnabled = true
-- Mouse Lock Fixes (Updated)
local function updateMouseLock()
local character = LocalPlayer.Character
if not character then return end
local head = character:FindFirstChild("Head")
local humanoid = character:FindFirstChildOfClass("Humanoid")
if not head or not humanoid then return end
local isFirstPerson = (Camera.CFrame.Position - head.Position).Magnitude < 1
local isRagdolled = humanoid:GetState() == Enum.HumanoidStateType.Physics
local isShiftLock = not isRagdolled and humanoid.AutoRotate == false
local rightClickPressed = UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton2)
if isRagdolled then
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
UserInputService.MouseIconEnabled = true
elseif isFirstPerson then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
UserInputService.MouseIconEnabled = true
elseif isShiftLock then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
UserInputService.MouseIconEnabled = true
else
if not rightClickPressed then
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
UserInputService.MouseIconEnabled = true
end
end
end
-- Helper: extremely robust check for dropdown/multi selection values
local function selectionContains(selection, value)
if selection == nil then return false end
if selection == value then return true end
local targetName = nil
local targetUserId = nil
local targetTeamName = nil
local targetIsPlayer = false
local targetIsTeam = false
if typeof(value) == "Instance" then
if value:IsA("Player") then
targetIsPlayer = true
targetName = value.Name
targetUserId = value.UserId
elseif value:IsA("Team") then
targetIsTeam = true
targetTeamName = value.Name
else
targetName = value.Name
end
else
targetName = tostring(value)
local n = tonumber(value)
if n then targetUserId = n end
end
local tsel = typeof(selection)
if tsel == "string" or tsel == "number" then
if tostring(selection) == tostring(value) then return true end
end
if typeof(selection) == "Instance" then
if selection:IsA("Player") and targetIsPlayer then
if selection.UserId == targetUserId or selection.Name == targetName then return true end
end
if selection:IsA("Team") and targetIsTeam then
if selection.Name == targetTeamName then return true end
end
end
local hasNumericKey = false
if type(selection) == "table" then
for k,_ in pairs(selection) do
if type(k) == "number" then
hasNumericKey = true
break
end
end
end
if hasNumericKey then
for _, entry in ipairs(selection) do
if typeof(entry) == "Instance" then
if entry:IsA("Player") and targetIsPlayer then
if entry.UserId == targetUserId or entry.Name == targetName then return true end
elseif entry:IsA("Team") and targetIsTeam then
if entry.Name == targetTeamName then return true end
else
if tostring(entry) == tostring(value) then return true end
end
elseif type(entry) == "table" then
for k,v in pairs(entry) do
if type(k) == "string" and k == targetName then return true end
if tostring(v) == targetName then return true end
local num = tonumber(v)
if num and targetUserId and num == targetUserId then return true end
end
else
if tostring(entry) == targetName then return true end
local n = tonumber(entry)
if n and targetUserId and n == targetUserId then return true end
end
end
return false
end
if type(selection) == "table" then
for k,v in pairs(selection) do
if typeof(k) == "Instance" and k:IsA("Player") then
if targetIsPlayer and (k.UserId == targetUserId or k.Name == targetName) then return true end
end
if typeof(k) == "Instance" and k:IsA("Team") then
if targetIsTeam and k.Name == targetTeamName then return true end
end
if type(k) == "string" then
if targetIsPlayer and k == targetName then return true end
if targetIsTeam and k == targetTeamName then return true end
end
if typeof(v) == "Instance" then
if v:IsA("Player") and targetIsPlayer then
if v.UserId == targetUserId or v.Name == targetName then return true end
elseif v:IsA("Team") and targetIsTeam then
if v.Name == targetTeamName then return true end
end
else
if tostring(v) == targetName then return true end
local num = tonumber(v)
if num and targetUserId and num == targetUserId then return true end
end
end
end
return false
end
-- ============================================
-- HELPER: GET AIM PART (HANDLES R6/R15 NPC/PLAYER)
-- ============================================
local function getAimPart(character, forcedPartName)
if not character then return nil end
local partName = forcedPartName or Options.AimPart.Value
local part = character:FindFirstChild(partName)
-- Fallback for R6 NPCs/Players who don't have UpperTorso
if not part then
if partName == "UpperTorso" then
part = character:FindFirstChild("Torso")
elseif partName == "LowerTorso" then
part = character:FindFirstChild("Torso")
end
end
return part
end
-- ============================================
-- NEW SILENT AIM IMPLEMENTATION
-- ============================================
-- ============================================
-- SILENT AIM VARIABLES & FUNCTIONS
-- ============================================
local ScriptState = { ClosestHitPart = nil }
local SilentAimSettings = {
Enabled = false,
TeamCheck = false,
VisibleCheck = false,
AliveCheck = true,
TargetPart = "HumanoidRootPart",
SilentAimMethod = "Raycast",
FOVRadius = 130,
HitChance = 100,
MultiplyUnitBy = 1000,
BulletTP = false,
}
local ExpectedArguments = {
ViewportPointToRay = { ArgCountRequired = 2, Args = { "number", "number" } },
ScreenPointToRay = { ArgCountRequired = 2, Args = { "number", "number" } },
Raycast = { ArgCountRequired = 3, Args = { "Instance", "Vector3", "Vector3", "RaycastParams" } },
FindPartOnRay = { ArgCountRequired = 2, Args = { "Ray", "Instance?", "boolean?", "boolean?" } },
FindPartOnRayWithIgnoreList = { ArgCountRequired = 2, Args = { "Ray", "table", "boolean?", "boolean?" } },
FindPartOnRayWithWhitelist = { ArgCountRequired = 2, Args = { "Ray", "table", "boolean?" } }
}
local function CalculateChance(Percentage)
Percentage = math.floor(Percentage)
local chance = math.floor(Random.new().NextNumber(Random.new(), 0, 1) * 100) / 100
return chance <= Percentage / 100
end
local function getDirection(Origin, Position)
return (Position - Origin).Unit
end
local function ValidateArguments(Args, RayMethod)
local Matches = 0
if #Args < RayMethod.ArgCountRequired then return false end
for Pos, Argument in next, Args do
local Expected = RayMethod.Args[Pos]
if not Expected then break end
local IsOptional = Expected:sub(-1) == "?"
local BaseType = IsOptional and Expected:sub(1, -2) or Expected
if typeof(Argument) == BaseType then Matches = Matches + 1
elseif IsOptional and Argument == nil then Matches = Matches + 1 end
end
return Matches >= RayMethod.ArgCountRequired
end
-- Uses Silent Aim specific checks (not the general IsVisible function)
local function IsPlayerVisibleSilent(Player)
local PlayerCharacter = Player and Player.Character
local LocalPlayerCharacter = LocalPlayer.Character
if not (PlayerCharacter and LocalPlayerCharacter) then return false end
local targetPartName = (SilentAimSettings.TargetPart == "Random") and "HumanoidRootPart" or SilentAimSettings.TargetPart
local PlayerRoot = PlayerCharacter:FindFirstChild(targetPartName) or PlayerCharacter:FindFirstChild("HumanoidRootPart")
if not PlayerRoot then return false end
local CastPoints = { PlayerRoot.Position, LocalPlayerCharacter, PlayerCharacter }
local IgnoreList = { LocalPlayerCharacter, PlayerCharacter }
local ObscuringObjects = #Camera:GetPartsObscuringTarget(CastPoints, IgnoreList)
return ObscuringObjects == 0
end
local function getClosestPlayerSilent()
-- FIX: Using the global robust 'selectionContains' instead of redefining a weak one here
local radiusOption = Options.FOVRadius.Value
if Toggles.InfDistance.Value then radiusOption = math.huge end
-- UPDATED: Use Main WallCheck (Visible Check)
local visibleCheck = (Toggles.WallCheck and Toggles.WallCheck.Value)
-- UPDATED: Use the Main Team Check Toggle
local teamCheck = (Toggles.TeamCheck and Toggles.TeamCheck.Value)
local aliveCheck = (Toggles.SilentAliveCheck and Toggles.SilentAliveCheck.Value)
local targetPartOption = (Options.SilentTargetPart and Options.SilentTargetPart.Value) or "HumanoidRootPart"
local ClosestPart = nil
local DistanceToMouse = radiusOption
local MousePos = UserInputService:GetMouseLocation()
for _, Player in ipairs(Players:GetPlayers()) do
if Player == LocalPlayer then continue end
if teamCheck and LocalPlayer.Team and Player.Team == LocalPlayer.Team then continue end
local Character = Player.Character
if not Character then continue end
-- Use Obsidian Whitelists (Updated to use global helper and objects)
local playerWL = (Options.PlayerWhitelist and Options.PlayerWhitelist.Value) or {}
local teamWL = (Options.TeamWhitelist and Options.TeamWhitelist.Value) or {}
-- Fix: Check if player object or team object is whitelisted (better than Name string match)
if selectionContains(playerWL, Player) then continue end
if Player.Team and selectionContains(teamWL, Player.Team) then continue end
local Humanoid = Character:FindFirstChild("Humanoid")
local HRP = Character:FindFirstChild("HumanoidRootPart")
if not HRP or not Humanoid then continue end
if aliveCheck and Humanoid.Health <= 0 then continue end
if Toggles.ForceFieldCheck.Value and Character:FindFirstChildOfClass("ForceField") then continue end
if visibleCheck and not IsPlayerVisibleSilent(Player) then continue end
local ScreenPosition, OnScreen = Camera:WorldToScreenPoint(HRP.Position)
if not Toggles.InfDistance.Value and not OnScreen then continue end
local Distance = (Vector2.new(MousePos.X, MousePos.Y) - Vector2.new(ScreenPosition.X, ScreenPosition.Y)).Magnitude
if Distance <= DistanceToMouse then
local chosenPart = targetPartOption
if targetPartOption == "Random" then
local parts = {"Head", "HumanoidRootPart", "UpperTorso"}
chosenPart = parts[math.random(1, #parts)]
end
local candidatePart = Character:FindFirstChild(chosenPart)
if candidatePart then
ClosestPart = candidatePart
DistanceToMouse = Distance
end
end
end
return ClosestPart
end
-- Update Loop
RunService.RenderStepped:Connect(function()
-- Fix: Added AND condition for Toggles.AimbotEnabled.Value
if Toggles.SilentAim and Toggles.SilentAim.Value and Toggles.AimbotEnabled.Value then
ScriptState.ClosestHitPart = getClosestPlayerSilent()
else
ScriptState.ClosestHitPart = nil
end
end)
-- HOOK
local oldNamecall
oldNamecall = hookmetamethod(game, "__namecall", newcclosure(function(...)
local Method = getnamecallmethod()
local Arguments = {...}
local self = Arguments[1]
-- Fix: Added AND condition for Toggles.AimbotEnabled.Value
local enabled = Toggles.SilentAim and Toggles.SilentAim.Value and Toggles.AimbotEnabled.Value
local chance = CalculateChance((Options.SilentHitChance and Options.SilentHitChance.Value) or 100)
if not checkcaller() and enabled and self == workspace and chance then
local HitPart = ScriptState.ClosestHitPart
if HitPart then
local function computeRay(origin)
local adjustedOrigin = origin
if Toggles.BulletTP and Toggles.BulletTP.Value then
adjustedOrigin = (HitPart.CFrame * CFrame.new(0, 0, 1)).p
end
local multiplier = SilentAimSettings.MultiplyUnitBy or 1000
local direction = getDirection(adjustedOrigin, HitPart.Position) * multiplier
return adjustedOrigin, direction
end
local currentMethod = (Options.SilentMethod and Options.SilentMethod.Value) or "Raycast"
if Method == "Raycast" and currentMethod == "Raycast" then
if ValidateArguments(Arguments, ExpectedArguments.Raycast) then
local Origin, Direction = computeRay(Arguments[2])
Arguments[2] = Origin
Arguments[3] = Direction
return oldNamecall(unpack(Arguments))
end
elseif (Method == "FindPartOnRay" or Method == "findPartOnRay") and currentMethod == "FindPartOnRay" then
if ValidateArguments(Arguments, ExpectedArguments.FindPartOnRay) then
local Origin, Direction = computeRay(Arguments[2].Origin)
Arguments[2] = Ray.new(Origin, Direction)
return oldNamecall(unpack(Arguments))
end
elseif Method == "FindPartOnRayWithIgnoreList" and currentMethod == "FindPartOnRayWithIgnoreList" then
if ValidateArguments(Arguments, ExpectedArguments.FindPartOnRayWithIgnoreList) then
local Origin, Direction = computeRay(Arguments[2].Origin)
Arguments[2] = Ray.new(Origin, Direction)
return oldNamecall(unpack(Arguments))
end
elseif Method == "FindPartOnRayWithWhitelist" and currentMethod == "FindPartOnRayWithWhitelist" then
if ValidateArguments(Arguments, ExpectedArguments.FindPartOnRayWithWhitelist) then
local Origin, Direction = computeRay(Arguments[2].Origin)
Arguments[2] = Ray.new(Origin, Direction)
return oldNamecall(unpack(Arguments))
end
elseif Method == "FindPartOnRayWithIgnoreList" and currentMethod == "CounterBlox" then
local Origin, Direction = computeRay(Arguments[2].Origin)
Arguments[2] = Ray.new(Origin, Direction)
return oldNamecall(unpack(Arguments))
end
end
end
return oldNamecall(...)
end))
-- ============================================
-- END SILENT AIM
-- ============================================
local function isVisible(part)
if not Toggles.WallCheck.Value or not part then return true end
local origin = Camera.CFrame.Position
local method = Options.WallCheckMethod.Value
local params = RaycastParams.new()
params.FilterType = Enum.RaycastFilterType.Blacklist
params.FilterDescendantsInstances = {LocalPlayer.Character}
if method == "Center" then
local direction = (part.Position - origin)
local result = workspace:Raycast(origin, direction, params)
if not result then return true end
return result.Instance:IsDescendantOf(part.Parent)
elseif method == "MultiRay" then
-- Cast to center
local direction = (part.Position - origin)
local result = workspace:Raycast(origin, direction, params)
if not result or result.Instance:IsDescendantOf(part.Parent) then return true end
-- If center blocked, check 4 offsets
local offsetAmount = part.Size.Magnitude / 4 -- small offset
local offsets = {
Vector3.new(offsetAmount, 0, 0),
Vector3.new(-offsetAmount, 0, 0),
Vector3.new(0, offsetAmount, 0),
Vector3.new(0, -offsetAmount, 0),
}
for _, offset in offsets do
local targetPos = part.Position + part.CFrame:VectorToWorldSpace(offset)
direction = (targetPos - origin)
result = workspace:Raycast(origin, direction, params)
if not result or result.Instance:IsDescendantOf(part.Parent) then return true end
end
return false
end
end
-- FOV Circle - THINNER
local FOVCircle
pcall(function()
FOVCircle = Drawing.new("Circle")
FOVCircle.Thickness = 1 -- Thinner FOV circle
FOVCircle.Filled = false
FOVCircle.Transparency = 1
FOVCircle.Color = Color3.new(1,1,1)
FOVCircle.Visible = false
end)
local hue = 0
--[[
WARNING: Heads up! This script has not been verified by ScriptBlox. Use at your own risk!
]]
local Workspace, RunService, Players, CoreGui, Lighting = cloneref(game:GetService("Workspace")), cloneref(game:GetService("RunService")), cloneref(game:GetService("Players")), game:GetService("CoreGui"), cloneref(game:GetService("Lighting"))
local ESP = {
Enabled = Toggles.ESPEnabled.Value,
TeamCheck = Toggles.ESPHideTeam.Value,
MaxDistance = Options.ESPMaxDistance.Value,
FontSize = 11 + (Options.ESPFontSize.Value - 1) * 22,
FadeOut = {
OnDistance = true,
OnDeath = false,
OnLeave = false,
},
Options = {
Teamcheck = false, TeamcheckRGB = Color3.fromRGB(0, 255, 0),
Friendcheck = true, FriendcheckRGB = Color3.fromRGB(0, 255, 0),
Highlight = false, HighlightRGB = Color3.fromRGB(255, 0, 0),
},
Drawing = {
Chams = {
Enabled = Toggles.ChamsEnabled.Value,
Thermal = true,
FillRGB = Options.ChamsColor.Value,
Fill_Transparency = 50,
OutlineRGB = Options.ChamsColor.Value,
Outline_Transparency = 0,
VisibleCheck = true,
},
Names = {
Enabled = Toggles.ESPName.Value,
RGB = Options.ESPColor.Value,
},
Flags = {
Enabled = true,
},
Distances = {
Enabled = Toggles.ESPDistance.Value,
Position = "Bottom",
RGB = Options.ESPColor.Value,
},
Weapons = {
Enabled = Toggles.ESPTool.Value, WeaponTextRGB = Options.ESPColor.Value,
Outlined = false,
Gradient = false,
GradientRGB1 = Color3.fromRGB(255, 255, 255), GradientRGB2 = Color3.fromRGB(119, 120, 255),
},
Healthbar = {
Enabled = Toggles.ESPHealth.Value,
HealthText = true, Lerp = false, HealthTextRGB = Options.ESPColor.Value,
Width = 2.5,
Gradient = true, GradientRGB1 = Color3.fromRGB(200, 0, 0), GradientRGB2 = Color3.fromRGB(60, 60, 125), GradientRGB3 = Color3.fromRGB(119, 120, 255),
},
Boxes = {
Animate = true,
RotationSpeed = 300,
Gradient = false, GradientRGB1 = Options.ESPBoxColor.Value, GradientRGB2 = Color3.fromRGB(0, 0, 0),
GradientFill = true, GradientFillRGB1 = Options.ESPBoxColor.Value, GradientFillRGB2 = Color3.fromRGB(0, 0, 0),
Filled = {
Enabled = Toggles.ESPBoxFilled.Value,
Transparency = Options.ESPBoxFillTransparency.Value * 100,
RGB = Options.ESPBoxFillColor.Value,
},
Full = {
Enabled = Toggles.ESPBox.Value,
RGB = Color3.fromRGB(255, 255, 255),
},
Corner = {
Enabled = Toggles.ESPBox.Value,
RGB = Color3.fromRGB(255, 255, 255),
},
};
};
Connections = {
RunService = RunService;
};
Fonts = {};
}
-- Update ESP options when toggles change
Toggles.ESPEnabled:OnChanged(function(value)
ESP.Enabled = value
end)
Toggles.ESPHideTeam:OnChanged(function(value)
ESP.TeamCheck = value
end)
Toggles.ChamsEnabled:OnChanged(function(value)
ESP.Drawing.Chams.Enabled = value
end)
Toggles.ESPName:OnChanged(function(value)
ESP.Drawing.Names.Enabled = value
end)
Toggles.ESPDistance:OnChanged(function(value)
ESP.Drawing.Distances.Enabled = value
end)
Toggles.ESPHealth:OnChanged(function(value)
ESP.Drawing.Healthbar.Enabled = value
end)
Toggles.ESPTool:OnChanged(function(value)
ESP.Drawing.Weapons.Enabled = value
end)
Toggles.ESPBox:OnChanged(function(value)
ESP.Drawing.Boxes.Full.Enabled = value
ESP.Drawing.Boxes.Corner.Enabled = value
end)
Toggles.ESPBoxFilled:OnChanged(function(value)
ESP.Drawing.Boxes.Filled.Enabled = value
end)
Options.ESPBoxFillTransparency:OnChanged(function(value)
ESP.Drawing.Boxes.Filled.Transparency = value * 100
end)
Options.ESPBoxFillColor:OnChanged(function(value)
ESP.Drawing.Boxes.Filled.RGB = value
end)
Options.ESPBoxColor:OnChanged(function(value)
ESP.Drawing.Boxes.GradientRGB1 = value
ESP.Drawing.Boxes.GradientFillRGB1 = value
end)
Options.ESPColor:OnChanged(function(value)
ESP.Drawing.Weapons.WeaponTextRGB = value
ESP.Drawing.Healthbar.HealthTextRGB = value
ESP.Drawing.Names.RGB = value
ESP.Drawing.Distances.RGB = value
-- Add more if needed
end)
Options.ChamsColor:OnChanged(function(value)
ESP.Drawing.Chams.FillRGB = value
ESP.Drawing.Chams.OutlineRGB = value
end)
Options.ESPFontSize:OnChanged(function(value)
ESP.FontSize = 11 + (value - 1) * 22
end)
Options.ESPMaxDistance:OnChanged(function(value)
ESP.MaxDistance = value
end)
-- Def & Vars
local Euphoria = ESP.Connections;
local lplayer = Players.LocalPlayer;
local camera = game.Workspace.CurrentCamera;
local Cam = Workspace.CurrentCamera;
local RotationAngle, Tick = -45, tick();
-- Weapon Images
local Weapon_Icons = {
["Wooden Bow"] = "http://www.roblox.com/asset/?id=17677465400",
["Crossbow"] = "http://www.roblox.com/asset/?id=17677473017",
["Salvaged SMG"] = "http://www.roblox.com/asset/?id=17677463033",
["Salvaged AK47"] = "http://www.roblox.com/asset/?id=17677455113",
["Salvaged AK74u"] = "http://www.roblox.com/asset/?id=17677442346",
["Salvaged M14"] = "http://www.roblox.com/asset/?id=17677444642",
["Salvaged Python"] = "http://www.roblox.com/asset/?id=17677451737",
["Military PKM"] = "http://www.roblox.com/asset/?id=17677449448",
["Military M4A1"] = "http://www.roblox.com/asset/?id=17677479536",
["Bruno's M4A1"] = "http://www.roblox.com/asset/?id=17677471185",
["Military Barrett"] = "http://www.roblox.com/asset/?id=17677482998",
["Salvaged Skorpion"] = "http://www.roblox.com/asset/?id=17677459658",
["Salvaged Pump Action"] = "http://www.roblox.com/asset/?id=17677457186",
["Military AA12"] = "http://www.roblox.com/asset/?id=17677475227",
["Salvaged Break Action"] = "http://www.roblox.com/asset/?id=17677468751",
["Salvaged Pipe Rifle"] = "http://www.roblox.com/asset/?id=17677468751",
["Salvaged P250"] = "http://www.roblox.com/asset/?id=17677447257",
["Nail Gun"] = "http://www.roblox.com/asset/?id=17677484756"
};
-- Functions
local Functions = {}
do
function Functions:Create(Class, Properties)
local _Instance = typeof(Class) == 'string' and Instance.new(Class) or Class
for Property, Value in pairs(Properties) do
_Instance[Property] = Value
end
return _Instance;
end
--
function Functions:FadeOutOnDist(element, distance)
local transparency = math.max(0.1, 1 - (distance / ESP.MaxDistance))
if element:IsA("TextLabel") then
element.TextTransparency = 1 - transparency
elseif element:IsA("ImageLabel") then
element.ImageTransparency = 1 - transparency
elseif element:IsA("UIStroke") then
element.Transparency = 1 - transparency
elseif element:IsA("Frame") and (element == Healthbar or element == BehindHealthbar) then
element.BackgroundTransparency = 1 - transparency
elseif element:IsA("Frame") then
element.BackgroundTransparency = 1 - transparency
elseif element:IsA("Highlight") then
element.FillTransparency = 1 - transparency
element.OutlineTransparency = 1 - transparency
end;
end;
end;
do -- Initalize
local ScreenGui = Functions:Create("ScreenGui", {
Parent = CoreGui,
Name = "ESPHolder",
});
local DupeCheck = function(plr)
if ScreenGui:FindFirstChild(plr.Name) then
ScreenGui[plr.Name]:Destroy()
end
end
local ESPFunc = function(plr)
coroutine.wrap(DupeCheck)(plr) -- Dupecheck
local Folder = Functions:Create("Folder", {Parent = ScreenGui, Name = plr.Name})
local Name = Functions:Create("TextLabel", {Parent = Folder, Position = UDim2.new(0.5, 0, 0, -11), Size = UDim2.new(0, 100, 0, 20), AnchorPoint = Vector2.new(0.5, 0.5), BackgroundTransparency = 1, TextColor3 = Color3.fromRGB(255, 255, 255), Font = Enum.Font.Code, TextSize = ESP.FontSize, TextStrokeTransparency = 0, TextStrokeColor3 = Color3.fromRGB(0, 0, 0), RichText = true})
local Distance = Functions:Create("TextLabel", {Parent = Folder, Position = UDim2.new(0.5, 0, 0, 11), Size = UDim2.new(0, 100, 0, 20), AnchorPoint = Vector2.new(0.5, 0.5), BackgroundTransparency = 1, TextColor3 = Color3.fromRGB(255, 255, 255), Font = Enum.Font.Code, TextSize = ESP.FontSize, TextStrokeTransparency = 0, TextStrokeColor3 = Color3.fromRGB(0, 0, 0), RichText = true})
local Weapon = Functions:Create("TextLabel", {Parent = Folder, Position = UDim2.new(0.5, 0, 0, 31), Size = UDim2.new(0, 100, 0, 20), AnchorPoint = Vector2.new(0.5, 0.5), BackgroundTransparency = 1, TextColor3 = Color3.fromRGB(255, 255, 255), Font = Enum.Font.Code, TextSize = ESP.FontSize, TextStrokeTransparency = 0, TextStrokeColor3 = Color3.fromRGB(0, 0, 0), RichText = true})
local Box = Functions:Create("Frame", {Parent = Folder, BackgroundColor3 = Color3.fromRGB(0, 0, 0), BackgroundTransparency = 0.75, BorderSizePixel = 0})
local Gradient1 = Functions:Create("UIGradient", {Parent = Box, Enabled = ESP.Drawing.Boxes.GradientFill, Color = ColorSequence.new{ColorSequenceKeypoint.new(0, ESP.Drawing.Boxes.GradientFillRGB1), ColorSequenceKeypoint.new(1, ESP.Drawing.Boxes.GradientFillRGB2)}})
local Outline = Functions:Create("UIStroke", {Parent = Box, Enabled = ESP.Drawing.Boxes.Gradient, Transparency = 0, Color = Color3.fromRGB(255, 255, 255), LineJoinMode = Enum.LineJoinMode.Miter})
local Gradient2 = Functions:Create("UIGradient", {Parent = Outline, Enabled = ESP.Drawing.Boxes.Gradient, Color = ColorSequence.new{ColorSequenceKeypoint.new(0, ESP.Drawing.Boxes.GradientRGB1), ColorSequenceKeypoint.new(1, ESP.Drawing.Boxes.GradientRGB2)}})
local Healthbar = Functions:Create("Frame", {Parent = Folder, BackgroundColor3 = Color3.fromRGB(255, 255, 255), BackgroundTransparency = 0})
local BehindHealthbar = Functions:Create("Frame", {Parent = Folder, ZIndex = -1, BackgroundColor3 = Color3.fromRGB(0, 0, 0), BackgroundTransparency = 0})
local HealthbarGradient = Functions:Create("UIGradient", {Parent = Healthbar, Enabled = ESP.Drawing.Healthbar.Gradient, Rotation = -90, Color = ColorSequence.new{ColorSequenceKeypoint.new(0, ESP.Drawing.Healthbar.GradientRGB1), ColorSequenceKeypoint.new(0.5, ESP.Drawing.Healthbar.GradientRGB2), ColorSequenceKeypoint.new(1, ESP.Drawing.Healthbar.GradientRGB3)}})
local HealthText = Functions:Create("TextLabel", {Parent = Folder, Position = UDim2.new(0.5, 0, 0, 31), Size = UDim2.new(0, 100, 0, 20), AnchorPoint = Vector2.new(0.5, 0.5), BackgroundTransparency = 1, TextColor3 = Color3.fromRGB(255, 255, 255), Font = Enum.Font.Code, TextSize = ESP.FontSize, TextStrokeTransparency = 0, TextStrokeColor3 = Color3.fromRGB(0, 0, 0)})
local Chams = Functions:Create("Highlight", {Parent = Folder, FillTransparency = 1, OutlineTransparency = 0, OutlineColor = Color3.fromRGB(119, 120, 255), DepthMode = "AlwaysOnTop"})
local WeaponIcon = Functions:Create("ImageLabel", {Parent = Folder, BackgroundTransparency = 1, BorderColor3 = Color3.fromRGB(0, 0, 0), BorderSizePixel = 0, Size = UDim2.new(0, 40, 0, 40)})
local Gradient3 = Functions:Create("UIGradient", {Parent = WeaponIcon, Rotation = -90, Enabled = ESP.Drawing.Weapons.Gradient, Color = ColorSequence.new{ColorSequenceKeypoint.new(0, ESP.Drawing.Weapons.GradientRGB1), ColorSequenceKeypoint.new(1, ESP.Drawing.Weapons.GradientRGB2)}})
local LeftTop = Functions:Create("Frame", {Parent = Folder, BackgroundColor3 = ESP.Drawing.Boxes.Corner.RGB, Position = UDim2.new(0, 0, 0, 0)})
local LeftSide = Functions:Create("Frame", {Parent = Folder, BackgroundColor3 = ESP.Drawing.Boxes.Corner.RGB, Position = UDim2.new(0, 0, 0, 0)})
local RightTop = Functions:Create("Frame", {Parent = Folder, BackgroundColor3 = ESP.Drawing.Boxes.Corner.RGB, Position = UDim2.new(0, 0, 0, 0)})
local RightSide = Functions:Create("Frame", {Parent = Folder, BackgroundColor3 = ESP.Drawing.Boxes.Corner.RGB, Position = UDim2.new(0, 0, 0, 0)})
local BottomSide = Functions:Create("Frame", {Parent = Folder, BackgroundColor3 = ESP.Drawing.Boxes.Corner.RGB, Position = UDim2.new(0, 0, 0, 0)})
local BottomDown = Functions:Create("Frame", {Parent = Folder, BackgroundColor3 = ESP.Drawing.Boxes.Corner.RGB, Position = UDim2.new(0, 0, 0, 0)})
local BottomRightSide = Functions:Create("Frame", {Parent = Folder, BackgroundColor3 = ESP.Drawing.Boxes.Corner.RGB, Position = UDim2.new(0, 0, 0, 0)})
local BottomRightDown = Functions:Create("Frame", {Parent = Folder, BackgroundColor3 = ESP.Drawing.Boxes.Corner.RGB, Position = UDim2.new(0, 0, 0, 0)})
local Flag1 = Functions:Create("TextLabel", {Parent = Folder, Position = UDim2.new(1, 0, 0, 0), Size = UDim2.new(0, 100, 0, 20), AnchorPoint = Vector2.new(0.5, 0.5), BackgroundTransparency = 1, TextColor3 = Color3.fromRGB(255, 255, 255), Font = Enum.Font.Code, TextSize = ESP.FontSize, TextStrokeTransparency = 0, TextStrokeColor3 = Color3.fromRGB(0, 0, 0)})
local Flag2 = Functions:Create("TextLabel", {Parent = Folder, Position = UDim2.new(1, 0, 0, 0), Size = UDim2.new(0, 100, 0, 20), AnchorPoint = Vector2.new(0.5, 0.5), BackgroundTransparency = 1, TextColor3 = Color3.fromRGB(255, 255, 255), Font = Enum.Font.Code, TextSize = ESP.FontSize, TextStrokeTransparency = 0, TextStrokeColor3 = Color3.fromRGB(0, 0, 0)})
--
local Updater = function()
local Connection;
local function HideESP()
Box.Visible = false;
Name.Visible = false;
Distance.Visible = false;
Weapon.Visible = false;
Healthbar.Visible = false;
BehindHealthbar.Visible = false;
HealthText.Visible = false;
WeaponIcon.Visible = false;
LeftTop.Visible = false;
LeftSide.Visible = false
BottomSide.Visible = false;
BottomDown.Visible = false;
RightTop.Visible = false;
RightSide.Visible = false;
BottomRightSide.Visible = false;
BottomRightDown.Visible = false;
Flag1.Visible = false;
Chams.Enabled = false;
Flag2.Visible = false;
-- Safety check in case cleanup happens later
if not plr or not plr.Parent then
if Connection then Connection:Disconnect() end
Folder:Destroy()
end
end
--
Connection = Euphoria.RunService.RenderStepped:Connect(function()
-- 1. Check if player has left (Player Left Fix)
if not plr or not plr.Parent then
HideESP()
Connection:Disconnect()
return
end
local espPlayerWL = (Options.ESPPlayerWhitelist and Options.ESPPlayerWhitelist.Value) or {}
local espTeamWL = (Options.ESPTeamWhitelist and Options.ESPTeamWhitelist.Value) or {}
local player = plr
if selectionContains(espPlayerWL, player) or (player.Team and selectionContains(espTeamWL, player.Team)) then
HideESP()
return
end
if not ESP.Enabled then
HideESP()
return
end
-- 2. Check Validity & Health (Dead Text Fix)
if plr.Character and plr.Character:FindFirstChild("HumanoidRootPart") and plr.Character:FindFirstChild("Humanoid") then
local HRP = plr.Character.HumanoidRootPart
local Humanoid = plr.Character.Humanoid -- Used FindFirstChild above
-- DEAD CHECK: Hide instantly if health is <= 0
if Humanoid.Health <= 0 then
HideESP()
return
end
local Pos, OnScreen = Cam:WorldToScreenPoint(HRP.Position)
local Dist = (Cam.CFrame.Position - HRP.Position).Magnitude / 3.57142857
if OnScreen and Dist <= ESP.MaxDistance then
local rainbowColor = Color3.fromHSV(hue, 1, 1)
local boxColor = Toggles.RainbowESP.Value and rainbowColor or Options.ESPBoxColor.Value
local fillColor = Toggles.RainbowESP.Value and rainbowColor or Options.ESPBoxFillColor.Value
local textColor = Toggles.RainbowESP.Value and rainbowColor or Options.ESPColor.Value
local chamColor = Toggles.RainbowESP.Value and rainbowColor or Options.ChamsColor.Value
local Size = HRP.Size.Y
local scaleFactor = (Size * Cam.ViewportSize.Y) / (Pos.Z * 2)
local w, h = 3 * scaleFactor, 4.5 * scaleFactor
if ESP.FadeOut.OnDistance then
Functions:FadeOutOnDist(Box, Dist)
Functions:FadeOutOnDist(Outline, Dist)
Functions:FadeOutOnDist(Name, Dist)
Functions:FadeOutOnDist(Distance, Dist)
Functions:FadeOutOnDist(Weapon, Dist)
Functions:FadeOutOnDist(Healthbar, Dist)
Functions:FadeOutOnDist(BehindHealthbar, Dist)
Functions:FadeOutOnDist(HealthText, Dist)
Functions:FadeOutOnDist(WeaponIcon, Dist)
Functions:FadeOutOnDist(LeftTop, Dist)
Functions:FadeOutOnDist(LeftSide, Dist)
Functions:FadeOutOnDist(BottomSide, Dist)
Functions:FadeOutOnDist(BottomDown, Dist)
Functions:FadeOutOnDist(RightTop, Dist)
Functions:FadeOutOnDist(RightSide, Dist)
Functions:FadeOutOnDist(BottomRightSide, Dist)
Functions:FadeOutOnDist(BottomRightDown, Dist)
Functions:FadeOutOnDist(Chams, Dist)
Functions:FadeOutOnDist(Flag1, Dist)
Functions:FadeOutOnDist(Flag2, Dist)
end
if ESP.TeamCheck and plr ~= LocalPlayer and ((LocalPlayer.Team ~= plr.Team and plr.Team) or (not LocalPlayer.Team and not plr.Team)) and plr.Character and plr.Character:FindFirstChild("HumanoidRootPart") and plr.Character:FindFirstChild("Humanoid") then
do -- Chams
Chams.Adornee = plr.Character
Chams.Enabled = ESP.Drawing.Chams.Enabled
Chams.FillColor = chamColor
Chams.OutlineColor = chamColor
do -- Breathe
if ESP.Drawing.Chams.Thermal then
local breathe_effect = math.atan(math.sin(tick() * 2)) * 2 / math.pi
Chams.FillTransparency = ESP.Drawing.Chams.Fill_Transparency * breathe_effect * 0.01
Chams.OutlineTransparency = ESP.Drawing.Chams.Outline_Transparency * breathe_effect * 0.01
else
Chams.FillTransparency = ESP.Drawing.Chams.Fill_Transparency * 0.01
Chams.OutlineTransparency = ESP.Drawing.Chams.Outline_Transparency * 0.01
end
end
if ESP.Drawing.Chams.VisibleCheck then
Chams.DepthMode = "Occluded"
else
Chams.DepthMode = "AlwaysOnTop"
end
end;
do -- Corner Boxes
LeftTop.Visible = ESP.Drawing.Boxes.Corner.Enabled
LeftTop.Position = UDim2.new(0, Pos.X - w / 2, 0, Pos.Y - h / 2)
LeftTop.Size = UDim2.new(0, w / 5, 0, 1)
LeftTop.BackgroundColor3 = boxColor
LeftSide.Visible = ESP.Drawing.Boxes.Corner.Enabled
LeftSide.Position = UDim2.new(0, Pos.X - w / 2, 0, Pos.Y - h / 2)
LeftSide.Size = UDim2.new(0, 1, 0, h / 5)
LeftSide.BackgroundColor3 = boxColor
BottomSide.Visible = ESP.Drawing.Boxes.Corner.Enabled
BottomSide.Position = UDim2.new(0, Pos.X - w / 2, 0, Pos.Y + h / 2)
BottomSide.Size = UDim2.new(0, 1, 0, h / 5)
BottomSide.AnchorPoint = Vector2.new(0, 5)
BottomSide.BackgroundColor3 = boxColor
BottomDown.Visible = ESP.Drawing.Boxes.Corner.Enabled
BottomDown.Position = UDim2.new(0, Pos.X - w / 2, 0, Pos.Y + h / 2)
BottomDown.Size = UDim2.new(0, w / 5, 0, 1)
BottomDown.AnchorPoint = Vector2.new(0, 1)
BottomDown.BackgroundColor3 = boxColor
RightTop.Visible = ESP.Drawing.Boxes.Corner.Enabled
RightTop.Position = UDim2.new(0, Pos.X + w / 2, 0, Pos.Y - h / 2)
RightTop.Size = UDim2.new(0, w / 5, 0, 1)
RightTop.AnchorPoint = Vector2.new(1, 0)
RightTop.BackgroundColor3 = boxColor
RightSide.Visible = ESP.Drawing.Boxes.Corner.Enabled
RightSide.Position = UDim2.new(0, Pos.X + w / 2, 0, Pos.Y - h / 2)
RightSide.Size = UDim2.new(0, 1, 0, h / 5)
RightSide.AnchorPoint = Vector2.new(0, 0)
RightSide.BackgroundColor3 = boxColor
BottomRightSide.Visible = ESP.Drawing.Boxes.Corner.Enabled
BottomRightSide.Position = UDim2.new(0, Pos.X + w / 2, 0, Pos.Y + h / 2)
BottomRightSide.Size = UDim2.new(0, 1, 0, h / 5)
BottomRightSide.AnchorPoint = Vector2.new(1, 1)
BottomRightSide.BackgroundColor3 = boxColor
BottomRightDown.Visible = ESP.Drawing.Boxes.Corner.Enabled
BottomRightDown.Position = UDim2.new(0, Pos.X + w / 2, 0, Pos.Y + h / 2)
BottomRightDown.Size = UDim2.new(0, w / 5, 0, 1)
BottomRightDown.AnchorPoint = Vector2.new(1, 1)
BottomRightDown.BackgroundColor3 = boxColor
end
do -- Boxes
Box.Position = UDim2.new(0, Pos.X - w / 2, 0, Pos.Y - h / 2)
Box.Size = UDim2.new(0, w, 0, h)
Box.Visible = ESP.Drawing.Boxes.Full.Enabled;
-- Gradient
if ESP.Drawing.Boxes.Filled.Enabled then
Box.BackgroundColor3 = fillColor
Box.BackgroundTransparency = ESP.Drawing.Boxes.Filled.Transparency / 100
Box.BorderSizePixel = 1
else
Box.BackgroundTransparency = 1
end
-- Animation
RotationAngle = RotationAngle + (tick() - Tick) * ESP.Drawing.Boxes.RotationSpeed * math.cos(math.pi / 4 * tick() - math.pi / 2)
if ESP.Drawing.Boxes.Animate then
Gradient1.Rotation = RotationAngle
Gradient2.Rotation = RotationAngle
else
Gradient1.Rotation = -45
Gradient2.Rotation = -45
end
Tick = tick()
Gradient1.Color = ColorSequence.new{ColorSequenceKeypoint.new(0, boxColor), ColorSequenceKeypoint.new(1, ESP.Drawing.Boxes.GradientFillRGB2)}
Gradient2.Color = ColorSequence.new{ColorSequenceKeypoint.new(0, boxColor), ColorSequenceKeypoint.new(1, ESP.Drawing.Boxes.GradientRGB2)}
end
do -- Healthbar
local health = Humanoid.Health / Humanoid.MaxHealth;
Healthbar.Visible = ESP.Drawing.Healthbar.Enabled;
Healthbar.Position = UDim2.new(0, Pos.X - w / 2 - 6, 0, Pos.Y - h / 2 + h * (1 - health))
Healthbar.Size = UDim2.new(0, ESP.Drawing.Healthbar.Width, 0, h * health)
--
BehindHealthbar.Visible = ESP.Drawing.Healthbar.Enabled;
BehindHealthbar.Position = UDim2.new(0, Pos.X - w / 2 - 6, 0, Pos.Y - h / 2)
BehindHealthbar.Size = UDim2.new(0, ESP.Drawing.Healthbar.Width, 0, h)
-- Health Text
do
if ESP.Drawing.Healthbar.HealthText then
local healthPercentage = math.floor(Humanoid.Health / Humanoid.MaxHealth * 100)
HealthText.Position = UDim2.new(0, Pos.X - w / 2 - 6, 0, Pos.Y - h / 2 + h * (1 - healthPercentage / 100) + 3)
HealthText.Text = tostring(healthPercentage)
HealthText.Visible = Humanoid.Health < Humanoid.MaxHealth
HealthText.TextColor3 = textColor
HealthText.TextSize = ESP.FontSize
if ESP.Drawing.Healthbar.Lerp then
local frac = health
local r = math.min(255, 510 * (1 - frac))
local g = math.min(255, 510 * frac)
local color = Color3.fromRGB(r, g, 0)
HealthText.TextColor3 = color
else
HealthText.TextColor3 = ESP.Drawing.Healthbar.HealthTextRGB
end
end
end
end
do -- Names
Name.Visible = ESP.Drawing.Names.Enabled
Name.TextColor3 = textColor
Name.TextSize = ESP.FontSize
if ESP.Options.Friendcheck and lplayer:IsFriendsWith(plr.UserId) then
Name.Text = string.format('(F) %s', ESP.Options.FriendcheckRGB.R * 255, ESP.Options.FriendcheckRGB.G * 255, ESP.Options.FriendcheckRGB.B * 255, plr.Name)
else
Name.Text = string.format('(E) %s', 255, 0, 0, plr.Name)
end
Name.Position = UDim2.new(0, Pos.X, 0, Pos.Y - h / 2 - 9)
end
do -- Distance and Tool Text & Positioning (Fixed)
local bottomOffset = Pos.Y + h / 2
local distEnabled = ESP.Drawing.Distances.Enabled
-- 1. Handle Distance Visibility
if distEnabled then
Distance.TextColor3 = textColor
Distance.TextSize = ESP.FontSize
Distance.Position = UDim2.new(0, Pos.X, 0, bottomOffset + 7)
if ESP.Drawing.Distances.Position == "Bottom" then
Distance.Text = string.format("%d meters", math.floor(Dist))
Distance.Visible = true
bottomOffset = bottomOffset + 12 -- Add padding for Tool below
elseif ESP.Drawing.Distances.Position == "Text" then
-- Combined in Name Logic (distance hidden here)
Distance.Visible = false
-- Logic is inside name block in original script, but simple update here:
if ESP.Options.Friendcheck and lplayer:IsFriendsWith(plr.UserId) then
Name.Text = string.format('(F) %s [%d]', ESP.Options.FriendcheckRGB.R * 255, ESP.Options.FriendcheckRGB.G * 255, ESP.Options.FriendcheckRGB.B * 255, plr.Name, math.floor(Dist))
else
Name.Text = string.format('(E) %s [%d]', 255, 0, 0, plr.Name, math.floor(Dist))
end
end
else
Distance.Visible = false
end
-- 2. Handle Tool Visibility & Positioning
-- Logic separate from Distance check so position updates even if distance is off
local tool = plr.Character:FindFirstChildOfClass("Tool") or (plr.Backpack and plr.Backpack:FindFirstChildOfClass("Tool"))
if ESP.Drawing.Weapons.Enabled then
Weapon.TextColor3 = textColor
Weapon.TextSize = ESP.FontSize
-- Calculate Weapon Position based on updated bottomOffset
-- Note: Original script added +18 / +15 relative to Y+h/2.
-- If distance is there, bottomOffset increased.
Weapon.Position = UDim2.new(0, Pos.X, 0, bottomOffset + 11)
WeaponIcon.Position = UDim2.new(0, Pos.X - 21, 0, bottomOffset + 8)
if tool then
Weapon.Text = tool.Name
WeaponIcon.Image = Weapon_Icons[tool.Name] or ""
else
Weapon.Text = "none"
WeaponIcon.Image = ""
end
Weapon.Visible = true
WeaponIcon.Visible = true -- Ensuring Icon visible
else
Weapon.Visible = false
WeaponIcon.Visible = false -- Ensuring Icon hidden
end
end
else
HideESP();
end
else
HideESP();
end
else
HideESP();
end
end)
end
coroutine.wrap(Updater)();
end
do -- Update ESP
for _, v in pairs(game:GetService("Players"):GetPlayers()) do
if v.Name ~= lplayer.Name then
coroutine.wrap(ESPFunc)(v)
end
end
--
game:GetService("Players").PlayerAdded:Connect(function(v)
coroutine.wrap(ESPFunc)(v)
end);
end;
end;
Players.PlayerRemoving:Connect(function(p)
if ScreenGui:FindFirstChild(p.Name) then
ScreenGui[p.Name]:Destroy()
end
end)
-- ==============================================================
-- PREDICTION FORESHADOW (GHOST CLONE) SYSTEM (OPTIMIZED)
-- ==============================================================
local GhostCharacter = nil
local GhostPartsCache = {}
local function ClearGhost()
if GhostCharacter then
GhostCharacter:Destroy()
GhostCharacter = nil
end
GhostPartsCache = {}
end
local function UpdateGhost(target, predictedPos)
if not target or not target:FindFirstChild("HumanoidRootPart") then
ClearGhost()
return
end
-- 1. Create Ghost if missing or target changed
if not GhostCharacter or GhostCharacter.Name ~= target.Name .. "_Ghost" then
ClearGhost()
GhostCharacter = Instance.new("Model")
GhostCharacter.Name = target.Name .. "_Ghost"
GhostCharacter.Parent = workspace.CurrentCamera -- Client side only
-- Clone visual parts only
for _, v in pairs(target:GetChildren()) do
if v:IsA("BasePart") and v.Name ~= "HumanoidRootPart" then
local clone = v:Clone()
clone:ClearAllChildren() -- Remove scripts/welds to prevent lag/interactions
clone.Parent = GhostCharacter
clone.Anchored = true
clone.CanCollide = false
clone.CanTouch = false
clone.CanQuery = false
clone.Material = Enum.Material.Plastic -- Plastic material
clone.Color = Options.GhostColor.Value
clone.Transparency = Options.GhostTransparency.Value
clone.CastShadow = false
-- Cache the mapping of original name -> clone part
GhostPartsCache[v.Name] = clone
if v:IsA("MeshPart") then
clone.TextureID = ""
end
end
end
end
-- 2. Move Ghost to Predicted Position
local currentHRP = target:FindFirstChild("HumanoidRootPart")
if currentHRP then
local currentPos = currentHRP.Position
-- The offset from current player to predicted position
local offset = predictedPos - currentPos
-- Get Visual Settings
local gColor = Options.GhostColor.Value
local gTrans = Options.GhostTransparency.Value
for origName, clonePart in pairs(GhostPartsCache) do
local originalPart = target:FindFirstChild(origName)
if originalPart then
-- Apply the offset to every part's CFrame to maintain animation pose
clonePart.CFrame = originalPart.CFrame + offset
-- Update visuals live
clonePart.Color = gColor
clonePart.Transparency = gTrans
end
end
end
end
-- Aimbot functions
-- EXPANDED BODY PARTS LIST TO INCLUDE R6 PARTS (Torso, Arms, Legs)
local bodyParts = {
"Head", "UpperTorso", "LowerTorso", "HumanoidRootPart",
"LeftUpperArm", "RightUpperArm", "LeftLowerArm", "RightLowerArm", "LeftHand", "RightHand",
"LeftUpperLeg", "RightUpperLeg", "LeftLowerLeg", "RightLowerLeg", "LeftFoot", "RightFoot",
"Torso", "Left Arm", "Right Arm", "Left Leg", "Right Leg" -- R6 Parts
}
local function getClosestTarget()
local closest, closestDist = nil, math.huge
local mousePos = UserInputService:GetMouseLocation()
for _, player in pairs(Players:GetPlayers()) do
if player == LocalPlayer then continue end
local character = player.Character
if not character then continue end
if Toggles.ForceFieldCheck.Value and character:FindFirstChildOfClass("ForceField") then continue end
local hrp = character:FindFirstChild("HumanoidRootPart")
if not hrp then continue end
if Toggles.TeamCheck.Value and LocalPlayer.Team and player.Team == LocalPlayer.Team then continue end
local playerWL = (Options.PlayerWhitelist and Options.PlayerWhitelist.Value) or {}
local teamWL = (Options.TeamWhitelist and Options.TeamWhitelist.Value) or {}
if selectionContains(playerWL, player) then continue end
if player.Team and selectionContains(teamWL, player.Team) then continue end
if Toggles.HealthCheck.Value then
local humanoid = character:FindFirstChildOfClass("Humanoid")
if not humanoid or humanoid.Health <= 0 then continue end
if humanoid.Health < Options.MinHealth.Value then continue end
end
local distance = (Camera.CFrame.Position - hrp.Position).Magnitude
if not Toggles.InfDistance.Value and distance > Options.MaxDistance.Value then continue end
local charBestDist = math.huge
if Toggles.AimVisibleParts.Value then
for _, partName in ipairs(bodyParts) do
local part = character:FindFirstChild(partName)
if part and isVisible(part) then
local screenPos, onScreen = Camera:WorldToViewportPoint(part.Position)
if onScreen then
local dist = (Vector2.new(screenPos.X, screenPos.Y) - mousePos).Magnitude
if dist < charBestDist then
charBestDist = dist
end
end
end
end
else
local part = getAimPart(character)
if part and isVisible(part) then
local screenPos, onScreen = Camera:WorldToViewportPoint(part.Position)
if onScreen then
charBestDist = (Vector2.new(screenPos.X, screenPos.Y) - mousePos).Magnitude
end
end
end
if charBestDist <= Options.FOVRadius.Value and charBestDist < closestDist then
closest = character
closestDist = charBestDist
end
end
if Toggles.AimNPCs.Value then
for _, npc in pairs(workspace:GetChildren()) do
local playerFromChar = Players:GetPlayerFromCharacter(npc)
if playerFromChar then continue end
if npc == LocalCharacter then continue end
if not npc:IsA("Model") or not npc:FindFirstChild("Humanoid") or not npc:FindFirstChild("HumanoidRootPart") then continue end
if Toggles.ForceFieldCheck.Value and npc:FindFirstChildOfClass("ForceField") then continue end
local hrp = npc.HumanoidRootPart
local humanoid = npc:FindFirstChild("Humanoid")
if Toggles.HealthCheck.Value then
if not humanoid or humanoid.Health <= 0 then continue end
if humanoid.Health < Options.MinHealth.Value then continue end
end
local distance = (Camera.CFrame.Position - hrp.Position).Magnitude
if not Toggles.InfDistance.Value and distance > Options.MaxDistance.Value then continue end
local charBestDist = math.huge
if Toggles.AimVisibleParts.Value then
for _, partName in ipairs(bodyParts) do
local part = npc:FindFirstChild(partName)
if part and isVisible(part) then
local screenPos, onScreen = Camera:WorldToViewportPoint(part.Position)
if onScreen then
local dist = (Vector2.new(screenPos.X, screenPos.Y) - mousePos).Magnitude
if dist < charBestDist then
charBestDist = dist
end
end
end
end
else
local part = getAimPart(npc)
if part and isVisible(part) then
local screenPos, onScreen = Camera:WorldToViewportPoint(part.Position)
if onScreen then
charBestDist = (Vector2.new(screenPos.X, screenPos.Y) - mousePos).Magnitude
end
end
end
if charBestDist <= Options.FOVRadius.Value and charBestDist < closestDist then
closest = npc
closestDist = charBestDist
end
end
end
return closest
end
local function isValidLockedTarget(targetChar)
if not targetChar or not targetChar.Parent then return false end
if Toggles.ForceFieldCheck.Value and targetChar:FindFirstChildOfClass("ForceField") then return false end
local hrp = targetChar:FindFirstChild("HumanoidRootPart")
if not hrp then return false end
local humanoid = targetChar:FindFirstChildOfClass("Humanoid")
if not humanoid or humanoid.Health <= 0 then return false end
if Toggles.HealthCheck.Value and humanoid.Health < Options.MinHealth.Value then return false end
local distance = (Camera.CFrame.Position - hrp.Position).Magnitude
if not Toggles.InfDistance.Value and distance > Options.MaxDistance.Value then return false end
local player = Players:GetPlayerFromCharacter(targetChar)
if player then
if Toggles.TeamCheck.Value and LocalPlayer.Team and player.Team == LocalPlayer.Team then return false end
local playerWL = (Options.PlayerWhitelist and Options.PlayerWhitelist.Value) or {}
local teamWL = (Options.TeamWhitelist and Options.TeamWhitelist.Value) or {}
if selectionContains(playerWL, player) then return false end
if player.Team and selectionContains(teamWL, player.Team) then return false end
end
return true
end
-- Aimbot & Triggerbot toggle states
local lockedTarget = nil
local stickyTarget = nil
local Clicked = false
-- Main Render RenderStepped loop
RunService.RenderStepped:Connect(function(dt)
hue = (hue + dt * 0.25) % 1
updateMouseLock()
local mousePos = UserInputService:GetMouseLocation()
if FOVCircle then
FOVCircle.Position = mousePos
FOVCircle.Radius = Options.FOVRadius.Value
FOVCircle.Visible = Toggles.AimbotEnabled.Value and Toggles.FovVisible.Value
if Toggles.RainbowFov.Value then
FOVCircle.Color = Color3.fromHSV(hue,1,1)
else
FOVCircle.Color = Options.FovColor.Value
end
end
local triggerActive = Toggles.TriggerbotEnabled.Value
if triggerActive then
local targetPart = mouse.Target
if targetPart then
local char = targetPart.Parent
local humanoid = char:FindFirstChildOfClass("Humanoid")
if not humanoid then
char = targetPart.Parent.Parent
humanoid = char:FindFirstChildOfClass("Humanoid")
end
if humanoid and humanoid.Health > 0 and char.Name ~= LocalPlayer.Name then
local hrp = char:FindFirstChild("HumanoidRootPart")
if not hrp then
if Clicked then
mouse1release()
Clicked = false
end
else
local playerFromChar = Players:GetPlayerFromCharacter(char)
local shouldShoot = true
if Toggles.ForceFieldCheck.Value and char:FindFirstChildOfClass("ForceField") then
shouldShoot = false
end
if playerFromChar then
if Toggles.TeamCheck.Value and LocalPlayer.Team and playerFromChar.Team == LocalPlayer.Team then
shouldShoot = false
end
local playerWL = (Options.PlayerWhitelist and Options.PlayerWhitelist.Value) or {}
local teamWL = (Options.TeamWhitelist and Options.TeamWhitelist.Value) or {}
if selectionContains(playerWL, playerFromChar) then
shouldShoot = false
end
if playerFromChar.Team and selectionContains(teamWL, playerFromChar.Team) then
shouldShoot = false
end
end
local dist = (LocalHumanoidRootPart.Position - hrp.Position).Magnitude
if Toggles.TriggerDistanceCheck.Value and dist > Options.TriggerMaxDistance.Value then
shouldShoot = false
end
local visible = not Toggles.TriggerbotWallCheck.Value or isVisible(targetPart)
if not visible then
shouldShoot = false
end
if shouldShoot then
-- SET TARGET FOR HITSOUNDS
Target = char
if not Clicked then
mouse1press()
Clicked = true
end
else
if Clicked then
mouse1release()
Clicked = false
end
end
end
else
if Clicked then
mouse1release()
Clicked = false
end
end
else
if Clicked then
mouse1release()
Clicked = false
end
end
else
if Clicked then
mouse1release()
Clicked = false
end
end
if not Toggles.AimbotEnabled.Value then
-- Don't clear target if triggerbot is using it
if not triggerActive then
Target = nil
end
lockedTarget = nil
stickyTarget = nil
CurrentLockedTarget = nil
PerceivedPos = nil
PerceivedVel = Vector3.new()
JustLocked = true
ClearGhost()
return
end
local mousePos = UserInputService:GetMouseLocation()
local aimbotActive = false
if Options.AimbotKeybind and type(Options.AimbotKeybind.GetState) == "function" then
aimbotActive = Options.AimbotKeybind:GetState()
end
if not aimbotActive then
Target = nil
lockedTarget = nil
stickyTarget = nil
CurrentLockedTarget = nil
PerceivedPos = nil
PerceivedVel = Vector3.new()
JustLocked = true
ClearGhost() -- Cleanup ghost
return
end
local currentTarget = nil
-- --- TARGET SELECTION LOGIC ---
if Toggles.OutwallAim.Value then
if not lockedTarget or not isValidLockedTarget(lockedTarget) then
lockedTarget = getClosestTarget()
end
currentTarget = lockedTarget
elseif Toggles.StickyAim.Value then
-- STICKY AIM FIXED LOGIC
if stickyTarget and not isValidLockedTarget(stickyTarget) then
stickyTarget = nil
end
if stickyTarget then
local part = stickyTarget:FindFirstChild("HumanoidRootPart")
if part then
local screenPos, onScreen = Camera:WorldToViewportPoint(part.Position)
local distFromMouse = (Vector2.new(screenPos.X, screenPos.Y) - mousePos).Magnitude
if not onScreen or distFromMouse > Options.FOVRadius.Value then
stickyTarget = nil
end
if stickyTarget and Toggles.StickyWallCheck.Value then
local aimP = getAimPart(stickyTarget)
if aimP and not isVisible(aimP) then
stickyTarget = nil
end
end
else
stickyTarget = nil
end
end
if not stickyTarget then
stickyTarget = getClosestTarget()
end
currentTarget = stickyTarget
else
-- REACTION TIME LOGIC FIX
local newClosest = getClosestTarget()
if CurrentLockedTarget and isValidLockedTarget(CurrentLockedTarget) then
if newClosest ~= CurrentLockedTarget then
if PendingTarget ~= newClosest then
PendingTarget = newClosest
TargetSwitchTimer = tick()
end
if tick() - TargetSwitchTimer >= TargetReactionDelay then
currentTarget = newClosest
CurrentLockedTarget = currentTarget
else
currentTarget = CurrentLockedTarget
end
else
currentTarget = CurrentLockedTarget
PendingTarget = nil
end
else
currentTarget = newClosest
CurrentLockedTarget = currentTarget
PendingTarget = nil
end
end
-- DEAD SWITCH DELAY CHECK
if CurrentLockedTarget and CurrentLockedTarget:FindFirstChild("Humanoid") and CurrentLockedTarget.Humanoid.Health <= 0 then
if DeathDelayStart == 0 then
DeathDelayStart = tick()
end
CurrentLockedTarget = nil
end
if DeathDelayStart > 0 and (tick() - DeathDelayStart) < Options.DeadDelay.Value then
Target = nil
JustLocked = true
ClearGhost()
return
elseif DeathDelayStart > 0 then
DeathDelayStart = 0
end
if not currentTarget then
Target = nil
PerceivedPos = nil
PerceivedVel = Vector3.new()
JustLocked = true
ClearGhost() -- Cleanup ghost
return
end
-- =====================================
-- AIM PART SELECTION (VISIBLE/SWITCH PART FIX)
-- =====================================
local aimPart = nil
local useWallCheck = Toggles.WallCheck.Value and not (Toggles.StickyAim.Value and Toggles.StickyWallCheck.Value and currentTarget == stickyTarget)
-- 1. Check "Aim Visible Parts" (Highest Priority if enabled)
if Toggles.AimVisibleParts.Value then
local bestDist = math.huge
local bestPart = nil
for _, partName in ipairs(bodyParts) do
local part = currentTarget:FindFirstChild(partName)
if part and isVisible(part) then -- Only care if it's visible
local scr, onScreen = Camera:WorldToViewportPoint(part.Position)
if onScreen then
local dist = (Vector2.new(scr.X, scr.Y) - mousePos).Magnitude
if dist < bestDist then
bestDist = dist
bestPart = part
end
end
end
end
if bestPart then
aimPart = bestPart
end
end
-- 2. If no visible part found (or setting disabled), use Switch Part logic or Default
if not aimPart then
if Toggles.SwitchPart.Value then
-- Switch Part Logic (Delay based - Closest Part)
if tick() - LastPartSwitchTime > Options.SwitchPartDelay.Value then
local closestP = nil
local closestDist = math.huge
-- Iterate all body parts to find closest to cursor
for _, partName in ipairs(bodyParts) do
local part = currentTarget:FindFirstChild(partName)
if part then
local scr, onScreen = Camera:WorldToViewportPoint(part.Position)
if onScreen then
local dist = (Vector2.new(scr.X, scr.Y) - mousePos).Magnitude
if dist < closestDist then
closestDist = dist
closestP = partName
end
end
end
end
if closestP then
CurrentSwitchPart = closestP
end
LastPartSwitchTime = tick()
end
-- Try to get the switched part
aimPart = getAimPart(currentTarget, CurrentSwitchPart)
end
-- 3. Fallback to Main Aim Part (if SwitchPart didn't set one or failed)
if not aimPart then
aimPart = getAimPart(currentTarget)
end
end
-- Final Wallcheck Validation (if applicable)
if useWallCheck and aimPart and not isVisible(aimPart) then
aimPart = nil
end
if not aimPart then
Target = nil
PerceivedPos = nil
PerceivedVel = Vector3.new()
JustLocked = true
ClearGhost() -- Cleanup ghost
return
end
local currentVelocity = aimPart.AssemblyLinearVelocity or Vector3.new()
local currentWorldPos = aimPart.Position
local now = tick()
-- First lock or target change = instant
if JustLocked then
PerceivedPos = currentWorldPos
PerceivedVel = currentVelocity
LastUpdateTimeX = now
LastUpdateTimeY = now
JustLocked = false
end
-- Force update on landing to prevent downward drift
local LANDING_THRESHOLD = 1 -- If current Y vel near 0
local FALLING_THRESHOLD = -10 -- And perceived was falling
if math.abs(currentVelocity.Y) < LANDING_THRESHOLD and PerceivedVel.Y < FALLING_THRESHOLD then
PerceivedPos = Vector3.new(PerceivedPos.X, currentWorldPos.Y, PerceivedPos.Z)
PerceivedVel = Vector3.new(PerceivedVel.X, currentVelocity.Y, PerceivedVel.Z)
LastUpdateTimeY = now
end
-- Update perception for X/Z (horizontal) and Y (vertical) independently
if now - LastUpdateTimeX >= ReactionDelayX then
PerceivedPos = Vector3.new(currentWorldPos.X, PerceivedPos.Y, currentWorldPos.Z)
PerceivedVel = Vector3.new(currentVelocity.X, PerceivedVel.Y, currentVelocity.Z)
LastUpdateTimeX = now
end
if now - LastUpdateTimeY >= ReactionDelayY then
PerceivedPos = Vector3.new(PerceivedPos.X, currentWorldPos.Y, PerceivedPos.Z)
PerceivedVel = Vector3.new(PerceivedVel.X, currentVelocity.Y, PerceivedVel.Z)
LastUpdateTimeY = now
end
local timeSinceX = now - LastUpdateTimeX
local timeSinceY = now - LastUpdateTimeY
-- Extrapolate X/Z and Y with independent times
local perceivedX = PerceivedPos.X + PerceivedVel.X * timeSinceX
local perceivedY = PerceivedPos.Y + PerceivedVel.Y * timeSinceY
local perceivedZ = PerceivedPos.Z + PerceivedVel.Z * timeSinceX
local perceivedWorldPos = Vector3.new(perceivedX, perceivedY, perceivedZ)
-- THIS IS WHERE THE TARGET WILL BE
local predictedWorldPos = perceivedWorldPos + PerceivedVel * Options.Prediction.Value
-- ==============================================================
-- UPDATE GHOST FORESHADOW
-- ==============================================================
if Toggles.PredictionForeshadow.Value and currentTarget then
local hrp = currentTarget:FindFirstChild("HumanoidRootPart")
if hrp then
local predHrpPos = hrp.Position + (hrp.AssemblyLinearVelocity * Options.Prediction.Value)
UpdateGhost(currentTarget, predHrpPos)
end
else
ClearGhost()
end
-- ==============================================================
local screenPos, onScreen = Camera:WorldToViewportPoint(predictedWorldPos)
if not onScreen then
Target = nil
JustLocked = true
ClearGhost() -- Cleanup ghost
return
end
local mousePos = UserInputService:GetMouseLocation()
-- [[ FIX: If Silent Aim is ON and Aimbot is ON, stop Mouse Moving here! ]] --
if Toggles.SilentAim.Value then
Target = currentTarget
return
end
if Options.AimMethod.Value == "Mouse" then
local currentSmoothnessX = Options.XSmoothness.Value
local currentSmoothnessY = Options.YSmoothness.Value
local dist = (Vector2.new(screenPos.X, screenPos.Y) - mousePos).Magnitude
-- FIX: Snap Back only activates if target is >100px away (e.g. due to drift)
-- If close (<100px), standard smoothness is used to avoid jitter/instant snaps.
if dist > 100 then
currentSmoothnessX = Options.SnapBackSpeed.Value
currentSmoothnessY = Options.SnapBackSpeed.Value
end
local deltaX = (screenPos.X - mousePos.X) / math.max(1, currentSmoothnessX)
local deltaY = (screenPos.Y - mousePos.Y) / math.max(1, currentSmoothnessY)
deltaX = deltaX + math.random(-1, 1) * 0.15
deltaY = deltaY + math.random(-1, 1) * 0.15
if mousemoverel then
mousemoverel(deltaX, deltaY)
end
elseif Options.AimMethod.Value == "Camera" then
local targetCFrame = CFrame.lookAt(Camera.CFrame.Position, predictedWorldPos)
local avgSmoothness = (Options.XSmoothness.Value + Options.YSmoothness.Value) / 2
local alpha = 1 / math.max(1, avgSmoothness)
Camera.CFrame = Camera.CFrame:Lerp(targetCFrame, alpha)
end
if Target ~= currentTarget then
JustLocked = true
end
Target = currentTarget
end)
-- UI Settings
local MenuGroup = Tabs["UI Settings"]:AddLeftGroupbox("Menu")
MenuGroup:AddToggle("KeybindMenuOpen", {
Default = Library.KeybindFrame.Visible,
Text = "Keybind Menu",
Callback = function(Value) Library.KeybindFrame.Visible = Value end
})
MenuGroup:AddLabel("Menu bind"):AddKeyPicker("MenuKeybind", { Default = "RightShift", NoUI = true, Text = "Menu keybind" })
MenuGroup:AddButton({ Text = "Unload", Func = function()
getgenv().ObsidianV1Running = false -- Reset the check
ClearGhost()
Library:Unload()
end })
Library.ToggleKeybind = Options.MenuKeybind
ThemeManager:SetLibrary(Library)
SaveManager:SetLibrary(Library)
SaveManager:IgnoreThemeSettings()
SaveManager:SetIgnoreIndexes({ "MenuKeybind", "AimbotKeybind", "TriggerbotKeybind" })
ThemeManager:ApplyToTab(Tabs["UI Settings"])
SaveManager:BuildConfigSection(Tabs["UI Settings"])
SaveManager:LoadAutoloadConfig()
Library:Notify("Obsidian GUI Loaded!", 5)