-- Put this LocalScript in StarterGui local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") local StarterGui = game:GetService("StarterGui") local player = Players.LocalPlayer local playerGui = player:WaitForChild("PlayerGui") -- Try to find the SayMessageRequest event used to send chat messages local function getSayEvent() local root = ReplicatedStorage:FindFirstChild("DefaultChatSystemChatEvents") if root and root:FindFirstChild("SayMessageRequest") then return root:FindFirstChild("SayMessageRequest") end -- sometimes games put chat under different places (rare). Try waiting a little. root = ReplicatedStorage:WaitForChild("DefaultChatSystemChatEvents", 5) if root then return root:FindFirstChild("SayMessageRequest") end return nil end local sayEvent = getSayEvent() -- Create GUI local screenGui = Instance.new("ScreenGui") screenGui.Name = "R6EmotesGUI" screenGui.ResetOnSpawn = false screenGui.Parent = playerGui screenGui.DisplayOrder = 50 local frame = Instance.new("Frame") frame.Parent = screenGui frame.Size = UDim2.new(0, 220, 0, 320) frame.Position = UDim2.new(0.05, 0, 0.25, 0) frame.BackgroundColor3 = Color3.fromRGB(0,0,0) frame.BackgroundTransparency = 0.15 frame.Active = true local uiCorner = Instance.new("UICorner", frame) uiCorner.CornerRadius = UDim.new(0, 14) -- Title local title = Instance.new("TextLabel", frame) title.Size = UDim2.new(1, -12, 0, 36) title.Position = UDim2.new(0, 6, 0, 6) title.BackgroundTransparency = 1 title.Text = "R6 EMOTES" title.TextScaled = true title.TextColor3 = Color3.fromRGB(255,255,255) title.Font = Enum.Font.SourceSansBold title.TextXAlignment = Enum.TextXAlignment.Center -- Status label (shows errors) local status = Instance.new("TextLabel", frame) status.Size = UDim2.new(1, -12, 0, 22) status.Position = UDim2.new(0, 6, 0, 46) status.BackgroundTransparency = 1 status.Text = "" status.TextScaled = true status.TextColor3 = Color3.fromRGB(255,200,200) status.Font = Enum.Font.SourceSans status.TextXAlignment = Enum.TextXAlignment.Center -- Container for buttons (scrollable) local scroller = Instance.new("ScrollingFrame", frame) scroller.Size = UDim2.new(1, -12, 1, -80) scroller.Position = UDim2.new(0, 6, 0, 74) scroller.BackgroundTransparency = 1 scroller.CanvasSize = UDim2.new(0,0,0,0) scroller.ScrollBarThickness = 6 local layout = Instance.new("UIListLayout", scroller) layout.Padding = UDim.new(0,6) layout.SortOrder = Enum.SortOrder.LayoutOrder layout.HorizontalAlignment = Enum.HorizontalAlignment.Center -- Emote list (default R6 emotes) local emotes = { {name = "Wave", cmd = "/e wave"}, {name = "Point", cmd = "/e point"}, {name = "Cheer", cmd = "/e cheer"}, {name = "Laugh", cmd = "/e laugh"}, {name = "Dance 1", cmd = "/e dance"}, {name = "Dance 2", cmd = "/e dance2"}, {name = "Dance 3", cmd = "/e dance3"}, } -- debounce map to avoid spam clicking local debounces = {} local function sendEmote(command) if not sayEvent then status.Text = "Chat event not found. Emotes may be blocked in this game." return end -- basic debounce (1 second) if debounces[command] then return end debounces[command] = true -- Fire server to send chat message which triggers emote if allowed local ok, err = pcall(function() sayEvent:FireServer("/e "..command, "All") end) if not ok then status.Text = "Failed to send chat: "..tostring(err) else status.Text = "" -- clear any previous error end -- clear debounce after short delay delay(0.9, function() debounces[command] = nil end) end -- Button creator local function makeButton(displayName, emoteCmd) local btn = Instance.new("TextButton") btn.Size = UDim2.new(0.95, 0, 0, 34) btn.BackgroundColor3 = Color3.fromRGB(80,80,80) btn.TextColor3 = Color3.fromRGB(255,255,255) btn.Text = displayName btn.TextScaled = true btn.Font = Enum.Font.SourceSansSemibold btn.Parent = scroller local corner = Instance.new("UICorner", btn) corner.CornerRadius = UDim.new(0,8) btn.MouseButton1Click:Connect(function() sendEmote(emoteCmd) end) end -- Create all emote buttons for _, v in ipairs(emotes) do makeButton(v.name, v.cmd) end -- Update canvas size so scroller fits all buttons local function updateCanvas() local contentY = 0 for _, obj in ipairs(scroller:GetChildren()) do if obj:IsA("TextButton") then contentY = contentY + obj.AbsoluteSize.Y + layout.Padding.Offset end end scroller.CanvasSize = UDim2.new(0,0,0, contentY + 8) end -- Wait for UI to render then update canvas scroller:GetPropertyChangedSignal("AbsoluteSize"):Connect(updateCanvas) delay(0.1, updateCanvas) -- Make frame draggable (works reliably across devices) local dragging, dragInput, dragStart, startPos local function onInputBegan(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 local function onInputChanged(input) if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then dragInput = input end end frame.InputBegan:Connect(onInputBegan) frame.InputChanged:Connect(onInputChanged) game:GetService("UserInputService").InputChanged:Connect(function(input) if input == dragInput and dragging 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) -- If the chat event wasn't found, show a friendly message if not sayEvent then status.Text = "Chat event not found — emotes may be blocked by this game." end