--[[
DELTA CHAT FIX - CORREÇÃO DE SOBREPOSIÇÃO
- Corrigido: Bug de texto empilhado/sobreposto.
- Mantido: Visualização de Dias da Conta.
- Mantido: Envio para chat original.
]]
local Players = game:GetService("Players")
local CoreGui = game:GetService("CoreGui")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local UserInputService = game:GetService("UserInputService")
local StarterGui = game:GetService("StarterGui")
local LocalPlayer = Players.LocalPlayer
-- 1. Limpeza Garantida
local GUI_NAME = "DeltaFixedChat_v2"
pcall(function()
if CoreGui:FindFirstChild(GUI_NAME) then
CoreGui[GUI_NAME]:Destroy()
end
-- Tenta desativar o chat nativo visualmente se possível
StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Chat, false)
end)
local ScreenGui = Instance.new("ScreenGui")
ScreenGui.Name = GUI_NAME
ScreenGui.ResetOnSpawn = false -- Importante para não sumir ao morrer
ScreenGui.Parent = CoreGui
-- 2. Estrutura Principal
local ChatFrame = Instance.new("Frame")
ChatFrame.Name = "MainFrame"
ChatFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 20)
ChatFrame.BackgroundTransparency = 0.2
ChatFrame.BorderSizePixel = 0
ChatFrame.Position = UDim2.new(0, 20, 0, 100)
ChatFrame.Size = UDim2.new(0, 320, 0, 220)
ChatFrame.ClipsDescendants = true -- Impede texto de sair da caixa
ChatFrame.Active = true
ChatFrame.Parent = ScreenGui
-- Barra Superior
local TopBar = Instance.new("Frame")
TopBar.Name = "Header"
TopBar.BackgroundColor3 = Color3.fromRGB(0, 0, 0)
TopBar.BackgroundTransparency = 0.4
TopBar.Size = UDim2.new(1, 0, 0, 30)
TopBar.Parent = ChatFrame
local Title = Instance.new("TextLabel")
Title.Text = "Chat Global (Anti-Bug)"
Title.Size = UDim2.new(1, -40, 1, 0)
Title.BackgroundTransparency = 1
Title.TextColor3 = Color3.new(1,1,1)
Title.Font = Enum.Font.GothamBold
Title.TextSize = 14
Title.Parent = TopBar
local MinBtn = Instance.new("TextButton")
MinBtn.Text = "-"
MinBtn.Size = UDim2.new(0, 40, 0, 30)
MinBtn.Position = UDim2.new(1, -40, 0, 0)
MinBtn.BackgroundColor3 = Color3.fromRGB(200, 40, 40)
MinBtn.TextColor3 = Color3.new(1,1,1)
MinBtn.Font = Enum.Font.GothamBold
MinBtn.Parent = TopBar
-- Área de Rolagem (Onde estava o bug)
local Scroll = Instance.new("ScrollingFrame")
Scroll.Name = "MessageContainer"
Scroll.BackgroundTransparency = 1
Scroll.Position = UDim2.new(0, 5, 0, 35)
Scroll.Size = UDim2.new(1, -10, 1, -75) -- Espaço calculado para não sobrar
Scroll.CanvasSize = UDim2.new(0, 0, 0, 0) -- Será ajustado via script
Scroll.ScrollBarThickness = 6
Scroll.Parent = ChatFrame
local Layout = Instance.new("UIListLayout")
Layout.Parent = Scroll
Layout.SortOrder = Enum.SortOrder.LayoutOrder
Layout.Padding = UDim.new(0, 4) -- Espaço entre mensagens
-- Correção do Bug: Atualizar tamanho do scroll manualmente
Layout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(function()
Scroll.CanvasSize = UDim2.new(0, 0, 0, Layout.AbsoluteContentSize.Y + 10)
-- Auto scroll para baixo suavemente
Scroll.CanvasPosition = Vector2.new(0, Layout.AbsoluteContentSize.Y)
end)
-- Input Box
local InputContainer = Instance.new("Frame")
InputContainer.BackgroundTransparency = 1
InputContainer.Position = UDim2.new(0, 5, 1, -35)
InputContainer.Size = UDim2.new(1, -10, 0, 30)
InputContainer.Parent = ChatFrame
local Box = Instance.new("TextBox")
Box.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
Box.BackgroundTransparency = 0.1
Box.Size = UDim2.new(1, 0, 1, 0)
Box.Font = Enum.Font.SourceSans
Box.TextSize = 16
Box.PlaceholderText = "Toque aqui para falar..."
Box.Text = ""
Box.TextColor3 = Color3.new(0,0,0)
Box.ClearTextOnFocus = false
Box.TextWrapped = true
Box.Parent = InputContainer
local UICorner = Instance.new("UICorner")
UICorner.CornerRadius = UDim.new(0, 6)
UICorner.Parent = Box
-- 3. Sistema de Arrastar (Mobile)
local dragging, dragInput, dragStart, startPos
local function update(input)
local delta = input.Position - dragStart
ChatFrame.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
end
TopBar.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragging = true
dragStart = input.Position
startPos = ChatFrame.Position
input.Changed:Connect(function()
if input.UserInputState == Enum.UserInputState.End then dragging = false end
end)
end
end)
TopBar.InputChanged:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then dragInput = input end
end)
UserInputService.InputChanged:Connect(function(input) if input == dragInput and dragging then update(input) end end)
-- 4. Funções de Chat
local function SendMessage(text)
-- Fallback systems para garantir envio
local Replicated = game:GetService("ReplicatedStorage")
local DefaultChat = Replicated:FindFirstChild("DefaultChatSystemChatEvents")
local SayRequest = DefaultChat and DefaultChat:FindFirstChild("SayMessageRequest")
if SayRequest then
SayRequest:FireServer(text, "All")
else
local TCS = game:GetService("TextChatService")
if TCS.ChatInputBarConfiguration.TargetTextChannel then
TCS.ChatInputBarConfiguration.TargetTextChannel:SendAsync(text)
else
game.Players.LocalPlayer.Chatted:Fire(text)
end
end
end
Box.FocusLost:Connect(function(enter)
if enter and Box.Text ~= "" then
SendMessage(Box.Text)
Box.Text = ""
end
end)
-- Função de Criação de Mensagem (CORRIGIDA)
local function CreateMessageLabel(player, message)
-- Cria um frame invisível para segurar o texto (evita sobreposição)
local MsgContainer = Instance.new("Frame")
MsgContainer.BackgroundTransparency = 1
MsgContainer.Size = UDim2.new(1, 0, 0, 0) -- Começa com 0
MsgContainer.AutomaticSize = Enum.AutomaticSize.Y -- Cresce sozinho
MsgContainer.Parent = Scroll
local Label = Instance.new("TextLabel")
Label.BackgroundTransparency = 1
Label.Size = UDim2.new(1, 0, 0, 0)
Label.AutomaticSize = Enum.AutomaticSize.Y
Label.Font = Enum.Font.SourceSansBold
Label.TextSize = 16
Label.TextWrapped = true
Label.TextXAlignment = Enum.TextXAlignment.Left
Label.RichText = true
Label.TextColor3 = Color3.new(1,1,1)
Label.TextStrokeTransparency = 0.7
Label.TextStrokeColor3 = Color3.new(0,0,0)
Label.Parent = MsgContainer
-- Lógica de Dias da Conta
local statsText = "[?]"
local nameColor = "#FFFFFF"
local pName = "Sistema"
if player then
pName = player.Name
local days = player.AccountAge or 0
statsText = string.format("[%sd]", days)
if player.TeamColor then
local c = player.TeamColor.Color
nameColor = string.format("#%02x%02x%02x", c.R*255, c.G*255, c.B*255)
end
else
nameColor = "#FFFF00"
end
Label.Text = string.format('%s [%s]: %s', statsText, nameColor, pName, message)
-- Limpeza (Mantém apenas as últimas 30 mensagens para não pesar)
if #Scroll:GetChildren() > 30 then
-- O primeiro filho é o Layout, então removemos o segundo
local old = Scroll:GetChildren()[2]
if old and old:IsA("Frame") then old:Destroy() end
end
end
-- 5. Listener de Mensagens
local function SetupListener()
local ChatEvents = ReplicatedStorage:FindFirstChild("DefaultChatSystemChatEvents")
if ChatEvents and ChatEvents:FindFirstChild("OnMessageDoneFiltering") then
ChatEvents.OnMessageDoneFiltering.OnClientEvent:Connect(function(data)
local pName = data.FromSpeaker
local msg = data.Message
local player = Players:FindFirstChild(pName)
CreateMessageLabel(player, msg)
end)
else
-- Fallback universal
local function onChat(plr)
plr.Chatted:Connect(function(msg) CreateMessageLabel(plr, msg) end)
end
for _, plr in pairs(Players:GetPlayers()) do onChat(plr) end
Players.PlayerAdded:Connect(onChat)
end
end
SetupListener()
-- Minimizar
local minimized = false
MinBtn.MouseButton1Click:Connect(function()
minimized = not minimized
if minimized then
ChatFrame.Size = UDim2.new(0, 320, 0, 30)
Scroll.Visible = false
InputContainer.Visible = false
MinBtn.Text = "+"
else
ChatFrame.Size = UDim2.new(0, 320, 0, 220)
Scroll.Visible = true
InputContainer.Visible = true
MinBtn.Text = "-"
end
end)
-- Mensagem de Boas-vindas
CreateMessageLabel(nil, "Chat Delta Corrigido. Seus dias de conta: " .. LocalPlayer.AccountAge)