Macro chat v2 1
Key RequiredUniversal

Macro chat v2 1

Universal ScriptImnotexploi4Imnotexploi4 2.7K views 252 executesUpdated Sep 6, 2025
5.0/ 5(2 votes)
20100% Positive
Lua Script•442 lines (17236 chars)
--[[
    I copied of this script
https://scriptblox.com/script/Universal-Script-Macro-chat-v2-40200
pls dont be mad at me
--]]

-----------------------------------------------------------
-- Debug Utilities
-----------------------------------------------------------

local DEBUG = true
local function debugPrint(msg)
    if DEBUG then
        print("[MACRO CHAT DEBUG] " .. msg)
    end
end

-----------------------------------------------------------
-- Services & Variables
-----------------------------------------------------------

local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local StarterGui = game:GetService("StarterGui")
local TweenService = game:GetService("TweenService")
local UserInputService = game:GetService("UserInputService")

local TextChatService
pcall(function() TextChatService = game:GetService("TextChatService") end)

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

local externalUniqueMessages = {}

local isSupport = isfolder and isfile and writefile and readfile
local WorkspacePaths = {
    MACROCHATV2 = "Macro-ChatV2",
    CONFIG_FILE = "Macro-ChatV2/config.txt",
}

if isSupport then
    if not isfolder(WorkspacePaths.MACROCHATV2) then
        makefolder(WorkspacePaths.MACROCHATV2)
    end
end

-----------------------------------------------------------
-- Chat Sender Function
-----------------------------------------------------------

local function sendChatMessage(message)
    local chatEvents = ReplicatedStorage:FindFirstChild("DefaultChatSystemChatEvents")
    if chatEvents then
        local remoteEvent = chatEvents:FindFirstChild("SayMessageRequest")
        if remoteEvent then
            remoteEvent:FireServer(message, "All")
            debugPrint("Sent via remote event: " .. message)
            return
        end
    end

    if TextChatService then
        local channel = TextChatService.TextChannels and TextChatService.TextChannels:FindFirstChild("RBXGeneral")
        if channel and channel.SendAsync then
            local suc, err = pcall(function() channel:SendAsync(message) end)
            if suc then
                debugPrint("Sent via TextChatService: " .. message)
                return
            else
                debugPrint("TextChatService error: " .. tostring(err))
            end
        else
            debugPrint("RBXGeneral channel not found.")
        end
    end

    debugPrint("Falling back to SetCore for chat.")
    local suc, err = pcall(function()
        StarterGui:SetCore("ChatMakeSystemMessage", {
            Text = message,
            Color = Color3.new(1, 1, 1),
            Font = Enum.Font.SourceSansBold,
            TextSize = 18,
        })
    end)

    if suc then
        debugPrint("Sent via SetCore: " .. message)
    else
        debugPrint("SetCore error: " .. tostring(err))
    end
end

-----------------------------------------------------------
-- Helper: Make a UI Draggable
-----------------------------------------------------------

