OG OP SOURCE CODE SILENT AIM LOBBY DESTROYER ESP AIMBOT HUD
Key Required

OG OP SOURCE CODE SILENT AIM LOBBY DESTROYER ESP AIMBOT HUD

RIOTFALL [FPS]leetleet 5.2K views 606 executesUpdated Nov 30, 2025
3.3/ 5(3 votes)
2167% Positive
Lua Script•1941 lines (66994 chars)
-- This WILL NOT WORK ON LOW UNC EXECUTORS LIKE XENO
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local Teams = game:GetService("Teams")

local LocalPlayer = Players.LocalPlayer
local camera = workspace.CurrentCamera

local mousemoverel = mousemoverel or (Input and Input.MouseMove) or nil

local Config = {
    ESP_Enabled = true,
    ESP_Box = true,
    ESP_Name = true,
    ESP_Distance = true,
    ESP_Tracer = false,
    ESP_Rainbow = false,
    ESP_TeamCheck = true,
    
    AIM_Enabled = false,
    AIM_FOVEnabled = true,
    AIM_FOV = 120,
    AIM_Smooth = 3.5,
    
    SILENT_Enabled = false,
    SILENT_FOV = 150,
    SILENT_TeamCheck = true,
    SILENT_Rage = false,
    
    RADAR_Enabled = true,
    RADAR_Mode = "2D",
    RADAR_Size = 140,
    RADAR_Range = 200,
    RADAR_MoveMode = false,
    
    MISC_Watermark = true,
    MISC_ActiveList = true
}

local Tuning = {
    FOVSegments = 50,
    
    PanelWidth = 145,
    PanelHeaderH = 24,
    ItemHeight = 20,
    FontSize = 13,
    SliderHeight = 38,
    
    RadarDotSize = 4,
    RadarArrowSize = 6,
    
    CompassWidth = 400,
    CompassHeight = 28,
    CompassTickHeight = 8,
    CompassIndicatorSize = 6
}

local Palette = {
    PanelBg = Color3.fromRGB(18, 18, 20),
    PanelHeader = Color3.fromRGB(25, 25, 28),
    PanelBorder = Color3.fromRGB(45, 45, 50),
    ItemOn = Color3.fromRGB(255, 65, 65),
    ItemOff = Color3.fromRGB(180, 180, 185),
    ItemHover = Color3.fromRGB(35, 35, 40),
    Text = Color3.fromRGB(230, 230, 235),
    TextDim = Color3.fromRGB(130, 130, 140),
    Accent = Color3.fromRGB(255, 65, 65),
    
    ESP_Enemy = Color3.fromRGB(255, 65, 65),
    ESP_Visible = Color3.fromRGB(85, 255, 127),
    
    FOV_Circle = Color3.fromRGB(255, 255, 255),
    FOV_Active = Color3.fromRGB(85, 255, 127),
    
    RadarBg = Color3.fromRGB(12, 12, 14),
    RadarBorder = Color3.fromRGB(255, 65, 65),
    RadarGrid = Color3.fromRGB(35, 35, 40),
    RadarYou = Color3.fromRGB(255, 65, 65),
    RadarEnemy = Color3.fromRGB(85, 255, 127),
    
    CompassBg = Color3.fromRGB(0, 0, 0),
    CompassText = Color3.fromRGB(200, 200, 205),
    CompassCardinal = Color3.fromRGB(255, 255, 255),
    CompassTick = Color3.fromRGB(80, 80, 90),
    CompassEnemy = Color3.fromRGB(85, 255, 127)
}

local State = {
    Unloaded = false,
    RainbowHue = 0,
    Aiming = false,
    
    Radar2D_Pos = nil,
    RadarHUD_Pos = nil,
    RadarDragging = nil,
    RadarDragOffset = Vector2.new(0, 0)
}

local Cache = {
    Teams = {},
    TeamUpdateTime = 0,
    Visibility = {},
    VisUpdateTime = 0,
    CharactersFolder = nil,
    LocalChar = nil,
    LocalCharTime = 0
}

local CacheIntervals = {
    Team = 0.5,
    Visibility = 0.1,
    LocalChar = 0.2
}

local Connections = {}
local espObjects = {}
local targetEnemy = nil

local function GetPlayerTeamRaw(player)
    if not player then return nil end
    if workspace:FindFirstChild("VoiceOrigins") then
        local vo = workspace.VoiceOrigins
        if vo:FindFirstChild("ORANGE") and vo.ORANGE:FindFirstChild(player.Name) then
            return Teams:FindFirstChild("ORANGE") or "ORANGE"
        elseif vo:FindFirstChild("BLUE") and vo.BLUE:FindFirstChild(player.Name) then
            return Teams:FindFirstChild("BLUE") or "BLUE"
        end
    end
    return nil
end

local function GetPlayerTeam(player)
    if not player then return nil end
    local now = tick()
    if now - Cache.TeamUpdateTime > CacheIntervals.Team then
        Cache.Teams = {}
        Cache.TeamUpdateTime = now
    end
    if Cache.Teams[player] == nil then
        Cache.Teams[player] = GetPlayerTeamRaw(player) or false
    end
    local result = Cache.Teams[player]
    return result ~= false and result or nil
end

local function GetCharactersFolder()
    if not Cache.CharactersFolder then
        Cache.CharactersFolder = workspace:FindFirstChild("Characters")
    end
    return Cache.CharactersFolder
end

local function GetLocalCharacter()
    local now = tick()
    if now - Cache.LocalCharTime > CacheIntervals.LocalChar or not Cache.LocalChar or not Cache.LocalChar.Parent then
        local chars = GetCharactersFolder()
        Cache.LocalChar = chars and chars:FindFirstChild(LocalPlayer.Name)
        Cache.LocalCharTime = now
    end
    return Cache.LocalChar
end

local function GetTargetPart(character)
    local parts = {"head_only", "Head", "RootPart", "HumanoidRootPart", "helmet", "pelvis"}
    for _, name in ipairs(parts) do
        local part = character:FindFirstChild(name)
        if part then return part end
    end
    for _, part in ipairs(character:GetChildren()) do
        if part:IsA("BasePart") then return part end
    end
    return nil
end

local function IsVisibleRaw(targetPart)
    local localChar = GetLocalCharacter()
    if not localChar or not targetPart then return false end
    local localPart = GetTargetPart(localChar)
    if not localPart then return false end
    
    local targetChar = targetPart:FindFirstAncestorOfClass("Model")
    
    local origin = localPart.Position
    local direction = (targetPart.Position - origin)
    local params = RaycastParams.new()
    params.FilterDescendantsInstances = {localChar, targetChar}
    params.FilterType = Enum.RaycastFilterType.Blacklist
    
    local result = workspace:Raycast(origin, direction, params)
    return result == nil
end

local function IsVisible(targetPart)
    if not targetPart then return false end
    local now = tick()
    if now - Cache.VisUpdateTime > CacheIntervals.Visibility then
        Cache.Visibility = {}
        Cache.VisUpdateTime = now
    end
    if Cache.Visibility[targetPart] == nil then
        Cache.Visibility[targetPart] = IsVisibleRaw(targetPart)
    end
    return Cache.Visibility[targetPart]
end

local function GetDistance(pos)
    local char = GetLocalCharacter()
    if not char then return 0 end
    local root = GetTargetPart(char)
    if not root then return 0 end
    return (pos - root.Position).Magnitude
end

local function GetRainbow()
    return Color3.fromHSV(State.RainbowHue, 1, 1)
end

local function GetClosestEnemyScreenPos()
    camera = workspace.CurrentCamera
    if not camera then return nil end
    
    local localTeam = GetPlayerTeam(LocalPlayer)
    local closestPos = nil
    local closestDist = Config.AIM_FOVEnabled and Config.AIM_FOV or math.huge
    local mousePos = UserInputService:GetMouseLocation()
    local charsFolder = GetCharactersFolder()
    
    for _, player in ipairs(Players:GetPlayers()) do
        if player == LocalPlayer then continue end
        
        local character = charsFolder and charsFolder:FindFirstChild(player.Name)
        if not character then continue end
        
        local playerTeam = GetPlayerTeam(player)
        
        local isEnemy = true
        if Config.ESP_TeamCheck and localTeam and playerTeam then
            isEnemy = localTeam ~= playerTeam
        end
        
        if isEnemy then
            local part = GetTargetPart(character)
            if part then
                local screenPos, onScreen = camera:WorldToViewportPoint(part.Position)
                if onScreen then
                    local screenVec = Vector2.new(screenPos.X, screenPos.Y)
                    local dist = (mousePos - screenVec).Magnitude
                    if dist < closestDist then
                        closestDist = dist
                        closestPos = screenVec
                        targetEnemy = part
                    end
                end
            end
        end
    end
    
    return closestPos
