Chat roast by DEAD_PROC355 (UPDATED)
Key RequiredUniversal

Chat roast by DEAD_PROC355 (UPDATED)

Universal ScriptUzzieladner37Uzzieladner37 1.9K views 2.2K executesUpdated Aug 15, 2026
5.0/ 5(1 votes)
10100% Positive
Lua Script•833 lines (35096 chars)
--[[
    Automated Response System - Ultimate Edition (Google Fixed & Expanded)
    - Randomized Friendly Apology Pool (Girlfriend Approved ✅)
    - Silent Auto-Targeting & Strict Whole-Word Apology Check
    - Custom Whitelist/Ignore Commands (;wl, ;ignore, ;stop)
    - Live Session Stats Tracker & PS5 Dashboard UI
]]

local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local TextChatService = game:FindFirstChild("TextChatService")
local LegacyChat = game:FindFirstChild("Chat")
local TweenService = game:GetService("TweenService")
local RunService = game:GetService("RunService")
local LocalizationService = game:GetService("LocalizationService")

local LocalPlayer = Players.LocalPlayer
local PlayerGui = LocalPlayer:WaitForChild("PlayerGui")

local SystemState = {
    Targets = {},
    TargetList = {},
    Whitelisted = {},
    MenuOpen = false,
    IsLocked = false,
    CurrentIndex = 1,
    TargetIndex = 1,
    TransitionProgress = 1,
    TotalSessionRoasts = 0
}

local CurrentFPS = 60
RunService.RenderStepped:Connect(function(dt)
    if dt > 0 then CurrentFPS = math.floor(1 / dt) end
end)

local function GetSafeAccountAge(player)
    local age = 0
    local success = pcall(function() age = player.AccountAge end)
    if success and age then
        local years = math.floor(age / 365)
        local remDays = age % 365
        if years > 0 then
            return string.format("%d yr%s, %d days old", years, years > 1 and "s" or "", remDays)
        else
            return string.format("%d days old", remDays)
        end
    end
    return "N/A"
end

local function DetectDevice(player)
    if player ~= LocalPlayer then return "PC / Console" end
    if UserInputService.TouchEnabled and not UserInputService.KeyboardEnabled then
        return "Mobile / Tablet"
    elseif UserInputService.GamepadEnabled and not UserInputService.KeyboardEnabled then
        return "Console"
    elseif UserInputService.VREnabled then
        return "VR Headset"
    else
        return "PC (Keyboard/Mouse)"
    end
end

local AggroKeywords = {"buns", "trash", "bad", "bot", "terrible", "horrible", "ez", "free kill", "sucks", "noob", "garb", "dog", "shut up", "shutup", "quiet", "ratio", "dumb", "idiot"}
local NiceKeywords = {"w", "gg", "nice", "clutch", "goat", "pro", "carry"}
local EmojiCombos = {" 💀😭✌️", " 🥀🙏😞💔", " 🤨👍😔", " 💀🥀", " 😭💀💔", " 🤨🤣👍", " 🤡💀", " 😭🙏", " 🥱🤫🧏‍♂️", " 💀", " 😭", " 🤡"}

local CustomApologies = {
    "we good now (user), stay on the safe side 🤞",
    "no worries at all (user), all love here ❤️",
    "it's all good (user), we're just here to have fun ✨",
    "water under the bridge (user), let's get it 🙌",
    "all good (user), appreciate you stepping up 🤝",
    "no hard feelings (user), let's keep the good vibes rolling 🌟"
}

local ContextualClapbacks = {
    ShutUp = {
        "bro's really trying to police the server chat",
        "imagine typing shut up while playing like a training dummy",
        "bro thinks he's the admin of the lobby",
        "quiet down bro, your stats are embarrassing",
        "bro's talking loud for someone getting carried",
        "calm down, your keyboard is working harder than you are"
    },
    Trash = {
        "bro is projecting his entire lobby performance right now",
        "talking about trash with zero game sense is wild",
        "bro's inventory is full of excuses",
        "absolute lobby specimen calling others trash",
        "bro's skill tree is completely empty"
    },
    DogOrBot = {
        "bot behavior spotted in the wild",
        "bro is moving like a tutorial NPC",
        "running around like a lost training bot",
        "bro got outplayed by physics itself",
        "absolute zero mechanical skill"
    }
}

local AdvancedFragments = {
    Openers = {
        "Bro %s", "Why is %s", "Imagine %s", "Look at %s", "Bro %s really thought",
        "Absolute cinema watching %s", "Can someone check on %s?", "%s out here moving like", "Bro %s is genuinely acting like"
    },
    Actions = {
        "trying to cook in public", "typing essays with zero game sense", "missing every single input",
        "running around like a lost tutorial bot", "blaming their setup for being down bad", "fighting the air and losing",
        "dodging skill checks like it's their job", "freezing up the second things get real", "spamming buttons with zero strategy"
    },
    Punchlines = {
        "while getting carried by pure luck.", "and still ending up dead last on the board.", "like a literal training dummy.",
        "with negative tactical awareness.", "while the entire server watches in pure silence.", "and expecting everyone to clap.",
        "like they downloaded the game five minutes ago.", "and acting like they did something major."
    }
}

