Sign In to Your Account

Manual registration is temporarily disabled. Please use Discord, Google or GitHub to create an account.

CONTINUE WITH
MAFIA | ROLE REVEAL | ESP | TAROT CARDS - Mafia Script | Free Roblox Script
Mafia Mafia

MAFIA | ROLE REVEAL | ESP | TAROT CARDS

Mafia 53 views 1 month ago
MAFIA | ROLE REVEAL | ESP | TAROT CARDS - Roblox Script
Mobile Mobile Friendly

Description

Credits: R77

Optimized & minimalistic UI → See every player’s role in a sleek.Reveal Button → Click next to a player to announce their role in chat.Example: “🔮 Random Tarot Cards have revealed R-77’s role: BEST DEVELOPER”Reveal Random / All Players → Quick buttons to reveal a random player or all roles at once.ESP Highlights → Player characters glow in the color of their role.

Mafia
Explore more scripts
View all Mafia scripts

357 Lines 12,005 Bytes
-- =================================
-- DEV -- > R-77 ; DISCORD - tankuct.
-- =================================

local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local TextChatService = game:GetService("TextChatService")
local TweenService = game:GetService("TweenService")

local isMobile = UserInputService.TouchEnabled and not UserInputService.KeyboardEnabled

local roleColors = {
    ["Mafia"] = Color3.fromRGB(255, 70, 70),
    ["Detective"] = Color3.fromRGB(70, 120, 255),
    ["Doctor"] = Color3.fromRGB(80, 255, 120),
    ["Citizen"] = Color3.fromRGB(200, 200, 200),
    ["Sheriff"] = Color3.fromRGB(255, 180, 60),
    ["Jester"] = Color3.fromRGB(255, 100, 255),
    ["Mayor"] = Color3.fromRGB(255, 220, 90),
}

local defaultColor = Color3.fromRGB(150,150,150)
local espHighlights = {}
local isMinimized = false

local GUI = Instance.new("ScreenGui", game.CoreGui)
GUI.Name = "MafiaMoonUI"
GUI.ResetOnSpawn = false

-- Адаптивные размеры
local mainWidth = isMobile and 280 or 330
local mainHeight = isMobile and 420 or 480

local Main = Instance.new("Frame", GUI)
Main.Size = UDim2.new(0, mainWidth, 0, mainHeight)
Main.Position = isMobile and UDim2.new(0.5, -mainWidth/2, 0, 20) or UDim2.new(0, 30, 0, 40)
Main.BackgroundColor3 = Color3.fromRGB(18,18,18)
Main.BorderSizePixel = 0
Instance.new("UICorner", Main).CornerRadius = UDim.new(0, 12)

local shadow = Instance.new("ImageLabel", Main)
shadow.Image = "rbxassetid://1316045217"
shadow.Size = UDim2.new(1, 40, 1, 40)
shadow.Position = UDim2.new(0, -20, 0, -20)
shadow.BackgroundTransparency = 1
shadow.ImageColor3 = Color3.fromRGB(0,0,0)
shadow.ImageTransparency = 0.55
shadow.ZIndex = -1

local Topbar = Instance.new("Frame", Main)
Topbar.Size = UDim2.new(1, 0, 0, 40)
Topbar.BackgroundColor3 = Color3.fromRGB(25,25,25)
Instance.new("UICorner", Topbar).CornerRadius = UDim.new(0, 12)

local Title = Instance.new("TextLabel", Topbar)
Title.Text = "🎭 Player Roles"
Title.Size = isMobile and UDim2.new(1, -80, 1, 0) or UDim2.new(1, -160, 1, 0)
Title.Position = UDim2.new(0, 10, 0, 0)
Title.BackgroundTransparency = 1
Title.TextColor3 = Color3.fromRGB(255,255,255)
Title.Font = Enum.Font.GothamBold
Title.TextSize = isMobile and 15 or 18
Title.TextXAlignment = Enum.TextXAlignment.Left

-- Кнопка минимизации
local MinimizeBtn = Instance.new("TextButton", Topbar)
MinimizeBtn.AnchorPoint = Vector2.new(1, 0.5)
MinimizeBtn.Position = UDim2.new(1, -10, 0.5, 0)
MinimizeBtn.Size = UDim2.new(0, 30, 0, 30)
MinimizeBtn.BackgroundColor3 = Color3.fromRGB(35,35,35)
MinimizeBtn.Text = "−"
MinimizeBtn.TextColor3 = Color3.fromRGB(255,255,255)
MinimizeBtn.Font = Enum.Font.GothamBold
MinimizeBtn.TextSize = 20
Instance.new("UICorner", MinimizeBtn).CornerRadius = UDim.new(0, 6)