end

local function UpdateAimbot()
    camera = workspace.CurrentCamera
    if not camera then return end
    
    if not Config.AIM_Enabled or not State.Aiming then
        targetEnemy = nil
        return
    end
    
    local mousePos = UserInputService:GetMouseLocation()
    local aimPos = nil
    
    if targetEnemy and targetEnemy.Parent then
        local screenPos, onScreen = camera:WorldToViewportPoint(targetEnemy.Position)
        if onScreen then
            aimPos = Vector2.new(screenPos.X, screenPos.Y)
        else
            targetEnemy = nil
        end
    end
    
    if not aimPos then
        aimPos = GetClosestEnemyScreenPos()
    end
    
    if not aimPos then return end
    
    local deltaX = (aimPos.X - mousePos.X) / Config.AIM_Smooth
    local deltaY = (aimPos.Y - mousePos.Y) / Config.AIM_Smooth
    
    if mousemoverel then
        mousemoverel(deltaX, deltaY)
    else
        local currentCFrame = camera.CFrame
        local worldPos = camera:ViewportPointToRay(aimPos.X, aimPos.Y).Origin
        local goalCFrame = CFrame.lookAt(currentCFrame.Position, worldPos)
        camera.CFrame = currentCFrame:Lerp(goalCFrame, 0.1)
    end
end

local Silent = {
    Hooked = false,
    CurrentTarget = nil,
    FOVCircle = nil,
    Remote = nil
}

local function GetSilentTarget()
    camera = workspace.CurrentCamera
    if not camera then return nil end
    
    local mousePos = UserInputService:GetMouseLocation()
    local localTeam = GetPlayerTeam(LocalPlayer)
    local charsFolder = GetCharactersFolder()
    local collisions = workspace:FindFirstChild("CharacterCollisions")
    local bestTarget = nil
    local bestDist = Config.SILENT_FOV
    
    for _, player in ipairs(Players:GetPlayers()) do
        if player == LocalPlayer then continue end
        
        local character = charsFolder and charsFolder:FindFirstChild(player.Name)
        if not character then continue end
        
        local playerTeam = GetPlayerTeam(player)
        
        local isEnemy = true
        if Config.SILENT_TeamCheck and localTeam and playerTeam then
            isEnemy = localTeam ~= playerTeam
        end
        
        if not isEnemy then continue end
        
        local targetPart = nil
        local hitPartName = "Neck"
        
        if collisions then
            local playerHitbox = collisions:FindFirstChild(player.Name)
            if playerHitbox then
                targetPart = playerHitbox:FindFirstChild("Neck") 
                    or playerHitbox:FindFirstChild("Head")
                    or playerHitbox:FindFirstChild("Chest")
                    or playerHitbox:FindFirstChild("Torso")
                if targetPart then
                    hitPartName = targetPart.Name
                end
            end
        end
        
        if not targetPart then
            targetPart = character:FindFirstChild("Top") 
                or character:FindFirstChild("Center")
                or character:FindFirstChild("head_only")
                or character:FindFirstChild("Head")
            hitPartName = "Neck"
        end
        
        if not targetPart then continue end
        
        local screenPos, onScreen = camera:WorldToViewportPoint(targetPart.Position)
        if not onScreen or screenPos.Z <= 0 then continue end
        
        local screenVec = Vector2.new(screenPos.X, screenPos.Y)
        local dist = (mousePos - screenVec).Magnitude
        
        if dist < bestDist then
            bestDist = dist
            bestTarget = {
                Player = player,
                Character = character,
                Head = targetPart,
                Position = targetPart.Position,
                HitPartName = hitPartName
            }
        end
    end
    
    Silent.CurrentTarget = bestTarget
    return bestTarget
end

local function GetSilentTargetDirection(origin)
    local target = GetSilentTarget()
    if not target then return nil end
    return (target.Position - origin).Unit
end

local function SetupSilentAim()
    if Silent.Hooked then return end
    
    Silent.FOVCircle = Drawing.new("Circle")
    Silent.FOVCircle.Thickness = 1
    Silent.FOVCircle.NumSides = 50
    Silent.FOVCircle.Filled = false
    Silent.FOVCircle.Color = Color3.fromRGB(255, 200, 50)
    Silent.FOVCircle.Visible = false
    
    local Remotes = game:GetService("ReplicatedStorage"):FindFirstChild("Remotes")
    if Remotes then
        Silent.Remote = Remotes:GetChildren()[1]
    end
    
    if getgc then
        pcall(function()
            for _, v in ipairs(getgc(true)) do
                if type(v) == "table" then
                    local fireUnsafe = rawget(v, "fireServerUnsafe")
                    if fireUnsafe and type(fireUnsafe) == "function" then
                        local oldFire = v.fireServerUnsafe
                        v.fireServerUnsafe = function(eventName, data, ...)
                            if Config.SILENT_Enabled and not State.Unloaded then
                                if eventName == "sendBullet" and type(data) == "table" and data.direction then
                                    local cam = workspace.CurrentCamera
                                    if cam then
                                        local newDir = GetSilentTargetDirection(cam.CFrame.Position)
                                        if newDir then
                                            data.direction = newDir
                                        end
                                    end
                                end
                            end
                            return oldFire(eventName, data, ...)
                        end
                        Silent.Hooked = true
                    end
                    
                    local newFunc = rawget(v, "new")
                    if newFunc and type(newFunc) == "function" and not Silent.Hooked then
                        local info = debug.getinfo and debug.getinfo(newFunc)
                        if info then
                            local src = info.source or ""
                            if src:find("Hitscan") or src:find("Raycasting") then
                                local oldNew = v.new
                                v.new = function(params, ...)
                                    if Config.SILENT_Enabled and not State.Unloaded and params and type(params) == "table" then
                                        if params.direction and params.position and params.damaging then
                                            local newDir = GetSilentTargetDirection(params.position)
                                            if newDir then
                                                params.direction = newDir
                                            end
                                        end
                                    end
                                    return oldNew(params, ...)
                                end
                                Silent.Hooked = true
                            end
                        end
                    end
                end
            end
        end)
    end
    
    if not Silent.Hooked and hookmetamethod and getnamecallmethod then
        pcall(function()
            local oldNamecall
            oldNamecall = hookmetamethod(game, "__namecall", function(self, ...)
                local args = {...}
                local method = getnamecallmethod()
                
                if not State.Unloaded and Config.SILENT_Enabled then
                    if method == "FireServer" and Silent.Remote and self == Silent.Remote then
                        if args[1] == "sendBullet" and type(args[2]) == "table" and args[2].direction then
                            local cam = workspace.CurrentCamera
                            if cam then
                                local newDir = GetSilentTargetDirection(cam.CFrame.Position)
                                if newDir then
                                    args[2].direction = newDir
                                end
                            end
                            return oldNamecall(self, unpack(args))
                        end
                    end
                    
                    if method == "Raycast" and self == workspace then
                        local origin = args[1]
                        local direction = args[2]
                        if origin and direction then
                            local target = GetSilentTarget()
                            if target then
                                local newDir = (target.Position - origin).Unit * direction.Magnitude
                                return oldNamecall(self, origin, newDir, args[3])
                            end
                        end
                    end
                end
                
                return oldNamecall(self, ...)
            end)
            Silent.Hooked = true
        end)
    end
    
    if not Silent.Hooked and hookfunction then
        pcall(function()
            local oldRaycast = workspace.Raycast
            local newRaycast = function(self, origin, direction, params, ...)
                if Config.SILENT_Enabled and not State.Unloaded and origin and direction then
                    local target = GetSilentTarget()
                    if target then
                        local newDir = (target.Position - origin).Unit * direction.Magnitude
                        return oldRaycast(self, origin, newDir, params, ...)
                    end
                end
                return oldRaycast(self, origin, direction, params, ...)
            end
            hookfunction(workspace.Raycast, newRaycast)
            Silent.Hooked = true
        end)
    end
end

local function UpdateSilentFOV()
    if not Silent.FOVCircle then return end
    
    if Config.SILENT_Enabled then
        local mousePos = UserInputService:GetMouseLocation()
        Silent.FOVCircle.Position = mousePos
        Silent.FOVCircle.Radius = Config.SILENT_FOV
        Silent.FOVCircle.Color = Silent.CurrentTarget and Color3.fromRGB(50, 255, 50) or Color3.fromRGB(255, 200, 50)
        Silent.FOVCircle.Visible = true
    else
        Silent.FOVCircle.Visible = false
    end
end

