local ContextActionService = game:GetService("ContextActionService") local HttpService = game:GetService("HttpService") local GuiService = game:GetService("GuiService") local CoreGui = game:GetService("CoreGui") local MarketplaceService = game:GetService("MarketplaceService") local Players = game:GetService("Players") local StarterGui = game:GetService("StarterGui") local UserInputService = game:GetService("UserInputService") local Emotes = {} local LoadedEmotes = {} local function AddEmote(name: string, id: IntValue, price: IntValue?) LoadedEmotes[id] = false task.spawn(function() if not (name and id) then return end local success, date = pcall(function() local info = MarketplaceService:GetProductInfo(id) local updated = info.Updated return DateTime.fromIsoDate(updated):ToUniversalTime() end) if not success then task.wait(10) AddEmote(name, id, price) return end local unix = os.time({ year = date.Year, month = date.Month, day = date.Day, hour = date.Hour, min = date.Minute, sec = date.Second }) LoadedEmotes[id] = true table.insert(Emotes, { ["name"] = name, ["id"] = id, ["icon"] = "rbxthumb://type=Asset&id=".. id .."&w=150&h=150", ["price"] = price or 0, ["lastupdated"] = unix, ["sort"] = {} }) end) end local CurrentSort = "recentfirst" 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.Enabled = true 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 local Corner = Instance.new("UICorner") Corner.Parent = EmoteName local Loading = Instance.new("TextLabel", BackFrame) Loading.AnchorPoint = Vector2.new(0.5, 0.5) Loading.TextColor3 = Color3.new(1, 1, 1) Loading.BackgroundColor3 = Color3.new(0, 0, 0) Loading.TextScaled = true 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() 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 createsort(1, "Recently Updated First", "recentfirst") createsort(2, "Recently Updated Last", "recentlast") createsort(3, "Alphabetically First", "alphabeticfirst") createsort(4, "Alphabetically Last", "alphabeticlast") createsort(5, "Highest Price", "highestprice") createsort(6, "Lowest Price", "lowestprice") 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.10, 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 OpenEmotesButton = Instance.new("ImageButton") OpenEmotesButton.Name = "OpenEmotesButton" OpenEmotesButton.Parent = ScreenGui OpenEmotesButton.BackgroundColor3 = Color3.fromRGB(0, 0, 0) OpenEmotesButton.BackgroundTransparency = 0 OpenEmotesButton.BorderColor3 = Color3.fromRGB(0, 0, 0) OpenEmotesButton.BorderSizePixel = 0 OpenEmotesButton.Position = UDim2.new(0, 0, 0.6, 35) OpenEmotesButton.Size = UDim2.new(0, 40, 0, 30) OpenEmotesButton.Image = "rbxthumb://type=Asset&id=3576686446&w=420&h=420" OpenEmotesButton.ImageColor3 = Color3.fromRGB(0, 255, 255) OpenEmotesButton.MouseButton1Click:Connect(function() ScreenGui.Frame.Visible = not ScreenGui.Frame.Visible end) local ButtonCorner = Instance.new("UICorner") ButtonCorner.CornerRadius = UDim.new(1, 0) ButtonCorner.Parent = OpenEmotesButton local function openemotes(name, state, input) if state == Enum.UserInputState.Begin then ScreenGui.Frame.Visible = not ScreenGui.Frame.Visible end end ContextActionService:BindCoreActionAtPriority( "Emote Menu", openemotes, true, 2001, Enum.KeyCode.Comma ) local inputconnect ScreenGui:GetPropertyChangedSignal("Enabled"):Connect(function() if ScreenGui.Frame.Visible == 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.Frame.Visible = false end end end) else inputconnect:Disconnect() end end) GuiService.EmotesMenuOpenChanged:Connect(function(isopen) if isopen then ScreenGui.Frame.Visible = false end end) GuiService.MenuOpened:Connect(function() ScreenGui.Frame.Visible = false end) if not game:IsLoaded() then game.Loaded:Wait() end --thanks inf yield local SynV3 = syn and DrawingImmediate if (not is_sirhurt_closure) and (not SynV3) and (syn and syn.protect_gui) then syn.protect_gui(ScreenGui) ScreenGui.Parent = CoreGui elseif get_hidden_gui or gethui then local hiddenUI = get_hidden_gui or gethui ScreenGui.Parent = hiddenUI() else ScreenGui.Parent = CoreGui end local function SendNotification(title, text) if 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 local LocalPlayer = Players.LocalPlayer local function PlayEmote(name: string, id: IntValue) ScreenGui.Frame.Visible = false 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() Humanoid:PlayEmoteAndGetAnimTrackById(id) end) if not succ then Description:AddEmote(name, id) Humanoid:PlayEmoteAndGetAnimTrackById(id) end else SendNotification( "r6? lol", "you gotta be r15 dude" ) 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 Cursor = "" while true do local function Request() local success, Response = pcall(function() return game:HttpGetAsync("https://catalog.roblox.com/v1/search/items/details?Category=12&Subcategory=39&SortType=1&SortAggregation=&limit=30&IncludeNotForSale=true&cursor=".. Cursor) end) if not success then task.wait(10) return Request() end return Response end local Response = Request() local Body = HttpService:JSONDecode(Response) for i,v in pairs(Body.data) do AddEmote(v.name, v.id, v.price) end if Body.nextPageCursor ~= nil then Cursor = Body.nextPageCursor else break end end --unreleased emotes AddEmote("Arm Wave", 5915773155) AddEmote("Head Banging", 5915779725) AddEmote("Face Calisthenics", 9830731012) --wait for emotes to finish loading local function EmotesLoaded() for i, loaded in pairs(LoadedEmotes) do if not loaded then return false end end return true end while not EmotesLoaded() do task.wait() end Loading:Destroy() --sorting options setup table.sort(Emotes, function(a, b) return a.lastupdated > b.lastupdated end) for i,v in pairs(Emotes) do v.sort.recentfirst = i end table.sort(Emotes, function(a, b) return a.lastupdated < b.lastupdated end) for i,v in pairs(Emotes) do v.sort.recentlast = i end table.sort(Emotes, function(a, b) return a.name:lower() < b.name:lower() end) for i,v in pairs(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 pairs(Emotes) do v.sort.alphabeticlast = i end table.sort(Emotes, function(a, b) return a.price < b.price end) for i,v in pairs(Emotes) do v.sort.lowestprice = i end table.sort(Emotes, function(a, b) return a.price > b.price end) for i,v in pairs(Emotes) do v.sort.highestprice = i end if isfile("FavoritedEmotes.txt") then if not pcall(function() FavoritedEmotes = HttpService:JSONDecode(readfile("FavoritedEmotes.txt")) end) then FavoritedEmotes = {} end else writefile("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 writefile("FavoritedEmotes.txt", HttpService:JSONEncode(FavoritedEmotes)) 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 writefile("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 if LocalPlayer.Character then CharacterAdded(LocalPlayer.Character) end LocalPlayer.CharacterAdded:Connect(CharacterAdded)