-- [[ keybind to open is comma. ]] -- -- [[ is toggle-able. ]] -- -- [[ Loads ALL Roblox emotes (can be heavy though, but works). ]] -- -- [[ Does lag a little when loading, but that's just because Roblox's UGC emotes system. ]] -- if getgenv().FreeEmotes_GUI then if getgenv().notify then return getgenv().notify("Warning", "Free Emotes GUI is already loaded!", 5) else return end end local IsStudio = false local ContextActionService = game:GetService("ContextActionService") local HttpService = game:GetService("HttpService") local GuiService = game:GetService("GuiService") local CoreGui = game:GetService("CoreGui") local AvatarEditorService = game:GetService("AvatarEditorService") local Players = game:GetService("Players") local StarterGui = game:GetService("StarterGui") local UserInputService = game:GetService("UserInputService") local NotifyLib = loadstring(game:HttpGet("https://raw.githubusercontent.com/EnterpriseExperience/MicUpSource/refs/heads/main/Notification_Lib.lua"))() local Emotes = {} local function AddEmote(name: string, id: IntValue, price: IntValue?) if not (name and id) then return end table.insert(Emotes, { ["name"] = name, ["id"] = id, ["icon"] = "rbxthumb://type=Asset&id=".. id .."&w=150&h=150", ["price"] = price or 0, ["index"] = #Emotes + 1, ["sort"] = {} }) end local CurrentSort = "newestfirst" local valid_titles = { success = "Success", info = "Info", warning = "Warning", error = "Error" } local function format_title(str) if typeof(str) ~= "string" then return "Info" end local key = str:lower() return valid_titles[key] or "Info" end getgenv().notify = getgenv().notify or function(title, msg, dur) local fixed_title = format_title(title) NotifyLib:External_Notification(fixed_title, tostring(msg), tonumber(dur)) end local FavoriteOff = "rbxassetid://10651060677" local FavoriteOn = "rbxassetid://10651061109" local FavoritedEmotes = {} local ScreenGui = Instance.new("ScreenGui") ScreenGui.Name = "Emotes" ScreenGui.DisplayOrder = 2 ScreenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling ScreenGui.ResetOnSpawn = false ScreenGui.Enabled = false local BackFrame = Instance.new("Frame") BackFrame.Size = UDim2.new(0.9, 0, 0.5, 0) BackFrame.AnchorPoint = Vector2.new(0.5, 0.5) BackFrame.Position = UDim2.new(0.5, 0, 0.5, 0) BackFrame.SizeConstraint = Enum.SizeConstraint.RelativeYY BackFrame.BackgroundTransparency = 1 BackFrame.BorderSizePixel = 0 BackFrame.Parent = ScreenGui wait() getgenv().FreeEmotes_GUI = ScreenGui local EmoteName = Instance.new("TextLabel") EmoteName.Name = "EmoteName" EmoteName.TextScaled = true EmoteName.AnchorPoint = Vector2.new(0.5, 0.5) EmoteName.Position = UDim2.new(-0.1, 0, 0.5, 0) EmoteName.Size = UDim2.new(0.2, 0, 0.2, 0) EmoteName.SizeConstraint = Enum.SizeConstraint.RelativeYY EmoteName.BackgroundColor3 = Color3.fromRGB(30, 30, 30) EmoteName.TextColor3 = Color3.new(1, 1, 1) EmoteName.BorderSizePixel = 0 EmoteName.Parent = BackFrame local Corner = Instance.new("UICorner") Corner.Parent = EmoteName local Loading = Instance.new("TextLabel", BackFrame) Loading.AnchorPoint = Vector2.new(0.5, 0.5) Loading.Text = "Loading..." Loading.TextColor3 = Color3.new(1, 1, 1) Loading.BackgroundColor3 = Color3.new(0, 0, 0) Loading.TextScaled = true Loading.BackgroundTransparency = 0.5 Loading.Size = UDim2.fromScale(0.2, 0.1) Loading.Position = UDim2.fromScale(0.5, 0.2) Corner:Clone().Parent = Loading local Frame = Instance.new("ScrollingFrame") Frame.Size = UDim2.new(1, 0, 1, 0) Frame.CanvasSize = UDim2.new(0, 0, 0, 0) Frame.AutomaticCanvasSize = Enum.AutomaticSize.Y Frame.ScrollingDirection = Enum.ScrollingDirection.Y Frame.AnchorPoint = Vector2.new(0.5, 0.5) Frame.Position = UDim2.new(0.5, 0, 0.5, 0) Frame.BackgroundTransparency = 1 Frame.ScrollBarThickness = 5 Frame.BorderSizePixel = 0 Frame.MouseLeave:Connect(function() EmoteName.Text = "Select an Emote" end) Frame.Parent = BackFrame local Grid = Instance.new("UIGridLayout") Grid.CellSize = UDim2.new(0.105, 0, 0, 0) Grid.CellPadding = UDim2.new(0.006, 0, 0.006, 0) Grid.SortOrder = Enum.SortOrder.LayoutOrder Grid.Parent = Frame local SortFrame = Instance.new("Frame") SortFrame.Visible = false SortFrame.BorderSizePixel = 0 SortFrame.Position = UDim2.new(1, 5, -0.125, 0) SortFrame.Size = UDim2.new(0.2, 0, 0, 0) SortFrame.AutomaticSize = Enum.AutomaticSize.Y SortFrame.BackgroundTransparency = 1 Corner:Clone().Parent = SortFrame SortFrame.Parent = BackFrame local SortList = Instance.new("UIListLayout") SortList.Padding = UDim.new(0.02, 0) SortList.HorizontalAlignment = Enum.HorizontalAlignment.Center SortList.VerticalAlignment = Enum.VerticalAlignment.Top SortList.SortOrder = Enum.SortOrder.LayoutOrder SortList.Parent = SortFrame local function SortEmotes() for i,Emote in pairs(Emotes) do local EmoteButton = Frame:FindFirstChild(Emote.id) if not EmoteButton then continue end local IsFavorited = table.find(FavoritedEmotes, Emote.id) EmoteButton.LayoutOrder = Emote.sort[CurrentSort] + ((IsFavorited and 0) or #Emotes) EmoteButton.number.Text = Emote.sort[CurrentSort] end end local function createsort(order, text, sort) local CreatedSort = Instance.new("TextButton") CreatedSort.SizeConstraint = Enum.SizeConstraint.RelativeXX CreatedSort.Size = UDim2.new(1, 0, 0.2, 0) CreatedSort.BackgroundColor3 = Color3.fromRGB(30, 30, 30) CreatedSort.LayoutOrder = order CreatedSort.TextColor3 = Color3.new(1, 1, 1) CreatedSort.Text = text CreatedSort.TextScaled = true CreatedSort.BorderSizePixel = 0 Corner:Clone().Parent = CreatedSort CreatedSort.Parent = SortFrame CreatedSort.MouseButton1Click:Connect(function() SortFrame.Visible = false CurrentSort = sort SortEmotes() end) return CreatedSort end wait(0.1) createsort(1, "Newest First", "newestfirst") createsort(2, "Oldest First", "oldestfirst") createsort(3, "Alphabetically First", "alphabeticfirst") createsort(4, "Alphabetically Last", "alphabeticlast") createsort(5, "Highest Price", "highestprice") createsort(6, "Lowest Price", "lowestprice") getgenv().notify("Success", "Welcome to the NEW - [ Free Emote GUI ] - system.", 10) local SortButton = Instance.new("TextButton") SortButton.BorderSizePixel = 0 SortButton.AnchorPoint = Vector2.new(0.5, 0.5) SortButton.Position = UDim2.new(0.925, -5, -0.075, 0) SortButton.Size = UDim2.new(0.15, 0, 0.1, 0) SortButton.TextScaled = true SortButton.TextColor3 = Color3.new(1, 1, 1) SortButton.BackgroundColor3 = Color3.new(0, 0, 0) SortButton.BackgroundTransparency = 0.3 SortButton.Text = "Sort" SortButton.MouseButton1Click:Connect(function() SortFrame.Visible = not SortFrame.Visible end) Corner:Clone().Parent = SortButton SortButton.Parent = BackFrame local CloseButton = Instance.new("TextButton") CloseButton.BorderSizePixel = 0 CloseButton.AnchorPoint = Vector2.new(0.5, 0.5) CloseButton.Position = UDim2.new(0.075, 0, -0.075, 0) CloseButton.Size = UDim2.new(0.15, 0, 0.1, 0) CloseButton.TextScaled = true CloseButton.TextColor3 = Color3.new(1, 1, 1) CloseButton.BackgroundColor3 = Color3.new(0, 0, 0) CloseButton.BackgroundTransparency = 0.3 CloseButton.Text = "Close" CloseButton.MouseButton1Click:Connect(function() ScreenGui.Enabled = false end) Corner:Clone().Parent = CloseButton CloseButton.Parent = BackFrame local SearchBar = Instance.new("TextBox") SearchBar.BorderSizePixel = 0 SearchBar.AnchorPoint = Vector2.new(0.5, 0.5) SearchBar.Position = UDim2.new(0.5, 0, -0.075, 0) SearchBar.Size = UDim2.new(0.55, 0, 0.1, 0) SearchBar.TextScaled = true SearchBar.PlaceholderText = "Search" SearchBar.TextColor3 = Color3.new(1, 1, 1) SearchBar.BackgroundColor3 = Color3.new(0, 0, 0) SearchBar.BackgroundTransparency = 0.3 SearchBar:GetPropertyChangedSignal("Text"):Connect(function() local text = SearchBar.Text:lower() local buttons = Frame:GetChildren() if text ~= text:sub(1,50) then SearchBar.Text = SearchBar.Text:sub(1,50) text = SearchBar.Text:lower() end if text ~= "" then for i,button in pairs(buttons) do if button:IsA("GuiButton") then local name = button:GetAttribute("name"):lower() if name:match(text) then button.Visible = true else button.Visible = false end end end else for i,button in pairs(buttons) do if button:IsA("GuiButton") then button.Visible = true end end end end) Corner:Clone().Parent = SearchBar SearchBar.Parent = BackFrame local search_modes = { Enum.CatalogSortType.RecentlyCreated, Enum.CatalogSortType.MostFavorited, Enum.CatalogSortType.Relevance, Enum.CatalogSortType.PriceLowToHigh, Enum.CatalogSortType.PriceHighToLow, } getgenv().search_modes = getgenv().search_modes or search_modes local function LoadEmotes() local collected = {} Emotes = {} getgenv().notify("Info", "Searching with search modes...", 5) for _, sortType in ipairs(getgenv().search_modes) do local params = CatalogSearchParams.new() params.AssetTypes = {Enum.AvatarAssetType.EmoteAnimation} params.SortType = sortType params.SortAggregation = Enum.CatalogSortAggregation.AllTime params.IncludeOffSale = true params.Limit = 120 local function getCatalogPage() local ok, page = pcall(function() return AvatarEditorService:SearchCatalog(params) end) if not ok then task.wait(2) return getCatalogPage() end return page end local catalogPage = getCatalogPage() getgenv().notify("Success", "SortType: "..tostring(sortType).." has been executed.", 5) while true do local page = catalogPage:GetCurrentPage() for _, emote in ipairs(page) do if not collected[emote.Id] then collected[emote.Id] = emote end end if catalogPage.IsFinished then break end local function adv() local s = pcall(function() catalogPage:AdvanceToNextPageAsync() end) if not s then task.wait(2) return adv() end end adv() end end getgenv().notify("Info", "Listing all emotes...", 5) local list = {} for _, emote in pairs(collected) do table.insert(list, emote) end for _, em in ipairs(list) do AddEmote(em.Name, em.Id, em.Price) end getgenv().notify("Info", "Adding default emotes...", 3) AddEmote("Arm Wave", 5915773155) AddEmote("Head Banging", 5915779725) AddEmote("Face Calisthenics", 9830731012) getgenv().notify("Success", "Added default emotes.", 3) wait(0.5) getgenv().notify("Info", "Adding ALL emotes found... (will lag, please wait).", 10) table.sort(Emotes, function(a,b) return a.index < b.index end) for i,v in ipairs(Emotes) do v.sort.newestfirst = i end table.sort(Emotes, function(a,b) return a.index > b.index end) for i,v in ipairs(Emotes) do v.sort.oldestfirst = i end table.sort(Emotes, function(a,b) return a.name:lower() < b.name:lower() end) for i,v in ipairs(Emotes) do v.sort.alphabeticfirst = i end table.sort(Emotes, function(a,b) return a.name:lower() > b.name:lower() end) for i,v in ipairs(Emotes) do v.sort.alphabeticlast = i end table.sort(Emotes, function(a,b) return a.price < b.price end) for i,v in ipairs(Emotes) do v.sort.lowestprice = i end table.sort(Emotes, function(a,b) return a.price > b.price end) for i,v in ipairs(Emotes) do v.sort.highestprice = i end wait(6) getgenv().notify("Success", "Successfully sorted, loaded, added and initialized ALL Roblox emotes.", 15) pcall(function() if Loading then Loading:Destroy() end end) end wait(0.2) getgenv().notify("Info", "Loading ALL Roblox emotes... (Please wait!).", 60) LoadEmotes() wait() local RefreshButton = Instance.new("TextButton") RefreshButton.BorderSizePixel = 0 RefreshButton.AnchorPoint = Vector2.new(0.5, 0.5) RefreshButton.Position = UDim2.new(0.899999976, 0, -0.180000007, 0) RefreshButton.Size = UDim2.new(0.2, 0, 0.1, 0) RefreshButton.TextScaled = true RefreshButton.TextColor3 = Color3.new(1, 1, 1) RefreshButton.BackgroundColor3 = Color3.new(0, 0, 0) RefreshButton.BackgroundTransparency = 0.3 RefreshButton.Text = "Refresh" Corner:Clone().Parent = RefreshButton RefreshButton.Parent = BackFrame RefreshButton.MouseButton1Click:Connect(function() Loading = Instance.new("TextLabel", BackFrame) Loading.AnchorPoint = Vector2.new(0.5, 0.5) Loading.Text = "Refreshing..." Loading.TextColor3 = Color3.new(1, 1, 1) Loading.BackgroundColor3 = Color3.new(0, 0, 0) Loading.TextScaled = true Loading.BackgroundTransparency = 0.5 Loading.Size = UDim2.fromScale(0.2, 0.1) Loading.Position = UDim2.fromScale(0.5, 0.2) Corner:Clone().Parent = Loading LoadEmotes() wait(0.5) Loading:Destroy() if LocalPlayer.Character then CharacterAdded(LocalPlayer.Character) end end) local function openemotes(name, state, input) if state == Enum.UserInputState.Begin then ScreenGui.Enabled = not ScreenGui.Enabled end end if IsStudio then ContextActionService:BindActionAtPriority( "Emote Menu", openemotes, true, 2001, Enum.KeyCode.Comma ) else ContextActionService:BindCoreActionAtPriority( "Emote Menu", openemotes, true, 2001, Enum.KeyCode.Comma ) end local inputconnect ScreenGui:GetPropertyChangedSignal("Enabled"):Connect(function() if ScreenGui.Enabled == true then EmoteName.Text = "Select an Emote" SearchBar.Text = "" SortFrame.Visible = false GuiService:SetEmotesMenuOpen(false) inputconnect = UserInputService.InputBegan:Connect(function(input, processed) if not processed then if input.UserInputType == Enum.UserInputType.MouseButton1 then ScreenGui.Enabled = false end end end) else inputconnect:Disconnect() end end) if not IsStudio then GuiService.EmotesMenuOpenChanged:Connect(function(isopen) if isopen then ScreenGui.Enabled = false end end) end GuiService.MenuOpened:Connect(function() ScreenGui.Enabled = false end) if not game:IsLoaded() then game.Loaded:Wait() end local LocalPlayer = Players.LocalPlayer if IsStudio then ScreenGui.Parent = LocalPlayer:FindFirstChildOfClass("PlayerGui") else ScreenGui.Parent = CoreGui end local function SendNotification(title, text) if (not IsStudio) and syn and syn.toast_notification then syn.toast_notification({ Type = ToastType.Error, Title = title, Content = text }) else StarterGui:SetCore("SendNotification", { Title = title, Text = text }) end end task.wait(.3) loadstring(game:HttpGet('https://raw.githubusercontent.com/EnterpriseExperience/MicUpSource/refs/heads/main/EmotesGUIToggleButton.lua'))() task.wait() local function HumanoidPlayEmote(humanoid, name, id) if IsStudio then return humanoid:PlayEmote(name) else return humanoid:PlayEmoteAndGetAnimTrackById(id) end end local function PlayEmote(name: string, id: IntValue) -- ScreenGui.Enabled = false -- This line is now commented out so the panel won't close. SearchBar.Text = "" local Humanoid = LocalPlayer.Character:FindFirstChildOfClass("Humanoid") local Description = Humanoid and Humanoid:FindFirstChildOfClass("HumanoidDescription") if not Description then return end if LocalPlayer.Character.Humanoid.RigType ~= Enum.HumanoidRigType.R6 then local succ, err = pcall(function() HumanoidPlayEmote(Humanoid, name, id) end) if not succ then Description:AddEmote(name, id) HumanoidPlayEmote(Humanoid, name, id) end else getgenv().notify("Warning", "You need to be R15 to play Emotes.", 10) end end local function WaitForChildOfClass(parent, class) local child = parent:FindFirstChildOfClass(class) while not child or child.ClassName ~= class do child = parent.ChildAdded:Wait() end return child end local function IsFileFunc(...) if IsStudio then return elseif isfile then return isfile(...) end end local function WriteFileFunc(...) if IsStudio then return elseif writefile then return writefile(...) end end local function ReadFileFunc(...) if IsStudio then return elseif readfile then return readfile(...) end end if not IsStudio then if IsFileFunc("FavoritedEmotes.txt") then if not pcall(function() FavoritedEmotes = HttpService:JSONDecode(ReadFileFunc("FavoritedEmotes.txt")) end) then FavoritedEmotes = {} end else WriteFileFunc("FavoritedEmotes.txt", HttpService:JSONEncode(FavoritedEmotes)) end local UpdatedFavorites = {} for i,name in pairs(FavoritedEmotes) do if typeof(name) == "string" then for i,emote in pairs(Emotes) do if emote.name == name then table.insert(UpdatedFavorites, emote.id) break end end end end if #UpdatedFavorites ~= 0 then FavoritedEmotes = UpdatedFavorites WriteFileFunc("FavoritedEmotes.txt", HttpService:JSONEncode(FavoritedEmotes)) end end local function CharacterAdded(Character) for i,v in pairs(Frame:GetChildren()) do if not v:IsA("UIGridLayout") then v:Destroy() end end local Humanoid = WaitForChildOfClass(Character, "Humanoid") local Description = Humanoid:WaitForChild("HumanoidDescription", 5) or Instance.new("HumanoidDescription", Humanoid) local random = Instance.new("TextButton") local Ratio = Instance.new("UIAspectRatioConstraint") Ratio.AspectType = Enum.AspectType.ScaleWithParentSize Ratio.Parent = random random.LayoutOrder = 0 random.TextColor3 = Color3.new(1, 1, 1) random.BorderSizePixel = 0 random.BackgroundTransparency = 0.5 random.BackgroundColor3 = Color3.new(0, 0, 0) random.TextScaled = true random.Text = "Random" random:SetAttribute("name", "") Corner:Clone().Parent = random random.MouseButton1Click:Connect(function() local randomemote = Emotes[math.random(1, #Emotes)] PlayEmote(randomemote.name, randomemote.id) end) random.MouseEnter:Connect(function() EmoteName.Text = "Random" end) random.Parent = Frame for i,Emote in pairs(Emotes) do Description:AddEmote(Emote.name, Emote.id) local EmoteButton = Instance.new("ImageButton") local IsFavorited = table.find(FavoritedEmotes, Emote.id) EmoteButton.LayoutOrder = Emote.sort[CurrentSort] + ((IsFavorited and 0) or #Emotes) EmoteButton.Name = Emote.id EmoteButton:SetAttribute("name", Emote.name) Corner:Clone().Parent = EmoteButton EmoteButton.Image = Emote.icon EmoteButton.BackgroundTransparency = 0.5 EmoteButton.BackgroundColor3 = Color3.new(0, 0, 0) EmoteButton.BorderSizePixel = 0 Ratio:Clone().Parent = EmoteButton local EmoteNumber = Instance.new("TextLabel") EmoteNumber.Name = "number" EmoteNumber.TextScaled = true EmoteNumber.BackgroundTransparency = 1 EmoteNumber.TextColor3 = Color3.new(1, 1, 1) EmoteNumber.BorderSizePixel = 0 EmoteNumber.AnchorPoint = Vector2.new(0.5, 0.5) EmoteNumber.Size = UDim2.new(0.2, 0, 0.2, 0) EmoteNumber.Position = UDim2.new(0.1, 0, 0.9, 0) EmoteNumber.Text = Emote.sort[CurrentSort] EmoteNumber.TextXAlignment = Enum.TextXAlignment.Center EmoteNumber.TextYAlignment = Enum.TextYAlignment.Center local UIStroke = Instance.new("UIStroke") UIStroke.Transparency = 0.5 UIStroke.Parent = EmoteNumber EmoteNumber.Parent = EmoteButton EmoteButton.Parent = Frame EmoteButton.MouseButton1Click:Connect(function() PlayEmote(Emote.name, Emote.id) end) EmoteButton.MouseEnter:Connect(function() EmoteName.Text = Emote.name end) local Favorite = Instance.new("ImageButton") Favorite.Name = "favorite" if table.find(FavoritedEmotes, Emote.id) then Favorite.Image = FavoriteOn else Favorite.Image = FavoriteOff end Favorite.AnchorPoint = Vector2.new(0.5, 0.5) Favorite.Size = UDim2.new(0.2, 0, 0.2, 0) Favorite.Position = UDim2.new(0.9, 0, 0.9, 0) Favorite.BorderSizePixel = 0 Favorite.BackgroundTransparency = 1 Favorite.Parent = EmoteButton Favorite.MouseButton1Click:Connect(function() local index = table.find(FavoritedEmotes, Emote.id) if index then table.remove(FavoritedEmotes, index) Favorite.Image = FavoriteOff EmoteButton.LayoutOrder = Emote.sort[CurrentSort] + #Emotes else table.insert(FavoritedEmotes, Emote.id) Favorite.Image = FavoriteOn EmoteButton.LayoutOrder = Emote.sort[CurrentSort] end WriteFileFunc("FavoritedEmotes.txt", HttpService:JSONEncode(FavoritedEmotes)) end) end for i=1,9 do local EmoteButton = Instance.new("Frame") EmoteButton.LayoutOrder = 2147483647 EmoteButton.Name = "filler" EmoteButton.BackgroundTransparency = 1 EmoteButton.BorderSizePixel = 0 Ratio:Clone().Parent = EmoteButton EmoteButton.Visible = true EmoteButton.Parent = Frame EmoteButton.MouseEnter:Connect(function() EmoteName.Text = "Select an Emote" end) end end getgenv().built_emoting_system_already = getgenv().built_emoting_system_already or false LocalPlayer.CharacterAdded:Connect(function(char) if not getgenv().built_emoting_system_already then getgenv().built_emoting_system_already = true CharacterAdded(char) end end) if LocalPlayer.Character and not getgenv().built_emoting_system_already then getgenv().built_emoting_system_already = true CharacterAdded(LocalPlayer.Character) end