local WeaponList = {
    "aa12", "ak74", "cz75", "d870", "g17", "l86", "m107a1", "m1911", 
    "m300", "m4a1", "mp412", "mp9", "odin", "pp2000", "psrl", "rp9", 
    "socom", "spas12", "stinger", "thumper", "ump45", "vulcan", "wa2000"
}

local function GetEquippedWeapon()
    local myChar = GetLocalCharacter()
    if not myChar then return "weapon_m4a1", "weaponEquipSlot_primary", false end
    
    local loadoutData = myChar:FindFirstChild("LoadoutData")
    if loadoutData then
        for _, child in ipairs(loadoutData:GetChildren()) do
            if child:IsA("StringValue") or child:IsA("ObjectValue") then
                local val = tostring(child.Value or child.Name)
                for _, wep in ipairs(WeaponList) do
                    if val:lower():find(wep:lower()) then
                        return "weapon_" .. wep, "weaponEquipSlot_primary", false
                    end
                end
            end
        end
    end
    
    local weaponRigs = workspace:FindFirstChild("WeaponRigs")
    if weaponRigs then
        local myRig = weaponRigs:FindFirstChild(LocalPlayer.Name)
        if myRig then
            for _, child in ipairs(myRig:GetDescendants()) do
                local name = child.Name:lower()
                for _, wep in ipairs(WeaponList) do
                    if name:find(wep:lower()) then
                        return "weapon_" .. wep, "weaponEquipSlot_primary", false
                    end
                end
            end
        end
    end
    
    local cam = workspace.CurrentCamera
    if cam then
        local viewModel = cam:FindFirstChild("ViewModel")
        if viewModel then
            for _, child in ipairs(viewModel:GetDescendants()) do
                local name = child.Name:lower()
                for _, wep in ipairs(WeaponList) do
                    if name:find(wep:lower()) then
                        return "weapon_" .. wep, "weaponEquipSlot_primary", false
                    end
                end
            end
        end
    end
    
    return "weapon_m4a1", "weaponEquipSlot_primary", false
end

Silent.LastShotTime = 0
Silent.RaycastHooked = false

local function InjectSilentDamage()
    local target = GetSilentTarget()
    if not target or not target.Player or not target.Character then return false end
    
    Cache.LocalChar = nil
    Cache.LocalCharTime = 0
    
    local charsFolder = workspace:FindFirstChild("Characters")
    if not charsFolder then return false end
    
    local myChar = charsFolder:FindFirstChild(LocalPlayer.Name)
    if not myChar or not myChar.Parent then return false end
    
    local cam = workspace.CurrentCamera
    if not cam then return false end
    
    local charIdValue = target.Character:FindFirstChild("CharacterId")
    local myCharIdValue = myChar:FindFirstChild("CharacterId")
    if not charIdValue or not myCharIdValue then return false end
    
    local Remotes = game:GetService("ReplicatedStorage"):FindFirstChild("Remotes")
    if not Remotes then return false end
    local Remote = Remotes:GetChildren()[1]
    if not Remote then return false end
    
    local weapon, slot, silenced = GetEquippedWeapon()
    local hitPart = target.HitPartName or "Neck"
    local direction = (target.Position - cam.CFrame.Position).Unit
    local impactCFrame = CFrame.lookAt(target.Position, target.Position + direction)
    
    pcall(function()
        Remote:FireServer("requestHitscanDamage", {
            hitPartName = hitPart,
            raycastPos = target.Position,
            characterId = charIdValue.Value,
            ownCharacterId = myCharIdValue.Value,
            camPos = cam.CFrame.Position,
            damagePlayer = target.Player,
            silenced = silenced,
            scoped = false,
            weaponEquipSlot = slot,
            weapon = weapon
        })
    end)
    
    pcall(function()
        Remote:FireServer("sendBullet", {
            direction = direction,
            hitMaterial = "Flesh",
            impactCFrame = impactCFrame
        })
    end)
    
    pcall(function()
        local ctc = game:GetService("ReplicatedStorage"):FindFirstChild("clientToClient")
        if ctc then
            local hm = ctc:FindFirstChild("hitmarker")
            if hm then hm:Fire(true) end
        end
    end)
    
    return true
end

Silent.IsShooting = false

local function SetupSilentRaycastHook()
    if Silent.RaycastHooked then return end
    if not hookmetamethod or not getnamecallmethod then return end
    
    pcall(function()
        local oldNamecall
        oldNamecall = hookmetamethod(game, "__namecall", function(self, ...)
            local method = getnamecallmethod()
            
            if method == "Raycast" and self == workspace then
                if Config.SILENT_Enabled and not Config.SILENT_Rage and not State.Unloaded and Silent.IsShooting then
                    local args = {...}
                    local origin = args[1]
                    local direction = args[2]
                    
                    if origin and direction then
                        local cam = workspace.CurrentCamera
                        if cam then
                            local camPos = cam.CFrame.Position
                            local distFromCam = (origin - camPos).Magnitude
                            
                            if distFromCam < 5 then
                                local now = tick()
                                if now - Silent.LastShotTime > 0.05 then
                                    Silent.LastShotTime = now
                                    task.spawn(InjectSilentDamage)
                                end
                            end
                        end
                    end
                end
            end
            
            return oldNamecall(self, ...)
        end)
        Silent.RaycastHooked = true
    end)
end

local function InjectDamageToAll()
    local cam = workspace.CurrentCamera
    if not cam then return end
    
    local charsFolder = workspace:FindFirstChild("Characters")
    if not charsFolder then return end
    
    local myChar = charsFolder:FindFirstChild(LocalPlayer.Name)
    if not myChar or not myChar.Parent then return end
    
    local myCharIdValue = myChar:FindFirstChild("CharacterId")
    if not myCharIdValue then return end
    
    local localTeam = GetPlayerTeam(LocalPlayer)
    local collisions = workspace:FindFirstChild("CharacterCollisions")
    
    local Remotes = game:GetService("ReplicatedStorage"):FindFirstChild("Remotes")
    if not Remotes then return end
    local Remote = Remotes:GetChildren()[1]
    if not Remote then return end
    
    local weapon, slot, silenced = GetEquippedWeapon()
    
    for _, player in ipairs(Players:GetPlayers()) do
        if player == LocalPlayer then continue end
        
        local playerTeam = GetPlayerTeam(player)
        local isEnemy = true
        if Config.SILENT_TeamCheck and localTeam and playerTeam then
            isEnemy = localTeam ~= playerTeam
        end
        if not isEnemy then continue end
        
        local character = charsFolder:FindFirstChild(player.Name)
        if not character then continue end
        
        local charIdValue = character:FindFirstChild("CharacterId")
        if not charIdValue then continue end
        
        local hitPart, hitPartName = nil, "Neck"
        if collisions then
            local playerHitbox = collisions:FindFirstChild(player.Name)
            if playerHitbox then
                hitPart = playerHitbox:FindFirstChild("Neck") or playerHitbox:FindFirstChild("Head") or playerHitbox:FindFirstChild("Chest")
                if hitPart then hitPartName = hitPart.Name end
            end
        end
        if not hitPart then
            hitPart = character:FindFirstChild("Top") or character:FindFirstChild("Center")
        end
        if not hitPart then continue end
        
        local direction = (hitPart.Position - cam.CFrame.Position).Unit
        local impactCFrame = CFrame.lookAt(hitPart.Position, hitPart.Position + direction)
        
        pcall(function()
            Remote:FireServer("requestHitscanDamage", {
                hitPartName = hitPartName,
                raycastPos = hitPart.Position,
                characterId = charIdValue.Value,
                ownCharacterId = myCharIdValue.Value,
                camPos = cam.CFrame.Position,
                damagePlayer = player,
                silenced = silenced,
                scoped = false,
                weaponEquipSlot = slot,
                weapon = weapon
            })
        end)
        
        pcall(function()
            Remote:FireServer("sendBullet", {
                direction = direction,
                hitMaterial = "Flesh",
                impactCFrame = impactCFrame
            })
        end)
    end
    
    pcall(function()
        local ctc = game:GetService("ReplicatedStorage"):FindFirstChild("clientToClient")
        if ctc then
            local hm = ctc:FindFirstChild("hitmarker")
            if hm then hm:Fire(true) end
        end
    end)
end

local function RageLoop()
    while not State.Unloaded do
        if Config.SILENT_Enabled and Config.SILENT_Rage then
            pcall(InjectDamageToAll)
        end
        task.wait(0.03)
    end
end

local function OnSilentAimShoot()
end

local function UpdateSilentSnap()
end

task.spawn(function()
    task.wait(1)
    pcall(SetupSilentAim)
    pcall(SetupSilentRaycastHook)
    task.spawn(RageLoop)
end)