local function makeDraggable(frame)
    local dragging = false
    local dragStart, startPos

    frame.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
            dragging = true
            dragStart = input.Position
            startPos = frame.Position
            input.Changed:Connect(function()
                if input.UserInputState == Enum.UserInputState.End then
                    dragging = false
                end
            end)
        end
    end)

    frame.InputChanged:Connect(function(input)
        if dragging and (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

-----------------------------------------------------------
-- Main UI Setup
-----------------------------------------------------------

local screenGui = Instance.new("ScreenGui")
screenGui.Name = "MacroChatScreen"
screenGui.Parent = playerGui

local mainFrame = Instance.new("Frame")
mainFrame.Name = "MainFrame"
mainFrame.Size = UDim2.new(0, 200, 0, 200)
mainFrame.Position = UDim2.new(0.5, -100, 0.5, -100)
mainFrame.BackgroundColor3 = Color3.fromRGB(50, 50, 50)
mainFrame.BorderSizePixel = 0
mainFrame.Parent = screenGui

local mainCorner = Instance.new("UICorner")
mainCorner.CornerRadius = UDim.new(0, 20)
mainCorner.Parent = mainFrame

makeDraggable(mainFrame)

local blueButton = Instance.new("TextButton")
blueButton.Name = "BlueButton"
blueButton.Size = UDim2.new(0, 120, 0, 40)
blueButton.Position = UDim2.new(0.5, -60, 0.5, -20)
blueButton.BackgroundColor3 = Color3.fromRGB(0, 120, 255)
blueButton.Text = "Open Macro Chat 2"
blueButton.TextColor3 = Color3.new(1, 1, 1)
blueButton.Font = Enum.Font.SourceSansBold
blueButton.TextScaled = true
blueButton.Parent = mainFrame

local blueButtonCorner = Instance.new("UICorner")
blueButtonCorner.CornerRadius = UDim.new(0.45, 0)
blueButtonCorner.Parent = blueButton

local minimizeButton = Instance.new("TextButton")
minimizeButton.Name = "MinimizeButton"
minimizeButton.Size = UDim2.new(0, 25, 0, 25)
minimizeButton.Position = UDim2.new(0, 5, 0, 5)
minimizeButton.BackgroundColor3 = Color3.fromRGB(100, 100, 100)
minimizeButton.Text = "–"
minimizeButton.TextScaled = true
minimizeButton.Font = Enum.Font.SourceSansBold
minimizeButton.TextColor3 = Color3.new(1, 1, 1)
minimizeButton.Parent = mainFrame

local minCorner = Instance.new("UICorner")
minCorner.CornerRadius = UDim.new(1, 0)
minCorner.Parent = minimizeButton

local closeButton = Instance.new("TextButton")
closeButton.Name = "CloseButton"
closeButton.Size = UDim2.new(0, 25, 0, 25)
closeButton.Position = UDim2.new(0, 35, 0, 5)
closeButton.BackgroundColor3 = Color3.fromRGB(200, 50, 50)
closeButton.Text = "X"
closeButton.TextScaled = true
closeButton.Font = Enum.Font.SourceSansBold
closeButton.TextColor3 = Color3.new(1, 1, 1)
closeButton.Parent = mainFrame

local closeCorner = Instance.new("UICorner")
closeCorner.CornerRadius = UDim.new(1, 0)
closeCorner.Parent = closeButton

closeButton.MouseButton1Click:Connect(function()
    screenGui:Destroy()
    debugPrint("Main UI closed.")
end)

local isMinimized = false
local originalSize = mainFrame.Size

minimizeButton.MouseButton1Click:Connect(function()
    if not isMinimized then
        TweenService:Create(mainFrame, TweenInfo.new(0.2), {Size = UDim2.new(0, 200, 0, 40)}):Play()
        blueButton.Visible = false
        isMinimized = true
    else
        TweenService:Create(mainFrame, TweenInfo.new(0.2), {Size = originalSize}):Play()
        blueButton.Visible = true
        isMinimized = false
    end
end)

-----------------------------------------------------------
-- External UI Variables
-----------------------------------------------------------

local externalUI = nil
local blueAnimRunning = false

-----------------------------------------------------------
-- Blue Button: Toggle External UI
-----------------------------------------------------------

blueButton.MouseButton1Click:Connect(function()
    if isMinimized or blueAnimRunning then return end
    blueAnimRunning = true

    local origPos = blueButton.Position
    local upTween = TweenService:Create(blueButton, TweenInfo.new(0.1), {Position = origPos - UDim2.new(0, 0, 0, 10)})
    local downTween = TweenService:Create(blueButton, TweenInfo.new(0.1), {Position = origPos})

    upTween:Play()
    upTween.Completed:Connect(function(status)
        if status == Enum.PlaybackState.Completed then
            downTween:Play()
        end
    end)

    downTween.Completed:Connect(function(status)
        if status == Enum.PlaybackState.Completed then
            if not externalUI then
                debugPrint("Creating external UI.")
                externalUI = Instance.new("Frame")
                externalUI.Name = "ExternalChatUI"
                externalUI.Size = UDim2.new(0, 350, 0, 250)
                externalUI.Position = UDim2.new(0.5, -175, 0.5, -125)
                externalUI.BackgroundColor3 = Color3.new(1, 1, 1)
                externalUI.BorderSizePixel = 0
                externalUI.Parent = screenGui

                local extCorner = Instance.new("UICorner")
                extCorner.CornerRadius = UDim.new(0, 20)
                extCorner.Parent = externalUI

                makeDraggable(externalUI)

                local header = Instance.new("TextLabel")
                header.Size = UDim2.new(1, -20, 0, 30)
                header.Position = UDim2.new(0, 10, 0, 10)
                header.BackgroundTransparency = 1
                header.Text = "Put your message here"
                header.Font = Enum.Font.SourceSansBold
                header.TextScaled = true
                header.TextColor3 = Color3.new(0, 0, 0)
                header.Parent = externalUI

                local inputBox = Instance.new("TextBox")
                inputBox.Name = "InputBox"
                inputBox.Size = UDim2.new(1, -20, 0, 40)
                inputBox.Position = UDim2.new(0, 10, 0, 50)
                inputBox.BackgroundColor3 = Color3.fromRGB(240, 240, 240)
                inputBox.PlaceholderText = "Type your message here..."
                inputBox.Text = ""
                inputBox.TextScaled = true
                inputBox.TextColor3 = Color3.new(0, 0, 0)
                inputBox.Parent = externalUI

                local inputCorner = Instance.new("UICorner")
                inputCorner.CornerRadius = UDim.new(0.45, 0)
                inputCorner.Parent = inputBox

                local scrollFrame = Instance.new("ScrollingFrame")
                scrollFrame.Name = "MessageScroll"
                scrollFrame.Size = UDim2.new(1, -20, 0, 100)
                scrollFrame.Position = UDim2.new(0, 10, 0, 100)
                scrollFrame.BackgroundTransparency = 1
                scrollFrame.CanvasSize = UDim2.new(0, 0, 0, 0)
                scrollFrame.Parent = externalUI

                local uiList = Instance.new("UIListLayout")
                uiList.SortOrder = Enum.SortOrder.LayoutOrder
                uiList.Parent = scrollFrame

                inputBox.FocusLost:Connect(function(enterPressed)
                    if enterPressed then
                        local text = inputBox.Text
                        if text and text ~= "" and not externalUniqueMessages[text] then
                            externalUniqueMessages[text] = true
                            sendChatMessage(text)

                            local msgButton = Instance.new("TextButton")
                            msgButton.Size = UDim2.new(1, -10, 0, 30)
                            msgButton.BackgroundColor3 = Color3.fromRGB(220, 220, 220)
                            msgButton.Text = text
                            msgButton.TextColor3 = Color3.new(0, 0, 0)
                            msgButton.Font = Enum.Font.SourceSans
                            msgButton.TextScaled = true
                            msgButton.AutoButtonColor = true
                            msgButton.Parent = scrollFrame

                            local msgCorner = Instance.new("UICorner")
                            msgCorner.CornerRadius = UDim.new(0.45, 0)
                            msgCorner.Parent = msgButton

                            msgButton.MouseButton1Click:Connect(function()
                                sendChatMessage(text)
                            end)

                            scrollFrame.CanvasSize = UDim2.new(0, 0, 0, uiList.AbsoluteContentSize.Y)
                        end
                        inputBox.Text = ""
                    end
                end)
                
                local function createExpandableButton(name, position, text, onClick)
                    local button = Instance.new("TextButton")
                    button.Name = name
                    button.Size = UDim2.new(0, 60, 0, 30)
                    button.Position = position
                    button.BackgroundColor3 = Color3.fromRGB(150, 150, 150)
                    button.Text = text
                    button.TextColor3 = Color3.new(0, 0, 0)
                    button.Font = Enum.Font.SourceSansBold
                    button.TextScaled = true
                    button.Parent = externalUI

                    local corner = Instance.new("UICorner")
                    corner.CornerRadius = UDim.new(0.4, 0)
                    corner.Parent = button

                    
                    local isHolding = false
                    local holdTween = nil
                    local releaseTween = nil

                    button.MouseButton1Down:Connect(function()
                        isHolding = true
                        holdTween = TweenService:Create(button, TweenInfo.new(0.2), {Size = UDim2.new(0, 100, 0, 40)})
                        holdTween:Play()
                    end)

                    button.MouseButton1Up:Connect(function()
                        if isHolding then
                            isHolding = false
                            releaseTween = TweenService:Create(button, TweenInfo.new(0.2), {Size = UDim2.new(0, 60, 0, 30)})
                            releaseTween:Play()
                            onClick()
                        end
                    end)

                    return button
                end

                
                local function saveMessages()
                    if not isSupport then return end
                    debugPrint("Saving messages to config file...")

                    local allText = ""
                    for msg, _ in pairs(externalUniqueMessages) do
                        allText = allText .. msg .. "\n"
                    end

                    writefile(WorkspacePaths.CONFIG_FILE, allText)
                    debugPrint("Messages saved.")
                end

                
                local function loadMessages()
                    if not isSupport then return end

                    debugPrint("Loading messages from config file...")

                    if not isfile(WorkspacePaths.CONFIG_FILE) then
                        debugPrint("Config file missing. Creating empty file.")
                        writefile(WorkspacePaths.CONFIG_FILE, "")
                        return
                    end

                    local content = readfile(WorkspacePaths.CONFIG_FILE)
                    if not content or content == "" then
                        debugPrint("Config file is empty.")
                        return
                    end

                    local scrollFrame = externalUI:FindFirstChild("MessageScroll")
                    local uiList = scrollFrame and scrollFrame:FindFirstChildOfClass("UIListLayout")
                    local lines = string.split(content, "\n")

                    coroutine.wrap(function()
                        for _, text in ipairs(lines) do
                            if text ~= "" and not externalUniqueMessages[text] then
                                externalUniqueMessages[text] = true
                                sendChatMessage(text)

                                local msgButton = Instance.new("TextButton")
                                msgButton.Name = "MsgButton"
                                msgButton.Size = UDim2.new(1, -10, 0, 30)
                                msgButton.BackgroundColor3 = Color3.fromRGB(220, 220, 220)
                                msgButton.Text = text
                                msgButton.TextColor3 = Color3.new(0, 0, 0)
                                msgButton.Font = Enum.Font.SourceSans
                                msgButton.TextScaled = true
                                msgButton.AutoButtonColor = true
                                msgButton.Parent = scrollFrame

                                local msgCorner = Instance.new("UICorner")
                                msgCorner.CornerRadius = UDim.new(0.45, 0)
                                msgCorner.Parent = msgButton

                                msgButton.MouseButton1Click:Connect(function()
                                    sendChatMessage(text)
                                end)

                                if uiList then
                                    scrollFrame.CanvasSize = UDim2.new(0, 0, 0, uiList.AbsoluteContentSize.Y)
                                end

                                wait(0.15) -- simulate user-like loading delay
                            end
                        end
                    end)()
                end

                
                createExpandableButton("SaveButton", UDim2.new(0, 10, 0.80, 10), "Save", saveMessages)
                createExpandableButton("LoadButton", UDim2.new(1, -70, 0.80, 10), "Load", loadMessages)
			else
                externalUI.Visible = not externalUI.Visible
            end
        end
        blueAnimRunning = false
    end)
	end)

Features & Information

DISCLAIMER: i have copy of this version https://scriptblox.com/script/Universal-Script-Macro-chat-v2-40200 if you are the owner of this pls dont be mad at me :( - old features in the link - Save to file - Read file to load - Add folder and file

Community Comments (1)

ZERETETZERETETSep 7, 2025

Cool remake

More Scripts for Universal Scripts