local Credit = Instance.new("TextLabel", Topbar)
Credit.AnchorPoint = Vector2.new(1, 0.5)
Credit.Position = UDim2.new(1, -45, 0.5, 0)
Credit.Size = UDim2.new(0, 100, 1, 0)
Credit.BackgroundTransparency = 1
Credit.Text = isMobile and "R-77" or "Made with ❤️ by R-77"
Credit.Font = Enum.Font.Gotham
Credit.TextSize = isMobile and 10 or 11
Credit.TextColor3 = Color3.fromRGB(160,160,160)
Credit.TextXAlignment = Enum.TextXAlignment.Right
Credit.Visible = not isMobile or false

local line = Instance.new("Frame", Main)
line.Size = UDim2.new(1, -20, 0, 1)
line.Position = UDim2.new(0, 10, 0, 45)
line.BackgroundColor3 = Color3.fromRGB(60,60,60)

local Content = Instance.new("Frame", Main)
Content.Name = "Content"
Content.Size = UDim2.new(1, 0, 1, -40)
Content.Position = UDim2.new(0, 0, 0, 40)
Content.BackgroundTransparency = 1
Content.ClipsDescendants = true

local Buttons = Instance.new("Frame", Content)
Buttons.Size = UDim2.new(1, -20, 0, isMobile and 75 or 80)
Buttons.Position = UDim2.new(0, 10, 0, 15)
Buttons.BackgroundTransparency = 1

local function createButton(text)
    local btn = Instance.new("TextButton")
    btn.Size = UDim2.new(1, 0, 0, isMobile and 32 or 35)
    btn.BackgroundColor3 = Color3.fromRGB(30,30,30)
    btn.TextColor3 = Color3.fromRGB(255,255,255)
    btn.Text = text
    btn.Font = Enum.Font.GothamBold
    btn.TextSize = isMobile and 12 or 14
    Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 6)
    return btn
end

local RandomBtn = createButton("🔮 Reveal Random")
RandomBtn.Parent = Buttons

local AllBtn = createButton("🌙 Reveal All")
AllBtn.Position = UDim2.new(0, 0, 0, isMobile and 38 or 40)
AllBtn.Parent = Buttons

-- Player List
local List = Instance.new("ScrollingFrame", Content)
List.Size = UDim2.new(1, -20, 1, isMobile and -105 or -110)
List.Position = UDim2.new(0, 10, 0, isMobile and 95 or 100)
List.BackgroundTransparency = 1
List.CanvasSize = UDim2.new(0, 0, 0, 0)
List.ScrollBarThickness = isMobile and 3 or 4
List.ScrollBarImageColor3 = Color3.fromRGB(120,120,120)

local Layout = Instance.new("UIListLayout", List)
Layout.Padding = UDim.new(0, isMobile and 4 or 5)
Layout.SortOrder = Enum.SortOrder.LayoutOrder

--=============== MINIMIZE ===============--

local function toggleMinimize()
    isMinimized = not isMinimized
    
    local targetSize = isMinimized and UDim2.new(0, mainWidth, 0, 40) or UDim2.new(0, mainWidth, 0, mainHeight)
    local tweenInfo = TweenInfo.new(0.3, Enum.EasingStyle.Quad, Enum.EasingDirection.Out)
    local tween = TweenService:Create(Main, tweenInfo, {Size = targetSize})
    
    MinimizeBtn.Text = isMinimized and "+" or "−"
    tween:Play()
end

MinimizeBtn.MouseButton1Click:Connect(toggleMinimize)

--=============== DRAG ===============--

local dragging, dragStart, startPos

local function onDragStart(input)
    dragging = true
    dragStart = input.Position
    startPos = Main.Position
end

local function onDragMove(input)
    if dragging then
        local delta = input.Position - dragStart
        Main.Position = UDim2.new(
            startPos.X.Scale, startPos.X.Offset + delta.X,
            startPos.Y.Scale, startPos.Y.Offset + delta.Y
        )
    end
end

local function onDragEnd()
    dragging = false
end

-- Поддержка мыши и тач
Topbar.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        onDragStart(input)
    end
end)

UserInputService.InputChanged:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
        onDragMove(input)
    end
end)

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

--=============== ESP ===============--

local function updateESP(player)
    if not player.Character then return end
    local role = player:GetAttribute("Role")

    if not role then
        if espHighlights[player] then espHighlights[player]:Destroy() espHighlights[player]=nil end
        return
    end

    local color = roleColors[role] or defaultColor

    if not espHighlights[player] then
        local h = Instance.new("Highlight")
        h.FillTransparency = 0.75
        h.OutlineTransparency = 0
        h.FillColor = color
        h.OutlineColor = color
        h.Adornee = player.Character
        h.Parent = player.Character
        espHighlights[player] = h
    else
        local h = espHighlights[player]
        h.FillColor = color
        h.OutlineColor = color
        h.Adornee = player.Character
    end
end

local function removeESP(player)
    if espHighlights[player] then
        espHighlights[player]:Destroy()
        espHighlights[player] = nil
    end
end

--=============== CHAT SEND ===============--