local function ClearAllCaches()
    Cache.LocalChar = nil
    Cache.LocalCharTime = 0
    Cache.CharactersFolder = nil
    Cache.CharactersFolderTime = 0
    Cache.TeamCache = {}
    Cache.VisCache = {}
    Silent.CurrentTarget = nil
    Silent.IsShooting = false
end

local function ClearTargetCache()
    Cache.TeamCache = {}
    Cache.VisCache = {}
    Silent.CurrentTarget = nil
end

LocalPlayer.CharacterAdded:Connect(function()
    ClearAllCaches()
end)

if LocalPlayer.Character then
    LocalPlayer.Character:GetPropertyChangedSignal("Parent"):Connect(function()
        if not LocalPlayer.Character or not LocalPlayer.Character.Parent then
            ClearAllCaches()
        end
    end)
end

task.spawn(function()
    task.wait(2)
    local charsFolder = workspace:FindFirstChild("Characters")
    if charsFolder then
        charsFolder.ChildAdded:Connect(function()
            ClearTargetCache()
        end)
        charsFolder.ChildRemoved:Connect(function()
            ClearTargetCache()
        end)
    end
    
    local collisionsFolder = workspace:FindFirstChild("CharacterCollisions")
    if collisionsFolder then
        collisionsFolder.ChildAdded:Connect(function()
            ClearTargetCache()
        end)
        collisionsFolder.ChildRemoved:Connect(function()
            ClearTargetCache()
        end)
    end
end)

local function CreateESP(player)
    if espObjects[player] then return end
    
    local box = Drawing.new("Square")
    if not box then return end
    box.Color = Color3.new(1, 0, 0)
    box.Thickness = 1
    box.Filled = false
    box.Visible = false
    
    local name = Drawing.new("Text")
    if not name then box:Remove() return end
    name.Text = player.Name
    name.Color = Color3.new(1, 1, 1)
    name.Size = 14
    name.Center = true
    name.Outline = true
    name.Visible = false
    
    local tracer = Drawing.new("Line")
    if not tracer then box:Remove() name:Remove() return end
    tracer.Color = Color3.new(1, 0, 0)
    tracer.Thickness = 1
    tracer.Visible = false
    
    local dist = Drawing.new("Text")
    if not dist then box:Remove() name:Remove() tracer:Remove() return end
    dist.Size = 12
    dist.Center = true
    dist.Outline = true
    dist.OutlineColor = Color3.new(0, 0, 0)
    dist.Visible = false
    
    espObjects[player] = {
        Box = box,
        Name = name,
        Tracer = tracer,
        Distance = dist
    }
end

local function RemoveESP(player)
    if espObjects[player] then
        if espObjects[player].Box then espObjects[player].Box:Remove() end
        if espObjects[player].Name then espObjects[player].Name:Remove() end
        if espObjects[player].Tracer then espObjects[player].Tracer:Remove() end
        if espObjects[player].Distance then espObjects[player].Distance:Remove() end
        espObjects[player] = nil
    end
end

local function CleanupAllESP()
    for player, esp in pairs(espObjects) do
        if esp.Box then esp.Box:Remove() end
        if esp.Name then esp.Name:Remove() end
        if esp.Tracer then esp.Tracer:Remove() end
        if esp.Distance then esp.Distance:Remove() end
    end
    espObjects = {}
end

local function UpdateESP()
    camera = workspace.CurrentCamera
    if not camera then return end
    
    if not Config.ESP_Enabled then
        CleanupAllESP()
        return
    end
    
    local localTeam = GetPlayerTeam(LocalPlayer)
    local charsFolder = GetCharactersFolder()
    
    for _, player in ipairs(Players:GetPlayers()) do
        if player == LocalPlayer then continue end
        
        local character = charsFolder and charsFolder:FindFirstChild(player.Name)
        local playerTeam = GetPlayerTeam(player)
        
        if not character or not playerTeam then
            if espObjects[player] then
                RemoveESP(player)
            end
            continue
        end
        
        if not espObjects[player] then
            CreateESP(player)
        end
        
        local esp = espObjects[player]
        if not esp or not esp.Box or not esp.Name or not esp.Tracer or not esp.Distance then
            RemoveESP(player)
            CreateESP(player)
            esp = espObjects[player]
            if not esp then continue end
        end
        
        local targetPart = GetTargetPart(character)
        if not targetPart then
            esp.Box.Visible = false
            esp.Name.Visible = false
            esp.Tracer.Visible = false
            esp.Distance.Visible = false
            continue
        end
        
        local rootPos, onScreen = camera:WorldToViewportPoint(targetPart.Position)
        if not onScreen then
            esp.Box.Visible = false
            esp.Name.Visible = false
            esp.Tracer.Visible = false
            esp.Distance.Visible = false
            continue
        end
        
        local distance = GetDistance(targetPart.Position)
        
        local isEnemy = true
        if Config.ESP_TeamCheck and localTeam and playerTeam then
            isEnemy = localTeam ~= playerTeam
        end
        
        if isEnemy then
            local visible = IsVisible(targetPart)
            local col = Config.ESP_Rainbow and GetRainbow() or (visible and Palette.ESP_Visible or Palette.ESP_Enemy)
            
            local boxHeight = 1400 / math.max(rootPos.Z, 1)
            boxHeight = math.clamp(boxHeight, 20, 400)
            local boxWidth = boxHeight * 0.55
            
            if Config.ESP_Box then
                esp.Box.Size = Vector2.new(boxWidth, boxHeight)
                esp.Box.Position = Vector2.new(rootPos.X - boxWidth / 2, rootPos.Y - boxHeight * 0.55)
                esp.Box.Color = col
                esp.Box.Visible = true
            else
                esp.Box.Visible = false
            end
            
            if Config.ESP_Name then
                esp.Name.Position = Vector2.new(rootPos.X, rootPos.Y - boxHeight * 0.55 - 16)
                esp.Name.Visible = true
            else
                esp.Name.Visible = false
            end
            
            if Config.ESP_Tracer then
                esp.Tracer.From = Vector2.new(rootPos.X, rootPos.Y + boxHeight * 0.45)
                esp.Tracer.To = Vector2.new(rootPos.X, camera.ViewportSize.Y)
                esp.Tracer.Color = col
                esp.Tracer.Visible = true
            else
                esp.Tracer.Visible = false
            end
            
            if Config.ESP_Distance then
                esp.Distance.Text = math.floor(distance) .. "m"
                esp.Distance.Position = Vector2.new(rootPos.X, rootPos.Y + boxHeight * 0.45 + 4)
                esp.Distance.Color = Color3.new(1, 1, 1)
                esp.Distance.Visible = true
            else
                esp.Distance.Visible = false
            end
        else
            esp.Box.Visible = false
            esp.Name.Visible = false
            esp.Tracer.Visible = false
            esp.Distance.Visible = false
        end
    end
end

local fovCircle = Drawing.new("Circle")
fovCircle.Thickness = 1
fovCircle.NumSides = Tuning.FOVSegments
fovCircle.Filled = false
fovCircle.Visible = false

local function UpdateFOV()
    if Config.AIM_Enabled and Config.AIM_FOVEnabled then
        local mousePos = UserInputService:GetMouseLocation()
        fovCircle.Position = mousePos
        fovCircle.Radius = Config.AIM_FOV
        fovCircle.Color = State.Aiming and Palette.FOV_Active or Palette.FOV_Circle
        fovCircle.Visible = true
    else
        fovCircle.Visible = false
    end
end

local Radar = {
    bg = Drawing.new("Square"),
    border = Drawing.new("Square"),
    cross1 = Drawing.new("Line"),
    cross2 = Drawing.new("Line"),
    center = Drawing.new("Triangle"),
    dots = {}
}

do
    Radar.bg.Filled = true
    Radar.bg.Color = Palette.RadarBg
    Radar.bg.Transparency = 0.85
    Radar.bg.Visible = false
    
    Radar.border.Filled = false
    Radar.border.Color = Palette.RadarBorder
    Radar.border.Thickness = 1
    Radar.border.Visible = false
    
    Radar.cross1.Color = Palette.RadarGrid
    Radar.cross1.Thickness = 1
    Radar.cross1.Visible = false
    
    Radar.cross2.Color = Palette.RadarGrid
    Radar.cross2.Thickness = 1
    Radar.cross2.Visible = false
    
    Radar.center.Filled = true
    Radar.center.Color = Palette.RadarYou
    Radar.center.Visible = false
    
    for i = 1, 30 do
        local d = Drawing.new("Triangle")
        d.Filled = true
        d.Color = Palette.RadarEnemy
        d.Visible = false
        Radar.dots[i] = d
    end
end