local function FetchPlayerLocation(player)
    local success, code = pcall(function() return LocalizationService:GetCountryRegionForPlayerAsync(player) end)
    if success and code and code ~= "" then return tostring(code) end
    return "Unknown Country/Region"
end

local function SendChatMessage(message)
    if TextChatService then
        local textChannels = TextChatService:FindFirstChild("TextChannels")
        if textChannels then
            local general = textChannels:FindFirstChild("RBXGeneral") or textChannels:FindFirstChildOfClass("TextChannel")
            if general then pcall(function() general:SendAsync(message) end) return true end
        end
    end
    if LegacyChat and LegacyChat:FindFirstChild("Chat") then
        local chat = LegacyChat.Chat
        if chat and chat:FindFirstChild("SendMessage") then pcall(function() chat:SendMessage(message) end) return true end
    end
    return false
end

local function FindPlayerByPartialName(partial)
    if not partial or partial == "" then return nil end
    local search = partial:lower():gsub("%s+", "")
    for _, player in ipairs(Players:GetPlayers()) do
        if player ~= LocalPlayer then
            if player.Name:lower() == search or (player.DisplayName and player.DisplayName:lower() == search) then return player end
        end
    end
    for _, player in ipairs(Players:GetPlayers()) do
        if player ~= LocalPlayer then
            if player.Name:lower():sub(1, #search) == search or (player.DisplayName and player.DisplayName:lower():sub(1, #search) == search) then return player end
        end
    end
    return nil
end

local function IsTrueApology(message)
    local exactApologies = {"mb", "my bad", "sorry", "sry", "forgive", "didn't mean to", "didnt mean to"}
    local padded = " " .. message:lower() .. " "
    for _, apol in ipairs(exactApologies) do
        if padded:find(" " .. apol .. " ") then return true end
    end
    return false
end

local function GenerateDynamicComboResponse(player, message)
    local name = player.DisplayName or player.Name
    local msgLower = message:lower()
    local baseRoast = ""

    if msgLower:find("shut") or msgLower:find("quiet") or msgLower:find("ratio") then
        local line = ContextualClapbacks.ShutUp[math.random(1, #ContextualClapbacks.ShutUp)]
        baseRoast = string.format("Bro %s, %s", name, line)
    elseif msgLower:find("trash") or msgLower:find("garb") or msgLower:find("buns") then
        local line = ContextualClapbacks.Trash[math.random(1, #ContextualClapbacks.Trash)]
        baseRoast = string.format("Look at %s, %s", name, line)
    elseif msgLower:find("bot") or msgLower:find("dog") or msgLower:find("dumb") or msgLower:find("idiot") then
        local line = ContextualClapbacks.DogOrBot[math.random(1, #ContextualClapbacks.DogOrBot)]
        baseRoast = string.format("%s out here, %s", name, line)
    else
        local opener = AdvancedFragments.Openers[math.random(1, #AdvancedFragments.Openers)]
        local action = AdvancedFragments.Actions[math.random(1, #AdvancedFragments.Actions)]
        local punchline = AdvancedFragments.Punchlines[math.random(1, #AdvancedFragments.Punchlines)]
        baseRoast = string.format("%s %s %s", opener, action, punchline)
        baseRoast = string.format(baseRoast, name)
    end
    
    if math.random() <= 0.5 then
        baseRoast = baseRoast .. EmojiCombos[math.random(1, #EmojiCombos)]
    end
    
    return baseRoast
end

local function EaseOutCubic(t) return 1 - math.pow(1 - t, 3) end

local function EnableWidgetDragging(frame)
    local dragging = false
    local dragStart = Vector3.zero
    local startPos = UDim2.new()

    local function IsInputInsideFrame(inputPos)
        local framePos = frame.AbsolutePosition
        local frameSize = frame.AbsoluteSize
        return inputPos.X >= framePos.X and inputPos.X <= (framePos.X + frameSize.X)
            and inputPos.Y >= framePos.Y and inputPos.Y <= (framePos.Y + frameSize.Y)
    end

    UserInputService.InputBegan:Connect(function(input)
        if SystemState.IsLocked then return end
        if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
            if IsInputInsideFrame(input.Position) then
                dragging = true
                dragStart = input.Position
                startPos = frame.Position
            end
        end
    end)

    UserInputService.InputChanged:Connect(function(input)
        if dragging and not SystemState.IsLocked then
            if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
                local delta = input.Position - dragStart
                frame.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
            end
        end
    end)

    UserInputService.InputEnded:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
            dragging = false
        end
    end)
end

local function BuildUI()
    local ScreenGui = Instance.new("ScreenGui")
    ScreenGui.Name = "PS5DashboardUI"
    ScreenGui.Parent = PlayerGui
    ScreenGui.ResetOnSpawn = false
    ScreenGui.IgnoreGuiInset = true
    ScreenGui.DisplayOrder = 999999
    ScreenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling

    local DashboardRoot = Instance.new("Frame")
    DashboardRoot.Name = "DashboardRoot"
    DashboardRoot.Size = UDim2.new(1, 0, 1, 0)
    DashboardRoot.BackgroundColor3 = Color3.fromRGB(5, 6, 9)
    DashboardRoot.Visible = false
    DashboardRoot.Active = true
    DashboardRoot.Parent = ScreenGui

    local AtmosphericBG = Instance.new("ImageLabel")
    AtmosphericBG.Name = "AtmosphericBG"
    AtmosphericBG.Size = UDim2.new(1.1, 0, 1.1, 0)
    AtmosphericBG.Position = UDim2.new(-0.05, 0, -0.05, 0)
    AtmosphericBG.BackgroundColor3 = Color3.fromRGB(5, 6, 9)
    AtmosphericBG.ScaleType = Enum.ScaleType.Crop
    AtmosphericBG.ImageTransparency = 0.6
    AtmosphericBG.Parent = DashboardRoot

    local DarkVignette = Instance.new("Frame")
    DarkVignette.Size = UDim2.new(1, 0, 1, 0)
    DarkVignette.BackgroundColor3 = Color3.fromRGB(0, 0, 0)
    DarkVignette.BackgroundTransparency = 0.35
    DarkVignette.Parent = DashboardRoot

    local TopBar = Instance.new("Frame")
    TopBar.Size = UDim2.new(1, -40, 0, 45)
    TopBar.Position = UDim2.new(0, 20, 0, 15)
    TopBar.BackgroundTransparency = 1
    TopBar.Parent = DashboardRoot

    local PlayersTab = Instance.new("TextLabel")
    PlayersTab.Size = UDim2.new(0, 100, 1, 0)
    PlayersTab.Position = UDim2.new(0, 20, 0, 0)
    PlayersTab.BackgroundTransparency = 1
    PlayersTab.Text = "Players"
    PlayersTab.TextColor3 = Color3.fromRGB(255, 255, 255)
    PlayersTab.TextSize = 20
    PlayersTab.Font = Enum.Font.GothamBold
    PlayersTab.TextXAlignment = Enum.TextXAlignment.Left
    PlayersTab.Parent = TopBar

    local TabLine = Instance.new("Frame")
    TabLine.Size = UDim2.new(0, 75, 0, 3)
    TabLine.Position = UDim2.new(0, 20, 1, -5)
    TabLine.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
    TabLine.BorderSizePixel = 0
    TabLine.Parent = TopBar

    local TimeLabel = Instance.new("TextLabel")
    TimeLabel.Size = UDim2.new(0, 90, 1, 0)
    TimeLabel.Position = UDim2.new(1, -90, 0, 0)
    TimeLabel.BackgroundTransparency = 1
    TimeLabel.TextColor3 = Color3.fromRGB(240, 243, 255)
    TimeLabel.TextSize = 14
    TimeLabel.Font = Enum.Font.GothamMedium
    TimeLabel.TextXAlignment = Enum.TextXAlignment.Right
    TimeLabel.Text = "10:42 PM"
    TimeLabel.Parent = TopBar

    task.spawn(function()
        while true do
            local date = os.date("*t")
            local hour = date.hour % 12
            if hour == 0 then hour = 12 end
            local ampm = date.hour >= 12 and "PM" or "AM"
            TimeLabel.Text = string.format("%d:%02d %s", hour, date.min, ampm)
            task.wait(10)
        end
    end)

    local CommandFrame = Instance.new("Frame")
    CommandFrame.Name = "CommandFrame"
    CommandFrame.Size = UDim2.new(0, 260, 0, 32)
    CommandFrame.Position = UDim2.new(1, -360, 0, 20)
    CommandFrame.BackgroundColor3 = Color3.fromRGB(30, 34, 46)
    CommandFrame.BackgroundTransparency = 0.25
    CommandFrame.BorderSizePixel = 0
    CommandFrame.Parent = DashboardRoot

    Instance.new("UICorner", CommandFrame).CornerRadius = UDim.new(1, 0)

    local CommandBar = Instance.new("TextBox")
    CommandBar.Size = UDim2.new(1, -16, 1, 0)
    CommandBar.Position = UDim2.new(0, 8, 0, 0)
    CommandBar.BackgroundTransparency = 1
    CommandBar.TextColor3 = Color3.fromRGB(255, 255, 255)
    CommandBar.TextSize = 11
    CommandBar.Font = Enum.Font.GothamMedium
    CommandBar.PlaceholderText = "🔍 ;roast, ;wl, ;ignore, ;stop..."
    CommandBar.PlaceholderColor3 = Color3.fromRGB(150, 155, 175)
    CommandBar.TextXAlignment = Enum.TextXAlignment.Left
    CommandBar.ClearTextOnFocus = true
    CommandBar.Parent = CommandFrame

    local CarouselContainer = Instance.new("Frame")
    CarouselContainer.Name = "CarouselContainer"
    CarouselContainer.Size = UDim2.new(1, 0, 0, 150)
    CarouselContainer.Position = UDim2.new(0, 0, 0, 70)
    CarouselContainer.BackgroundTransparency = 1
    CarouselContainer.ClipsDescendants = false
    CarouselContainer.Parent = DashboardRoot

    local startX = 0
    local isSwiping = false

    UserInputService.InputBegan:Connect(function(input)
        if not SystemState.MenuOpen or SystemState.IsLocked then return end
        if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
            startX = input.Position.X
            isSwiping = true
        end
    end)

    UserInputService.InputEnded:Connect(function(input)
        if not SystemState.MenuOpen or not isSwiping or SystemState.IsLocked then return end
        if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
            isSwiping = false
            local deltaX = input.Position.X - startX
            if math.abs(deltaX) > 25 then
                if deltaX < 0 then
                    if SystemState.TargetIndex < #SystemState.TargetList then
                        SystemState.CurrentIndex = SystemState.TargetIndex
                        SystemState.TargetIndex = SystemState.TargetIndex + 1
                        SystemState.TransitionProgress = 0
                    end
                else
                    if SystemState.TargetIndex > 1 then
                        SystemState.CurrentIndex = SystemState.TargetIndex
                        SystemState.TargetIndex = SystemState.TargetIndex - 1
                        SystemState.TransitionProgress = 0
                    end
                end
            end
        end
    end)

    local DetailsFrame = Instance.new("Frame")
    DetailsFrame.Name = "DetailsFrame"
    DetailsFrame.Size = UDim2.new(1, -40, 0, 180)
    DetailsFrame.Position = UDim2.new(0, 20, 0, 225)
    DetailsFrame.BackgroundTransparency = 1
    DetailsFrame.Parent = DashboardRoot

    local TagBadge = Instance.new("TextLabel", DetailsFrame)
    TagBadge.Size = UDim2.new(0, 60, 0, 16)
    TagBadge.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
    TagBadge.TextColor3 = Color3.fromRGB(0, 0, 0)
    TagBadge.Text = "TARGET"
    TagBadge.TextSize = 9
    TagBadge.Font = Enum.Font.GothamBold
    Instance.new("UICorner", TagBadge).CornerRadius = UDim.new(0, 4)

    local FocusedTitle = Instance.new("TextLabel", DetailsFrame)
    FocusedTitle.Size = UDim2.new(1, 0, 0, 24)
    FocusedTitle.Position = UDim2.new(0, 0, 0, 20)
    FocusedTitle.BackgroundTransparency = 1
    FocusedTitle.TextColor3 = Color3.fromRGB(255, 255, 255)
    FocusedTitle.TextSize = 20
    FocusedTitle.Font = Enum.Font.GothamBold
    FocusedTitle.TextXAlignment = Enum.TextXAlignment.Left
    FocusedTitle.Text = "Select a Target"

    local FocusedSub = Instance.new("TextLabel", DetailsFrame)
    FocusedSub.Size = UDim2.new(1, 0, 0, 16)
    FocusedSub.Position = UDim2.new(0, 0, 0, 44)
    FocusedSub.BackgroundTransparency = 1
    FocusedSub.TextColor3 = Color3.fromRGB(180, 185, 200)
    FocusedSub.TextSize = 12
    FocusedSub.Font = Enum.Font.GothamMedium
    FocusedSub.TextXAlignment = Enum.TextXAlignment.Left
    FocusedSub.Text = "@username"

    local MetaCard = Instance.new("Frame", DetailsFrame)
    MetaCard.Size = UDim2.new(1, 0, 0, 105)
    MetaCard.Position = UDim2.new(0, 0, 0, 65)
    MetaCard.BackgroundColor3 = Color3.fromRGB(18, 22, 32)
    MetaCard.BackgroundTransparency = 0.3
    MetaCard.BorderSizePixel = 0
    Instance.new("UICorner", MetaCard).CornerRadius = UDim.new(0, 8)

    local MetaAge = Instance.new("TextLabel", MetaCard)
    MetaAge.Size = UDim2.new(0.5, -10, 0, 18)
    MetaAge.Position = UDim2.new(0, 10, 0, 8)
    MetaAge.BackgroundTransparency = 1
    MetaAge.TextColor3 = Color3.fromRGB(220, 225, 240)
    MetaAge.TextSize = 11
    MetaAge.Font = Enum.Font.GothamMedium
    MetaAge.TextXAlignment = Enum.TextXAlignment.Left
    MetaAge.Text = "🎂 Age: --"

    local MetaLocation = Instance.new("TextLabel", MetaCard)
    MetaLocation.Size = UDim2.new(0.5, -10, 0, 18)
    MetaLocation.Position = UDim2.new(0.5, 5, 0, 8)
    MetaLocation.BackgroundTransparency = 1
    MetaLocation.TextColor3 = Color3.fromRGB(220, 225, 240)
    MetaLocation.TextSize = 11
    MetaLocation.Font = Enum.Font.GothamMedium
    MetaLocation.TextXAlignment = Enum.TextXAlignment.Left
    MetaLocation.Text = "🌐 Location: --"

    local MetaReason = Instance.new("TextLabel", MetaCard)
    MetaReason.Size = UDim2.new(1, -20, 0, 18)
    MetaReason.Position = UDim2.new(0, 10, 0, 30)
    MetaReason.BackgroundTransparency = 1
    MetaReason.TextColor3 = Color3.fromRGB(255, 130, 130)
    MetaReason.TextSize = 11
    MetaReason.Font = Enum.Font.GothamMedium
    MetaReason.TextXAlignment = Enum.TextXAlignment.Left
    MetaReason.Text = "🎯 Reason: --"

    local MetaShame = Instance.new("TextLabel", MetaCard)
    MetaShame.Size = UDim2.new(0.5, -10, 0, 18)
    MetaShame.Position = UDim2.new(0, 10, 0, 52)
    MetaShame.BackgroundTransparency = 1
    MetaShame.TextColor3 = Color3.fromRGB(255, 200, 100)
    MetaShame.TextSize = 11
    MetaShame.Font = Enum.Font.GothamMedium
    MetaShame.TextXAlignment = Enum.TextXAlignment.Left
    MetaShame.Text = "🔥 Roasts: 0"

    local MetaDevice = Instance.new("TextLabel", MetaCard)
    MetaDevice.Size = UDim2.new(0.5, -10, 0, 18)
    MetaDevice.Position = UDim2.new(0.5, 5, 0, 52)
    MetaDevice.BackgroundTransparency = 1
    MetaDevice.TextColor3 = Color3.fromRGB(160, 200, 255)
    MetaDevice.TextSize = 11
    MetaDevice.Font = Enum.Font.GothamMedium
    MetaDevice.TextXAlignment = Enum.TextXAlignment.Left
    MetaDevice.Text = "📱 Device: --"

    local MetaSessionStats = Instance.new("TextLabel", MetaCard)
    MetaSessionStats.Name = "MetaSessionStats"
    MetaSessionStats.Size = UDim2.new(1, -20, 0, 18)
    MetaSessionStats.Position = UDim2.new(0, 10, 0, 75)
    MetaSessionStats.BackgroundTransparency = 1
    MetaSessionStats.TextColor3 = Color3.fromRGB(130, 255, 160)
    MetaSessionStats.TextSize = 11
    MetaSessionStats.Font = Enum.Font.GothamBold
    MetaSessionStats.TextXAlignment = Enum.TextXAlignment.Left
    MetaSessionStats.Text = "⚡ Session Stats: 0 Total Combacks Fired"

    local WidgetContainer = Instance.new("Frame", ScreenGui)
    WidgetContainer.Name = "TopWidgetContainer"
    WidgetContainer.Size = UDim2.new(0, 88, 0, 42)
    WidgetContainer.Position = UDim2.new(0.5, -44, 0, 10)
    WidgetContainer.BackgroundTransparency = 1
    WidgetContainer.ZIndex = 1000000
    WidgetContainer.Active = true

    local ToggleCircle = Instance.new("ImageButton", WidgetContainer)
    ToggleCircle.Name = "RuleBreakerToggle"
    ToggleCircle.Size = UDim2.new(0, 42, 0, 42)
    ToggleCircle.BackgroundColor3 = Color3.fromRGB(20, 24, 34)
    ToggleCircle.BorderSizePixel = 0
    ToggleCircle.ZIndex = 1000001
    Instance.new("UICorner", ToggleCircle).CornerRadius = UDim.new(1, 0)
    local CircleStroke = Instance.new("UIStroke", ToggleCircle)
    CircleStroke.Color = Color3.fromRGB(255, 255, 255)
    CircleStroke.Thickness = 2

    local CircleIcon = Instance.new("TextLabel", ToggleCircle)
    CircleIcon.Size = UDim2.new(1, 0, 1, 0)
    CircleIcon.BackgroundTransparency = 1
    CircleIcon.Text = "👑"
    CircleIcon.TextSize = 18

    local LockButton = Instance.new("TextButton", WidgetContainer)
    LockButton.Name = "LockButton"
    LockButton.Size = UDim2.new(0, 42, 0, 42)
    LockButton.Position = UDim2.new(0, 46, 0, 0)
    LockButton.BackgroundColor3 = Color3.fromRGB(20, 24, 34)
    LockButton.BorderSizePixel = 0
    LockButton.Text = "🔓"
    LockButton.TextSize = 16
    LockButton.ZIndex = 1000001
    Instance.new("UICorner", LockButton).CornerRadius = UDim.new(1, 0)
    local LockStroke = Instance.new("UIStroke", LockButton)
    LockStroke.Color = Color3.fromRGB(255, 255, 255)
    LockStroke.Thickness = 2

    EnableWidgetDragging(WidgetContainer)

    LockButton.MouseButton1Click:Connect(function()
        SystemState.IsLocked = not SystemState.IsLocked
        LockButton.Text = SystemState.IsLocked and "🔒" or "🔓"
        LockButton.BackgroundColor3 = SystemState.IsLocked and Color3.fromRGB(180, 40, 40) or Color3.fromRGB(20, 24, 34)
    end)

    local function SetMenuVisible(visible)
        SystemState.MenuOpen = visible
        local tweenInfo = TweenInfo.new(0.25, Enum.EasingStyle.Cubic, Enum.EasingDirection.Out)
        if visible then
            DashboardRoot.Visible = true
            TweenService:Create(DashboardRoot, tweenInfo, { BackgroundTransparency = 0 }):Play()
            CommandBar:CaptureFocus()
        else
            local fadeOut = TweenService:Create(DashboardRoot, tweenInfo, { BackgroundTransparency = 1 })
            fadeOut.Completed:Connect(function()
                if not SystemState.MenuOpen then DashboardRoot.Visible = false end
            end)
            fadeOut:Play()
        end
    end

    ToggleCircle.MouseButton1Click:Connect(function()
        SetMenuVisible(not SystemState.MenuOpen)
    end)

    return {
        ScreenGui = ScreenGui,
        DashboardRoot = DashboardRoot,
        AtmosphericBG = AtmosphericBG,
        CommandBar = CommandBar,
        CarouselContainer = CarouselContainer,
        FocusedTitle = FocusedTitle,
        FocusedSub = FocusedSub,
        MetaAge = MetaAge,
        MetaLocation = MetaLocation,
        MetaReason = MetaReason,
        MetaShame = MetaShame,
        MetaDevice = MetaDevice,
        MetaSessionStats = MetaSessionStats,
        SetMenuVisible = SetMenuVisible
    }
end

local UI = BuildUI()
local CardInstances = {}

local function RenderCarousel()
    if #SystemState.TargetList == 0 then return end
    local baseW, baseH = 100, 125
    local spacing = 120
    local startX = 20
    local t = EaseOutCubic(math.clamp(SystemState.TransitionProgress, 0, 1))
    local focus = SystemState.CurrentIndex + (SystemState.TargetIndex - SystemState.CurrentIndex) * t

    for i, targetPlayer in ipairs(SystemState.TargetList) do
        local Card = CardInstances[targetPlayer.UserId]
        if Card then
            local rel = (i - 1) - (focus - 1)
            local d = math.abs(rel)
            local scale = (d < 0.001) and 1.1 or math.max(0.8, 1.0 - 0.12 * math.min(d, 2.5))
            local w, h = baseW * scale, baseH * scale
            local x = startX + (i - 1) * spacing - (focus - 1) * spacing
            local y = (baseH - h) / 2
            local selected_amount = math.max(0, 1 - d)

            Card.Size = UDim2.new(0, w, 0, h)
            Card.Position = UDim2.new(0, x, 0, y)
            Card.ZIndex = math.floor(10 - d)

            local FrameBox = Card:FindFirstChild("FrameBox")
            local Stroke = FrameBox and FrameBox:FindFirstChildOfClass("UIStroke")

            if Stroke then
                if selected_amount > 0 then
                    Stroke.Color = Color3.fromRGB(255, 255, 255)
                    Stroke.Thickness = 2.5
                    Stroke.Transparency = 0
                    pcall(function()
                        UI.AtmosphericBG.Image = Players:GetUserThumbnailAsync(targetPlayer.UserId, Enum.ThumbnailType.AvatarBust, Enum.ThumbnailSize.Size420x420)
                    end)
                    UI.FocusedTitle.Text = targetPlayer.DisplayName
                    UI.FocusedSub.Text = "@" .. targetPlayer.Name

                    local targetData = SystemState.Targets[targetPlayer]
                    if targetData then
                        UI.MetaAge.Text = "🎂 Age: " .. GetSafeAccountAge(targetPlayer)
                        UI.MetaLocation.Text = "🌐 Location: " .. (targetData.Location or "Fetching...")
                        UI.MetaReason.Text = "🎯 Reason: " .. (targetData.Reason or "Manual Focus")
                        UI.MetaShame.Text = "🔥 Roasts: " .. tostring(targetData.RoastCount or 0)
                        UI.MetaDevice.Text = "📱 Device: " .. DetectDevice(targetPlayer)
                    end
                else
                    Stroke.Color = Color3.fromRGB(100, 110, 130)
                    Stroke.Thickness = 1.0
                    Stroke.Transparency = 0.6
                end
            end
        end
    end
end

local function UpdateCarousel()
    SystemState.TargetList = {}
    for targetPlayer, _ in pairs(SystemState.Targets) do
        table.insert(SystemState.TargetList, targetPlayer)
    end

    for userId, card in pairs(CardInstances) do
        card:Destroy()
        CardInstances[userId] = nil
    end

    for i, targetPlayer in ipairs(SystemState.TargetList) do
        local Card = Instance.new("TextButton")
        Card.Name = "Card_" .. targetPlayer.UserId
        Card.BackgroundColor3 = Color3.fromRGB(0, 0, 0)
        Card.BackgroundTransparency = 1
        Card.Text = ""
        Card.AutoButtonColor = false
        Card.Parent = UI.CarouselContainer

        local FrameBox = Instance.new("Frame", Card)
        FrameBox.Name = "FrameBox"
        FrameBox.Size = UDim2.new(1, 0, 1, 0)
        FrameBox.BackgroundColor3 = Color3.fromRGB(20, 24, 34)
        FrameBox.ClipsDescendants = true
        Instance.new("UICorner", FrameBox).CornerRadius = UDim.new(0, 10)

        local CardStroke = Instance.new("UIStroke", FrameBox)
        CardStroke.Color = Color3.fromRGB(255, 255, 255)
        CardStroke.Thickness = 1.5

        local CoverArt = Instance.new("ImageLabel", FrameBox)
        CoverArt.Size = UDim2.new(1, 0, 1, 0)
        CoverArt.BackgroundTransparency = 1
        CoverArt.ScaleType = Enum.ScaleType.Crop
        pcall(function()
            CoverArt.Image = Players:GetUserThumbnailAsync(targetPlayer.UserId, Enum.ThumbnailType.AvatarBust, Enum.ThumbnailSize.Size420x420)
        end)

        local DisplayLabel = Instance.new("TextLabel", FrameBox)
        DisplayLabel.Size = UDim2.new(1, -8, 0, 14)
        DisplayLabel.Position = UDim2.new(0, 4, 1, -18)
        DisplayLabel.BackgroundTransparency = 1
        DisplayLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
        DisplayLabel.TextSize = 10
        DisplayLabel.Font = Enum.Font.GothamBold
        DisplayLabel.TextTruncate = Enum.TextTruncate.AtEnd
        DisplayLabel.TextXAlignment = Enum.TextXAlignment.Left
        DisplayLabel.Text = targetPlayer.DisplayName

        Card.MouseButton1Click:Connect(function()
            if not SystemState.IsLocked and SystemState.TargetIndex ~= i then
                SystemState.CurrentIndex = SystemState.TargetIndex
                SystemState.TargetIndex = i
                SystemState.TransitionProgress = 0
            end
        end)

        CardInstances[targetPlayer.UserId] = Card
    end

    if #SystemState.TargetList == 0 then
        UI.FocusedTitle.Text = "No Active Targets"
        UI.FocusedSub.Text = "Swipe cards or type ;roast <name>"
        UI.MetaAge.Text = "🎂 Age: --"
        UI.MetaLocation.Text = "🌐 Location: --"
        UI.MetaReason.Text = "🎯 Reason: --"
        UI.MetaShame.Text = "🔥 Roasts: 0"
        UI.MetaDevice.Text = "📱 Device: --"
    end

    RenderCarousel()
end

RunService.RenderStepped:Connect(function(dt)
    if SystemState.TransitionProgress < 1 then
        SystemState.TransitionProgress = math.min(1, SystemState.TransitionProgress + (dt / 0.25))
    end
    if SystemState.MenuOpen then RenderCarousel() end
end)

UI.CommandBar.FocusLost:Connect(function(enterPressed)
    if enterPressed then
        local text = UI.CommandBar.Text
        UI.CommandBar.Text = ""
        local parts = {}
        for w in text:gmatch("%S+") do table.insert(parts, w) end
        if #parts > 0 then
            local cmd = parts[1]:lower()
            if (cmd == ";roast" or cmd == "roast") and parts[2] then
                local target = FindPlayerByPartialName(parts[2])
                if target and not SystemState.Whitelisted[target] then
                    local loc = FetchPlayerLocation(target)
                    SystemState.Targets[target] = { Player = target, LastRoast = 0, RoastCount = 0, Reason = "Manual Target", Location = loc }
                    UpdateCarousel()
                end
            elseif (cmd == ";wl" or cmd == "wl" or cmd == ";friend" or cmd == "friend") and parts[2] then
                local target = FindPlayerByPartialName(parts[2])
                if target then
                    SystemState.Whitelisted[target] = true
                    SystemState.Targets[target] = nil
                    UpdateCarousel()
                    SendChatMessage("Whitelisted " .. (target.DisplayName or target.Name) .. " 🛡️ (Safe from targeting)")
                end
            elseif (cmd == ";unwl" or cmd == "unwl" or cmd == ";unfriend" or cmd == "unfriend") and parts[2] then
                local target = FindPlayerByPartialName(parts[2])
                if target then
                    SystemState.Whitelisted[target] = nil
                    SendChatMessage("Removed whitelist for " .. (target.DisplayName or target.Name) .. " 👀")
                end
            elseif (cmd == ";ignore" or cmd == "ignore") and parts[2] then
                local target = FindPlayerByPartialName(parts[2])
                if target then
                    SystemState.Whitelisted[target] = true
                    SystemState.Targets[target] = nil
                    UpdateCarousel()
                    SendChatMessage("Ignored " .. (target.DisplayName or target.Name) .. " 🛡️")
                end
            elseif (cmd == ";unignore" or cmd == "unignore") and parts[2] then
                local target = FindPlayerByPartialName(parts[2])
                if target then
                    SystemState.Whitelisted[target] = nil
                    SendChatMessage("Unignored " .. (target.DisplayName or target.Name) .. " 👀")
                end
            elseif cmd == ";stop" or cmd == "stop" then
                if parts[2] then
                    local target = FindPlayerByPartialName(parts[2])
                    if target then SystemState.Targets[target] = nil end
                else
                    SystemState.Targets = {}
                end
                UpdateCarousel()
            end
        end
    end
end)

local function MonitorAutoTargeting(sender, message)
    if sender == LocalPlayer or SystemState.Whitelisted[sender] then return end
    local msgLower = message:lower()
    local myName = LocalPlayer.Name:lower()
    local myDisplay = LocalPlayer.DisplayName:lower()
    local mentionsMe = msgLower:find(myName) or msgLower:find(myDisplay) or msgLower:find("you")

    if SystemState.Targets[sender] then
        if IsTrueApology(message) then
            SystemState.Targets[sender] = nil
            UpdateCarousel()
            local template = CustomApologies[math.random(1, #CustomApologies)]
            local finalApology = template:gsub("%(user%)", sender.DisplayName or sender.Name)
            SendChatMessage(finalApology)
            return
        end
    end

    if mentionsMe then
        for _, nice in ipairs(NiceKeywords) do
            if msgLower:find(nice) then return end
        end
        for _, aggro in ipairs(AggroKeywords) do
            if msgLower:find(aggro) then
                if not SystemState.Targets[sender] then
                    local loc = FetchPlayerLocation(sender)
                    SystemState.Targets[sender] = { Player = sender, LastRoast = 0, RoastCount = 0, Reason = "Trigger: '" .. aggro .. "'", Location = loc }
                    UpdateCarousel()
                end
                return
            end
        end
    end
end

local function AttachChatListener(player)
    player.Chatted:Connect(function(msg)
        MonitorAutoTargeting(player, msg)
        local targetData = SystemState.Targets[player]
        if targetData and not SystemState.Whitelisted[player] then
            local now = os.time()
            if (now - (targetData.LastRoast or 0)) >= 3 then
                targetData.LastRoast = now
                targetData.RoastCount = (targetData.RoastCount or 0) + 1
                SystemState.TotalSessionRoasts = SystemState.TotalSessionRoasts + 1
                UI.MetaSessionStats.Text = string.format("⚡ Session Stats: %d Total Combacks Fired", SystemState.TotalSessionRoasts)

                task.delay(2, function()
                    local response = GenerateDynamicComboResponse(player, msg)
                    SendChatMessage(response)
                    if SystemState.TargetList[SystemState.TargetIndex] == player then
                        UI.MetaShame.Text = "🔥 Roasts: " .. tostring(targetData.RoastCount)
                    end
                end)
            end
        end
    end)
end

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

Players.PlayerAdded:Connect(AttachChatListener)
Players.PlayerRemoving:Connect(function(p)
    SystemState.Targets[p] = nil
    SystemState.Whitelisted[p] = nil
    UpdateCarousel()
end)

Features & Information

An AI bot that roasts and jokes for you automatically also preventing you from chat ban or any other bans!

Community Comments (1)

disarondadisarondaAug 15, 2026

does the AI chats get flagged?

More Scripts for Universal Scripts