local function sendChat(message)
    local ch = TextChatService.TextChannels.RBXGeneral
    if ch then
        ch:SendAsync(message)
    end
end

--=============== UPDATE LIST ===============--

local function updateRoles()
    for _, obj in ipairs(List:GetChildren()) do
        if obj:IsA("Frame") then obj:Destroy() end
    end

    local count = 0

    for _, plr in ipairs(Players:GetPlayers()) do
        local role = plr:GetAttribute("Role")
        if role then
            count += 1

            local item = Instance.new("Frame", List)
            item.Size = UDim2.new(1, 0, 0, isMobile and 36 or 32)
            item.BackgroundColor3 = Color3.fromRGB(28,28,28)
            Instance.new("UICorner", item).CornerRadius = UDim.new(0, 8)

            local lbl = Instance.new("TextLabel", item)
            lbl.Size = UDim2.new(1, isMobile and -75 or -90, 1, 0)
            lbl.Position = UDim2.new(0, 6, 0, 0)
            lbl.BackgroundTransparency = 1
            lbl.Font = Enum.Font.Gotham
            lbl.TextXAlignment = Enum.TextXAlignment.Left
            lbl.TextColor3 = Color3.fromRGB(230,230,230)
            lbl.TextSize = isMobile and 12 or 14
            lbl.TextTruncate = Enum.TextTruncate.AtEnd
            lbl.Text = plr.DisplayName .. " - " .. role

            -- Кнопка Reveal
            local revealBtn = Instance.new("TextButton", item)
            revealBtn.Size = isMobile and UDim2.new(0, 65, 1, -6) or UDim2.new(0, 80, 1, -6)
            revealBtn.Position = isMobile and UDim2.new(1, -68, 0, 3) or UDim2.new(1, -83, 0, 3)
            revealBtn.AnchorPoint = Vector2.new(0, 0)
            revealBtn.BackgroundColor3 = Color3.fromRGB(40,40,40)
            revealBtn.TextColor3 = Color3.fromRGB(255,255,255)
            revealBtn.Font = Enum.Font.GothamBold
            revealBtn.TextSize = isMobile and 10 or 12
            revealBtn.Text = isMobile and "🔮" or "🔮 Reveal"
            Instance.new("UICorner", revealBtn).CornerRadius = UDim.new(0, 6)

            revealBtn.MouseButton1Click:Connect(function()
                local role = plr:GetAttribute("Role") or "Unknown"
                sendChat("Random Tarot Cards have revealed " .. plr.DisplayName .. "'s role: " .. role)
            end)

            updateESP(plr)
        end
    end

    List.CanvasSize = UDim2.new(0,0,0, Layout.AbsoluteContentSize.Y + 10)
    Title.Text = "🎭 Roles (" .. count .. ")"
end

--=============== TAROT BUTTONS ==================--

RandomBtn.MouseButton1Click:Connect(function()
    local players = Players:GetPlayers()
    if #players == 0 then return end

    local target = players[math.random(1, #players)]
    local role = target:GetAttribute("Role") or "Unknown"

    sendChat("Random Tarot Cards have revealed " .. target.DisplayName .. "'s role: " .. role)
end)

AllBtn.MouseButton1Click:Connect(function()
    sendChat("=========== Tarot Cards Reveal ===========")

    for _, PLAYER in pairs(Players:GetPlayers()) do
        local role = PLAYER:GetAttribute("Role")
        if role then
            sendChat(PLAYER.DisplayName .. "'s Role: " .. role)
            task.wait(0.4)
        end
    end

    sendChat("=========================================")
end)

--=============== EVENTS ===============--

Players.PlayerAdded:Connect(function(plr)
    plr.CharacterAdded:Connect(function()
        updateESP(plr)
    end)
    updateRoles()
end)

Players.PlayerRemoving:Connect(function(plr)
    removeESP(plr)
    updateRoles()
end)

task.spawn(function()
    while true do
        task.wait(1)
        updateRoles()
    end
end)

task.spawn(function()
    while true do
        task.wait(0.5)
        for _, plr in ipairs(Players:GetPlayers()) do
            updateESP(plr)
        end
    end
end)

updateRoles()

-- =================================
-- DEV -- > R-77 ; DISCORD - tankuct.
-- =================================

Comments

Comments section coming soon...

Frequently Asked Questions

To use this script, you need a Roblox Executor. Simply copy the script from this page, paste it into your executor, and run it while you are in the Mafia game.

Yes, this script is completely free to use.

No, this script does not require a key.

Yes, this script is designed to be compatible with mobile executors.

Similar Scripts

Share Script

Share this script with others by copying the link or using your device's share options.

https://rbxscripts.net/scripts/mafia-role-reveal-esp-tarot-cards/
or

Report Script

Help us maintain a safe community. Your report will be reviewed by our moderation team and appropriate action will be taken if needed.

Select a reason...
Malicious Code
Inappropriate Content
Copyright Infringement
Spam
Misleading Information
Other