local Compass = {
    bg = Drawing.new("Square"),
    bgGrad = Drawing.new("Square"),
    texts = {},
    ticks = {},
    indicators = {},
    centerLine = Drawing.new("Line")
}

do
    Compass.bg.Filled = true
    Compass.bg.Color = Palette.CompassBg
    Compass.bg.Transparency = 0.6
    Compass.bg.Visible = false
    
    Compass.bgGrad.Filled = true
    Compass.bgGrad.Transparency = 0.8
    Compass.bgGrad.Visible = false
    
    Compass.centerLine.Color = Palette.RadarYou
    Compass.centerLine.Thickness = 2
    Compass.centerLine.Visible = false
    
    local cardinals = {"N", "15", "30", "NE", "60", "75", "E", "105", "120", "SE", "150", "165", "S", "195", "210", "SW", "240", "255", "W", "285", "300", "NW", "330", "345"}
    for i = 1, 24 do
        local t = Drawing.new("Text")
        t.Size = 12
        t.Font = Drawing.Fonts.Monospace
        t.Center = true
        t.Outline = true
        t.Text = cardinals[i]
        t.Visible = false
        Compass.texts[i] = t
    end
    
    for i = 1, 72 do
        local tick = Drawing.new("Line")
        tick.Color = Palette.CompassTick
        tick.Thickness = 1
        tick.Visible = false
        Compass.ticks[i] = tick
    end
    
    for i = 1, 20 do
        local ind = Drawing.new("Triangle")
        ind.Filled = true
        ind.Color = Palette.CompassEnemy
        ind.Visible = false
        Compass.indicators[i] = ind
    end
end

local function HideRadar()
    Radar.bg.Visible = false
    Radar.border.Visible = false
    Radar.cross1.Visible = false
    Radar.cross2.Visible = false
    Radar.center.Visible = false
    for _, d in ipairs(Radar.dots) do d.Visible = false end
end

local function HideCompass()
    Compass.bg.Visible = false
    Compass.bgGrad.Visible = false
    Compass.centerLine.Visible = false
    for _, t in ipairs(Compass.texts) do t.Visible = false end
    for _, t in ipairs(Compass.ticks) do t.Visible = false end
    for _, i in ipairs(Compass.indicators) do i.Visible = false end
end

local function Update2DRadar()
    camera = workspace.CurrentCamera
    if not camera then
        HideRadar()
        return
    end
    
    local myChar = GetLocalCharacter()
    if not myChar then
        HideRadar()
        return
    end
    local myRoot = GetTargetPart(myChar)
    if not myRoot then
        HideRadar()
        return
    end
    local charsFolder = GetCharactersFolder()
    
    local size = Config.RADAR_Size
    local screenSize = camera.ViewportSize
    local defaultPos = Vector2.new(screenSize.X - size - 160, 15)
    local pos = State.Radar2D_Pos or defaultPos
    local center = pos + Vector2.new(size/2, size/2)
    
    Radar.bg.Position = pos
    Radar.bg.Size = Vector2.new(size, size)
    Radar.bg.Visible = true
    
    Radar.border.Position = pos
    Radar.border.Size = Vector2.new(size, size)
    Radar.border.Color = Config.RADAR_MoveMode and Color3.fromRGB(255, 200, 50) or Palette.RadarBorder
    Radar.border.Thickness = Config.RADAR_MoveMode and 2 or 1
    Radar.border.Visible = true
    
    Radar.cross1.From = Vector2.new(center.X, pos.Y + 6)
    Radar.cross1.To = Vector2.new(center.X, pos.Y + size - 6)
    Radar.cross1.Visible = true
    
    Radar.cross2.From = Vector2.new(pos.X + 6, center.Y)
    Radar.cross2.To = Vector2.new(pos.X + size - 6, center.Y)
    Radar.cross2.Visible = true
    
    local myLook = camera.CFrame.LookVector
    local myAngle = math.atan2(-myLook.X, -myLook.Z)
    local cosA, sinA = math.cos(myAngle), math.sin(myAngle)
    local scale = (size/2 - 6) / Config.RADAR_Range
    
    local localTeam = GetPlayerTeam(LocalPlayer)
    local dotIdx = 1
    
    for _, player in ipairs(Players:GetPlayers()) do
        if player == LocalPlayer then continue end
        
        local character = charsFolder and charsFolder:FindFirstChild(player.Name)
        local playerTeam = GetPlayerTeam(player)
        
        if not character or not playerTeam then continue end
        
        local isEnemy = true
        if Config.ESP_TeamCheck and localTeam and playerTeam then
            isEnemy = localTeam ~= playerTeam
        end
        
        if not isEnemy then continue end
        
        local root = GetTargetPart(character)
        if not root then continue end
        
        local rx = root.Position.X - myRoot.Position.X
        local rz = root.Position.Z - myRoot.Position.Z
        local dist2D = math.sqrt(rx^2 + rz^2)
        
        if dist2D < Config.RADAR_Range then
            local rotX = rx * cosA - rz * sinA
            local rotZ = rx * sinA + rz * cosA
            local radarX, radarY = rotX * scale, rotZ * scale
            local maxD = size/2 - 6
            local rDist = math.sqrt(radarX^2 + radarY^2)
            if rDist > maxD then
                radarX, radarY = radarX/rDist * maxD, radarY/rDist * maxD
            end
            
            local dotPos = center + Vector2.new(radarX, radarY)
            
            if dotIdx <= #Radar.dots then
                local dot = Radar.dots[dotIdx]
                local ds = 8
                
                local eAngle = 0
                local lookPart = character:FindFirstChild("head_only") 
                    or character:FindFirstChild("Head") 
                    or character:FindFirstChild("TPVBodyVanillaHead")
                    or character:FindFirstChild("helmet")
                    or character:FindFirstChild("TPVBodyVanillaTorsoFront")
                    or root
                
                if lookPart and lookPart:IsA("BasePart") then
                    local lookVec = lookPart.CFrame.LookVector
                    eAngle = math.atan2(-lookVec.X, -lookVec.Z) - myAngle
                end
                
                local eFwd = Vector2.new(-math.sin(eAngle), -math.cos(eAngle))
                local eRight = Vector2.new(-eFwd.Y, eFwd.X)
                
                dot.PointA = dotPos + eFwd * ds
                dot.PointB = dotPos - eFwd * ds/2 + eRight * ds/2
                dot.PointC = dotPos - eFwd * ds/2 - eRight * ds/2
                
                local visible = IsVisible(root)
                dot.Color = visible and Palette.ESP_Visible or Palette.ESP_Enemy
                dot.Visible = true
                dotIdx = dotIdx + 1
            end
        end
    end
    
    for i = dotIdx, #Radar.dots do Radar.dots[i].Visible = false end
    
    local as = Tuning.RadarArrowSize
    Radar.center.PointA = center + Vector2.new(0, -as)
    Radar.center.PointB = center + Vector2.new(-as/2, as/2)
    Radar.center.PointC = center + Vector2.new(as/2, as/2)
    Radar.center.Visible = true
end

local function UpdateHUDRadar()
    camera = workspace.CurrentCamera
    if not camera then
        HideCompass()
        return
    end
    
    local myChar = GetLocalCharacter()
    if not myChar then
        HideCompass()
        return
    end
    local myRoot = GetTargetPart(myChar)
    if not myRoot then
        HideCompass()
        return
    end
    local charsFolder = GetCharactersFolder()
    
    local screenSize = camera.ViewportSize
    local cw = Tuning.CompassWidth
    local ch = Tuning.CompassHeight
    local defaultCx = screenSize.X / 2 - cw / 2
    local defaultCy = 70
    local hudPos = State.RadarHUD_Pos or Vector2.new(defaultCx, defaultCy)
    local cx = hudPos.X
    local cy = hudPos.Y
    
    Compass.bg.Position = Vector2.new(cx, cy)
    Compass.bg.Size = Vector2.new(cw, ch)
    Compass.bg.Color = Config.RADAR_MoveMode and Color3.fromRGB(50, 40, 20) or Palette.CompassBg
    Compass.bg.Visible = true
    
    local myLook = camera.CFrame.LookVector
    local myYaw = math.deg(math.atan2(-myLook.X, -myLook.Z))
    if myYaw < 0 then myYaw = myYaw + 360 end
    
    local centerX = cx + cw / 2
    
    Compass.centerLine.From = Vector2.new(centerX, cy + 2)
    Compass.centerLine.To = Vector2.new(centerX, cy + ch - 2)
    Compass.centerLine.Color = Config.RADAR_MoveMode and Color3.fromRGB(255, 200, 50) or Palette.RadarYou
    Compass.centerLine.Visible = true
    
    local cardinalData = {
        [0] = "N", [45] = "NE", [90] = "E", [135] = "SE",
        [180] = "S", [225] = "SW", [270] = "W", [315] = "NW"
    }
    
    local textIdx = 1
    local tickIdx = 1
    local fov = 90
    local pixPerDeg = cw / fov
    
    for deg = 0, 359, 15 do
        local diff = deg - myYaw
        if diff > 180 then diff = diff - 360 end
        if diff < -180 then diff = diff + 360 end
        
        if math.abs(diff) <= fov / 2 then
            local screenX = centerX - diff * pixPerDeg
            local cardinalText = cardinalData[deg]
            local isCardinal = cardinalText ~= nil
            
            if tickIdx <= #Compass.ticks then
                local tick = Compass.ticks[tickIdx]
                local tickH = isCardinal and 14 or 8
                tick.From = Vector2.new(screenX, cy + ch - tickH - 2)
                tick.To = Vector2.new(screenX, cy + ch - 2)
                tick.Color = isCardinal and Color3.new(1, 1, 1) or Palette.CompassTick
                tick.Visible = true
                tickIdx = tickIdx + 1
            end
            
            if textIdx <= #Compass.texts then
                local t = Compass.texts[textIdx]
                if isCardinal then
                    t.Text = cardinalText
                    t.Color = Color3.new(1, 1, 1)
                    t.Size = 14
                else
                    t.Text = tostring(deg)
                    t.Color = Palette.CompassText
                    t.Size = 10
                end
                t.Position = Vector2.new(screenX, cy + 5)
                t.Visible = true
                textIdx = textIdx + 1
            end
        end
    end
    
    for i = textIdx, #Compass.texts do Compass.texts[i].Visible = false end
    for i = tickIdx, #Compass.ticks do Compass.ticks[i].Visible = false end
    
    local localTeam = GetPlayerTeam(LocalPlayer)
    local indIdx = 1
    
    for _, player in ipairs(Players:GetPlayers()) do
        if player == LocalPlayer then continue end
        
        local character = charsFolder and charsFolder:FindFirstChild(player.Name)
        local playerTeam = GetPlayerTeam(player)
        
        if not character or not playerTeam then continue end
        
        local isEnemy = true
        if Config.ESP_TeamCheck and localTeam and playerTeam then
            isEnemy = localTeam ~= playerTeam
        end
        
        if not isEnemy then continue end
        
        local root = GetTargetPart(character)
        if not root then continue end
        
        local dx = root.Position.X - myRoot.Position.X
        local dz = root.Position.Z - myRoot.Position.Z
        local dist = math.sqrt(dx^2 + dz^2)
        
        if dist < Config.RADAR_Range then
            local enemyYaw = math.deg(math.atan2(-dx, -dz))
            if enemyYaw < 0 then enemyYaw = enemyYaw + 360 end
            
            local diff = enemyYaw - myYaw
            if diff > 180 then diff = diff - 360 end
            if diff < -180 then diff = diff + 360 end
            
            if math.abs(diff) <= fov / 2 then
                local screenX = centerX - diff * pixPerDeg
                
                if indIdx <= #Compass.indicators then
                    local ind = Compass.indicators[indIdx]
                    local sz = 8
                    local indY = cy + ch + 6
                    
                    local lookPart = character:FindFirstChild("head_only") 
                        or character:FindFirstChild("Head") 
                        or character:FindFirstChild("TPVBodyVanillaHead")
                        or character:FindFirstChild("helmet")
                        or character:FindFirstChild("TPVBodyVanillaTorsoFront")
                        or root
                    local facingAngle = 0
                    if lookPart and lookPart:IsA("BasePart") then
                        local enemyLook = lookPart.CFrame.LookVector
                        local enemyFacingYaw = math.deg(math.atan2(-enemyLook.X, -enemyLook.Z))
                        if enemyFacingYaw < 0 then enemyFacingYaw = enemyFacingYaw + 360 end
                        facingAngle = math.rad(myYaw - enemyFacingYaw)
                    end
                    
                    local fwdX = math.sin(facingAngle)
                    local fwdY = -math.cos(facingAngle)
                    local rightX = fwdY
                    local rightY = -fwdX
                    
                    ind.PointA = Vector2.new(screenX + fwdX * sz, indY + fwdY * sz)
                    ind.PointB = Vector2.new(screenX - fwdX * sz * 0.5 - rightX * sz * 0.5, indY - fwdY * sz * 0.5 - rightY * sz * 0.5)
                    ind.PointC = Vector2.new(screenX - fwdX * sz * 0.5 + rightX * sz * 0.5, indY - fwdY * sz * 0.5 + rightY * sz * 0.5)
                    
                    local visible = IsVisible(root)
                    ind.Color = visible and Palette.ESP_Visible or Palette.ESP_Enemy
                    ind.Visible = true
                    indIdx = indIdx + 1
                end
            end
        end
    end
    
    for i = indIdx, #Compass.indicators do Compass.indicators[i].Visible = false end
end

local function UpdateRadar()
    if not Config.RADAR_Enabled then
        HideRadar()
        HideCompass()
        return
    end
    
    if Config.RADAR_Mode == "2D" then
        HideCompass()
        Update2DRadar()
    else
        HideRadar()
        UpdateHUDRadar()
    end
end

local UI = {}
UI.ScreenGui = Instance.new("ScreenGui")
UI.ScreenGui.Name = "RiotfallUI"
UI.ScreenGui.ResetOnSpawn = false
UI.ScreenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
UI.ScreenGui.DisplayOrder = 999

pcall(function() UI.ScreenGui.Parent = game:GetService("CoreGui") end)
if not UI.ScreenGui.Parent then
    UI.ScreenGui.Parent = LocalPlayer:WaitForChild("PlayerGui")
end

local function CreateWatermark()
    local label = Instance.new("TextLabel")
    label.Name = "Watermark"
    label.BackgroundTransparency = 1
    label.Position = UDim2.new(0, 10, 0, 8)
    label.Size = UDim2.new(0, 200, 0, 20)
    label.Font = Enum.Font.RobotoMono
    label.TextSize = 14
    label.TextColor3 = Palette.Accent
    label.TextXAlignment = Enum.TextXAlignment.Left
    label.TextStrokeTransparency = 0.6
    label.Text = "riotfall by leet"
    label.Parent = UI.ScreenGui
    return label
end

local function CreateActiveList()
    local frame = Instance.new("Frame")
    frame.Name = "ActiveList"
    frame.BackgroundTransparency = 1
    frame.AnchorPoint = Vector2.new(1, 0)
    frame.Position = UDim2.new(1, -10, 0, 8)
    frame.Size = UDim2.new(0, 150, 0, 300)
    frame.Parent = UI.ScreenGui
    
    local layout = Instance.new("UIListLayout")
    layout.FillDirection = Enum.FillDirection.Vertical
    layout.HorizontalAlignment = Enum.HorizontalAlignment.Right
    layout.SortOrder = Enum.SortOrder.Name
    layout.Padding = UDim.new(0, 1)
    layout.Parent = frame
    
    return frame
end

local function RefreshActiveList(frame)
    for _, child in ipairs(frame:GetChildren()) do
        if child:IsA("TextLabel") then child:Destroy() end
    end
    
    if not Config.MISC_ActiveList then return end
    
    local features = {}
    if Config.ESP_Enabled then table.insert(features, "ESP") end
    if Config.ESP_Box then table.insert(features, "Box") end
    if Config.ESP_Name then table.insert(features, "Names") end
    if Config.ESP_Distance then table.insert(features, "Distance") end
    if Config.ESP_Tracer then table.insert(features, "Tracers") end
    if Config.AIM_Enabled then table.insert(features, "Aimbot") end
    if Config.SILENT_Enabled then table.insert(features, "Silent Aim") end
    if Config.RADAR_Enabled then table.insert(features, "Radar [" .. Config.RADAR_Mode .. "]") end
    if Config.RADAR_MoveMode then table.insert(features, "Move Mode") end
    
    for i, name in ipairs(features) do
        local lbl = Instance.new("TextLabel")
        lbl.Name = string.format("%02d", i) .. name
        lbl.BackgroundTransparency = 1
        lbl.Size = UDim2.new(1, 0, 0, 16)
        lbl.Font = Enum.Font.RobotoMono
        lbl.TextSize = 13
        lbl.TextColor3 = Palette.ItemOn
        lbl.TextXAlignment = Enum.TextXAlignment.Right
        lbl.TextStrokeTransparency = 0.6
        lbl.Text = name
        lbl.Parent = frame
    end
end

local function CreatePanel(title, items, pos)
    local totalHeight = Tuning.PanelHeaderH
    for _, item in ipairs(items) do
        if item.type == "slider" then
            totalHeight = totalHeight + Tuning.SliderHeight
        else
            totalHeight = totalHeight + Tuning.ItemHeight
        end
    end
    totalHeight = totalHeight + 6
    
    local panel = Instance.new("Frame")
    panel.Name = title
    panel.BackgroundColor3 = Palette.PanelBg
    panel.BackgroundTransparency = 0.08
    panel.BorderSizePixel = 0
    panel.Position = pos
    panel.Size = UDim2.new(0, Tuning.PanelWidth, 0, totalHeight)
    panel.Active = true
    panel.Draggable = true
    panel.Parent = UI.ScreenGui
    
    local stroke = Instance.new("UIStroke")
    stroke.Color = Palette.PanelBorder
    stroke.Thickness = 1
    stroke.Parent = panel
    
    local header = Instance.new("Frame")
    header.Name = "Header"
    header.BackgroundColor3 = Palette.PanelHeader
    header.BackgroundTransparency = 0.05
    header.BorderSizePixel = 0
    header.Size = UDim2.new(1, 0, 0, Tuning.PanelHeaderH)
    header.Parent = panel
    
    local titleLabel = Instance.new("TextLabel")
    titleLabel.Name = "Title"
    titleLabel.BackgroundTransparency = 1
    titleLabel.Size = UDim2.new(1, 0, 1, 0)
    titleLabel.Font = Enum.Font.GothamBold
    titleLabel.TextSize = Tuning.FontSize
    titleLabel.TextColor3 = Palette.Text
    titleLabel.Text = title
    titleLabel.Parent = header
    
    local yOffset = Tuning.PanelHeaderH + 3
    
    for _, item in ipairs(items) do
        if item.type == "toggle" then
            local btn = Instance.new("TextButton")
            btn.Name = item.key
            btn.BackgroundColor3 = Palette.ItemHover
            btn.BackgroundTransparency = 1
            btn.BorderSizePixel = 0
            btn.Position = UDim2.new(0, 0, 0, yOffset)
            btn.Size = UDim2.new(1, 0, 0, Tuning.ItemHeight)
            btn.Font = Enum.Font.RobotoMono
            btn.TextSize = Tuning.FontSize
            btn.TextXAlignment = Enum.TextXAlignment.Left
            btn.AutoButtonColor = false
            btn.Parent = panel
            
            local pad = Instance.new("UIPadding")
            pad.PaddingLeft = UDim.new(0, 10)
            pad.Parent = btn
            
            local function Update()
                btn.TextColor3 = Config[item.key] and Palette.ItemOn or Palette.ItemOff
                btn.Text = item.name
            end
            Update()
            
            btn.MouseEnter:Connect(function() btn.BackgroundTransparency = 0.5 end)
            btn.MouseLeave:Connect(function() btn.BackgroundTransparency = 1 end)
            btn.MouseButton1Click:Connect(function()
                Config[item.key] = not Config[item.key]
                Update()
                if UI.ActiveList then RefreshActiveList(UI.ActiveList) end
            end)
            
            yOffset = yOffset + Tuning.ItemHeight
            
        elseif item.type == "dropdown" then
            local btn = Instance.new("TextButton")
            btn.Name = item.key
            btn.BackgroundColor3 = Palette.ItemHover
            btn.BackgroundTransparency = 1
            btn.BorderSizePixel = 0
            btn.Position = UDim2.new(0, 0, 0, yOffset)
            btn.Size = UDim2.new(1, 0, 0, Tuning.ItemHeight)
            btn.Font = Enum.Font.RobotoMono
            btn.TextSize = Tuning.FontSize
            btn.TextXAlignment = Enum.TextXAlignment.Left
            btn.AutoButtonColor = false
            btn.Parent = panel
            
            local pad = Instance.new("UIPadding")
            pad.PaddingLeft = UDim.new(0, 10)
            pad.Parent = btn
            
            local idx = 1
            for i, opt in ipairs(item.options) do
                if opt == Config[item.key] then idx = i break end
            end
            
            local function Update()
                btn.Text = item.name .. ": " .. Config[item.key]
                btn.TextColor3 = Palette.ItemOff
            end
            Update()
            
            btn.MouseEnter:Connect(function() btn.BackgroundTransparency = 0.5 end)
            btn.MouseLeave:Connect(function() btn.BackgroundTransparency = 1 end)
            btn.MouseButton1Click:Connect(function()
                idx = idx % #item.options + 1
                Config[item.key] = item.options[idx]
                Update()
            end)
            
            yOffset = yOffset + Tuning.ItemHeight
            
        elseif item.type == "slider" then
            local container = Instance.new("Frame")
            container.Name = item.key
            container.BackgroundTransparency = 1
            container.Position = UDim2.new(0, 10, 0, yOffset)
            container.Size = UDim2.new(1, -20, 0, Tuning.SliderHeight - 4)
            container.Parent = panel
            
            local label = Instance.new("TextLabel")
            label.Name = "Label"
            label.BackgroundTransparency = 1
            label.Size = UDim2.new(1, 0, 0, 16)
            label.Font = Enum.Font.RobotoMono
            label.TextSize = 12
            label.TextColor3 = Palette.TextDim
            label.TextXAlignment = Enum.TextXAlignment.Left
            label.Parent = container
            
            local track = Instance.new("Frame")
            track.Name = "Track"
            track.BackgroundColor3 = Color3.fromRGB(45, 45, 50)
            track.BorderSizePixel = 0
            track.Position = UDim2.new(0, 0, 0, 18)
            track.Size = UDim2.new(1, 0, 0, 8)
            track.Parent = container
            
            local trackCorner = Instance.new("UICorner")
            trackCorner.CornerRadius = UDim.new(0, 4)
            trackCorner.Parent = track
            
            local fill = Instance.new("Frame")
            fill.Name = "Fill"
            fill.BackgroundColor3 = Palette.Accent
            fill.BorderSizePixel = 0
            fill.Size = UDim2.new(0, 0, 1, 0)
            fill.Parent = track
            
            local fillCorner = Instance.new("UICorner")
            fillCorner.CornerRadius = UDim.new(0, 4)
            fillCorner.Parent = fill
            
            local function UpdateSlider()
                local val = Config[item.key]
                local pct = (val - item.min) / (item.max - item.min)
                fill.Size = UDim2.new(pct, 0, 1, 0)
                label.Text = item.name .. ": " .. tostring(math.floor(val * 10) / 10)
            end
            UpdateSlider()
            
            local dragging = false
            
            track.InputBegan:Connect(function(input)
                if input.UserInputType == Enum.UserInputType.MouseButton1 then
                    dragging = true
                end
            end)
            
            track.InputEnded:Connect(function(input)
                if input.UserInputType == Enum.UserInputType.MouseButton1 then
                    dragging = false
                end
            end)
            
            Connections["slider_" .. item.key] = RunService.RenderStepped:Connect(function()
                if dragging then
                    local mx = UserInputService:GetMouseLocation().X
                    local tx = track.AbsolutePosition.X
                    local tw = track.AbsoluteSize.X
                    local pct = math.clamp((mx - tx) / tw, 0, 1)
                    local val = item.min + pct * (item.max - item.min)
                    val = math.floor(val / item.step + 0.5) * item.step
                    Config[item.key] = math.clamp(val, item.min, item.max)
                    UpdateSlider()
                end
            end)
            
            yOffset = yOffset + Tuning.SliderHeight
        end
    end
    
    return panel
end

UI.Watermark = CreateWatermark()
UI.ActiveList = CreateActiveList()
RefreshActiveList(UI.ActiveList)

UI.Panels = {}

UI.Panels.ESP = CreatePanel("ESP", {
    {type = "toggle", name = "Enabled", key = "ESP_Enabled"},
    {type = "toggle", name = "Box", key = "ESP_Box"},
    {type = "toggle", name = "Names", key = "ESP_Name"},
    {type = "toggle", name = "Distance", key = "ESP_Distance"},
    {type = "toggle", name = "Tracers", key = "ESP_Tracer"},
    {type = "toggle", name = "Rainbow", key = "ESP_Rainbow"},
    {type = "toggle", name = "TeamCheck", key = "ESP_TeamCheck"}
}, UDim2.new(0, 10, 0, 35))

UI.Panels.Aimbot = CreatePanel("Aimbot", {
    {type = "toggle", name = "Enabled", key = "AIM_Enabled"},
    {type = "toggle", name = "ShowFOV", key = "AIM_FOVEnabled"},
    {type = "slider", name = "FOV", key = "AIM_FOV", min = 30, max = 400, step = 5},
    {type = "slider", name = "Smooth", key = "AIM_Smooth", min = 1, max = 15, step = 0.5}
}, UDim2.new(0, 165, 0, 35))

UI.Panels.Silent = CreatePanel("Silent", {
    {type = "toggle", name = "Enabled", key = "SILENT_Enabled"},
    {type = "toggle", name = "Rage Mode", key = "SILENT_Rage"},
    {type = "slider", name = "FOV", key = "SILENT_FOV", min = 50, max = 400, step = 10},
    {type = "toggle", name = "TeamCheck", key = "SILENT_TeamCheck"}
}, UDim2.new(0, 165, 0, 180))

UI.Panels.Radar = CreatePanel("Radar", {
    {type = "toggle", name = "Enabled", key = "RADAR_Enabled"},
    {type = "dropdown", name = "Mode", key = "RADAR_Mode", options = {"2D", "HUD"}},
    {type = "toggle", name = "Move Mode", key = "RADAR_MoveMode"},
    {type = "slider", name = "Size", key = "RADAR_Size", min = 100, max = 200, step = 10},
    {type = "slider", name = "Range", key = "RADAR_Range", min = 50, max = 500, step = 25}
}, UDim2.new(0, 320, 0, 35))

UI.Panels.Misc = CreatePanel("Misc", {
    {type = "toggle", name = "Watermark", key = "MISC_Watermark"},
    {type = "toggle", name = "ActiveList", key = "MISC_ActiveList"}
}, UDim2.new(0, 475, 0, 35))

local function Unload()
    if State.Unloaded then return end
    State.Unloaded = true
    
    for _, conn in pairs(Connections) do
        pcall(function() conn:Disconnect() end)
    end
    
    CleanupAllESP()
    
    pcall(function() fovCircle:Remove() end)
    pcall(function() if Silent.FOVCircle then Silent.FOVCircle:Remove() end end)
    
    pcall(function()
        Radar.bg:Remove()
        Radar.border:Remove()
        Radar.cross1:Remove()
        Radar.cross2:Remove()
        Radar.center:Remove()
        for _, d in ipairs(Radar.dots) do d:Remove() end
    end)
    
    pcall(function()
        Compass.bg:Remove()
        Compass.bgGrad:Remove()
        Compass.centerLine:Remove()
        for _, t in ipairs(Compass.texts) do t:Remove() end
        for _, t in ipairs(Compass.ticks) do t:Remove() end
        for _, i in ipairs(Compass.indicators) do i:Remove() end
    end)
    
    pcall(function() UI.ScreenGui:Destroy() end)
end

local function IsMouseInRect(mousePos, rectPos, rectSize)
    return mousePos.X >= rectPos.X and mousePos.X <= rectPos.X + rectSize.X
        and mousePos.Y >= rectPos.Y and mousePos.Y <= rectPos.Y + rectSize.Y
end

Connections.inputDown = UserInputService.InputBegan:Connect(function(input, gp)
    if input.KeyCode == Enum.KeyCode.Home then
        Unload()
        return
    end
    
    if input.KeyCode == Enum.KeyCode.Insert and not gp then
        UI.ScreenGui.Enabled = not UI.ScreenGui.Enabled
        return
    end
    
    if input.UserInputType == Enum.UserInputType.MouseButton2 then
        State.Aiming = true
    end
    
    if input.UserInputType == Enum.UserInputType.MouseButton1 and not gp then
        Silent.IsShooting = true
        task.delay(0.15, function()
            Silent.IsShooting = false
        end)
    end
    
    if Config.RADAR_MoveMode and input.UserInputType == Enum.UserInputType.MouseButton1 then
        local mousePos = UserInputService:GetMouseLocation()
        local cam = workspace.CurrentCamera
        if not cam then return end
        local screenSize = cam.ViewportSize
        
        if Config.RADAR_Mode == "2D" then
            local size = Config.RADAR_Size
            local defaultPos = Vector2.new(screenSize.X - size - 160, 15)
            local pos = State.Radar2D_Pos or defaultPos
            if IsMouseInRect(mousePos, pos, Vector2.new(size, size)) then
                State.RadarDragging = "2D"
                State.RadarDragOffset = mousePos - pos
            end
        elseif Config.RADAR_Mode == "HUD" then
            local cw = Tuning.CompassWidth
            local ch = Tuning.CompassHeight
            local defaultPos = Vector2.new(screenSize.X / 2 - cw / 2, 70)
            local pos = State.RadarHUD_Pos or defaultPos
            if IsMouseInRect(mousePos, pos, Vector2.new(cw, ch)) then
                State.RadarDragging = "HUD"
                State.RadarDragOffset = mousePos - pos
            end
        end
    end
end)

Connections.inputUp = UserInputService.InputEnded:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton2 then
        State.Aiming = false
        targetEnemy = nil
    end
    
    if input.UserInputType == Enum.UserInputType.MouseButton1 then
        State.RadarDragging = nil
    end
end)

Connections.inputChanged = UserInputService.InputChanged:Connect(function(input)
    if State.RadarDragging and input.UserInputType == Enum.UserInputType.MouseMovement then
        local mousePos = UserInputService:GetMouseLocation()
        local newPos = mousePos - State.RadarDragOffset
        if State.RadarDragging == "2D" then
            State.Radar2D_Pos = newPos
        elseif State.RadarDragging == "HUD" then
            State.RadarHUD_Pos = newPos
        end
    end
end)

Connections.render = RunService.RenderStepped:Connect(function()
    if State.Unloaded then return end
    
    State.RainbowHue = (State.RainbowHue + 0.004) % 1
    
    UpdateESP()
    UpdateAimbot()
    UpdateFOV()
    UpdateRadar()
    
    if Config.SILENT_Enabled then
        GetSilentTarget()
    end
    UpdateSilentFOV()
    UpdateSilentSnap()
    
    if UI.Watermark then
        UI.Watermark.Visible = Config.MISC_Watermark
    end
end)

for _, player in ipairs(Players:GetPlayers()) do
    if player ~= LocalPlayer then
        CreateESP(player)
    end
end

Connections.playerAdded = Players.PlayerAdded:Connect(function(player)
    CreateESP(player)
end)

Connections.playerRemoving = Players.PlayerRemoving:Connect(function(player)
    RemoveESP(player)
end)

Features & Information

PC ONLY NO MOBILE. full source, ready to use includes silent aim rage and normal. ESP, Aimbot, and clean gui. Game has some obfuscation, but it didn't really matter much. Included hud radar. This is open source, so you can always make your own. This is a ready to go polished and unique script. NOT FOR XENO USE HIGHER UNC EXECUTOR. I will see if I make a xeno script but the drawing apis are limited.. Features: ESP: Boxes (Full) Names Distance Tracers (Bottom to target) Rainbow Mode Visibility Colors (Green visible / Red hidden) Team Check Max Distance Filter Aimbot: RMB Aimbot (Right click to lock) FOV Circle (Visual indicator) Smoothing (Adjustable) Team Check Prone/Slide Compensation Silent Aim: Normal Mode (triggers on your shots) Rage Mode (Autokill all enemies) FOV Targeting Team Check Respawn-Safe (works after death/respawn) Radar: 2D Square Minimap HUD Compass (FPS style with cardinal directions) Enemy Direction Indicators Draggable Layout (move anywhere) Configurable Size & Range Visibility-Based Colors Misc: Watermark Active Features List Panic Key (Home to unload)
#riotfall#silentaim#aimbot#esp#source

Community Comments (10)

BormirBormirNov 30, 2025

why not xeno?

Replying to @Bormir
leetleetNov 30, 2025

@Bormir cause xeno has low compatability with drawing libraries its like 80% UNC.. these scripts where made before xeno even was a thing, just ported it over recently..

Replying to @leet
BormirBormirNov 30, 2025

@leet alr

Replying to @Bormir
leetleetNov 30, 2025

@Bormir xeno version is now out

Replying to @leet
transdimensionaltransdimensionalNov 30, 2025

@leet you gotta admit xeno >solara every day (solara got 60 sunc, xeno got 80 sunc)

Replying to @transdimensional
leetleetNov 30, 2025(edited)

@transdimensional i dont mind xeno or solara, i personally have a wave sub so i dont see much use but for the everyday person fosure xeno is great

Replying to @leet
transdimensionaltransdimensionalDec 1, 2025

@leet i use volcano

crystalscrystalsDec 28, 2025

Silent got me banned for "c" dont use!!!

Replying to @crystals
Night2333Night2333Jan 24, 2026

@crystals is just a kick but yeah, and silent seems to do nothing anyways

Night2333Night2333Jan 24, 2026

this script kicks u sometimes

More Scripts for RIOTFALL [FPS]