Emote changer V3
Key Required

Emote changer V3

Evade RealPnsdgRealPnsdg 4.5K views 6.6K executesUpdated Jan 20, 2026
Unrated
00
Lua Script•1140 lines (39304 chars)
local WindUI

do
    local ok, result = pcall(function()
        return require("./src/Init")
    end)
    
    if ok then
        WindUI = result
    else 
        WindUI = loadstring(game:HttpGet("https://github.com/Footagesus/WindUI/releases/latest/download/main.lua"))()
    end
end

WindUI.TransparencyValue = 0.2
WindUI:SetTheme("Dark")

local Window = WindUI:CreateWindow({
    Title = "Visual Emote Changer",
    Author = "By Pnsdg (Evade Overhaul)",
    Folder = "DaraHub",
    Size = UDim2.fromOffset(580, 490),
    Theme = "Dark",
    HidePanelBackground = false,
    Acrylic = false,
    HideSearchBar = false,
    SideBarWidth = 200
})

Window:SetIconSize(48)

Window:CreateTopbarButton("theme-switcher", "moon", function()
    WindUI:SetTheme(WindUI:GetCurrentTheme() == "Dark" and "Light" or "Dark")
end, 990)

local FeatureSection = Window:Section({ Title = "Idk", Opened = true })
local Tabs = {
    EmoteChanger = FeatureSection:Tab({ Title = "EmoteChanger", Icon = "smile" })
}
Tabs.EmoteChanger:Section({ Title = "Overhaul remote function hooks"})
local player = game:GetService("Players").LocalPlayer
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Events = ReplicatedStorage:WaitForChild("Events", 10)
local CharacterFolder = Events and Events:WaitForChild("Character", 10)
local EmoteRemote = CharacterFolder and CharacterFolder:WaitForChild("Emote", 10)
local PassCharacterInfo = CharacterFolder and CharacterFolder:WaitForChild("PassCharacterInfo", 10)

local remoteSignal = PassCharacterInfo and PassCharacterInfo.OnClientEvent
local currentTag = nil
local currentEmotes = table.create(12, "")
local selectEmotes = table.create(12, "")
local emoteEnabled = table.create(12, false)

local currentEmoteInputs = {}
local selectEmoteInputs = {}

local function readTagFromFolder(f)
    if not f then return nil end
    local a = f:GetAttribute("Tag")
    if a ~= nil then 
        return a 
    end
    local o = f:FindFirstChild("Tag")
    if o and o:IsA("ValueBase") then 
        return o.Value 
    end
    return nil
end

local function onRespawn()
    currentTag = nil
    pendingSlot = nil
    
    task.spawn(function()
        local startTime = tick()
        
        while tick() - startTime < 10 do
            if workspace:FindFirstChild("Game") and workspace.Game:FindFirstChild("Players") then
                local pf = workspace.Game.Players:FindFirstChild(player.Name)
                if pf then
                    currentTag = readTagFromFolder(pf)
                    if currentTag then
                        local b = tonumber(currentTag)
                        if b and b >= 0 and b <= 255 then
                            break
                        else
                            currentTag = nil
                        end
                    end
                end
            end
            task.wait(0.5)
        end
    end)
end

local pendingSlot = nil
local blockOriginalEmote = false

local function fireSelect(slot)
    if not currentTag then return end
    
    local b = tonumber(currentTag)
    if not b or b < 0 or b > 255 then return end
    if not selectEmotes[slot] or selectEmotes[slot] == "" then return end
    
    local buf = buffer.create(2)
    buffer.writeu8(buf, 0, b)
    buffer.writeu8(buf, 1, 17)
    
    if remoteSignal then
        firesignal(remoteSignal, buf, {selectEmotes[slot]})
    end
end

if PassCharacterInfo and EmoteRemote then
    PassCharacterInfo.OnClientEvent:Connect(function(...)
        if not pendingSlot then return end
        local slot = pendingSlot
        pendingSlot = nil
        task.wait(0.1)
        fireSelect(slot)
    end)

    local success, oldNamecall = pcall(function()
        return hookmetamethod(game, "__namecall", function(self, ...)
            local m
            local ok, err = pcall(function()
                m = getnamecallmethod()
            end)
            if not ok then return nil end

            local args = {...}
            if m == "FireServer" and self == EmoteRemote and type(args[1]) == "string" then
                for i = 1, 12 do
                    if emoteEnabled[i] and currentEmotes[i] ~= "" and args[1] == currentEmotes[i] then
                        pendingSlot = i
                        blockOriginalEmote = true
                        task.spawn(function()
                            local ok2, err2 = pcall(function()
                                task.wait(0.1)
                                blockOriginalEmote = false
                                if pendingSlot == i then
                                    pendingSlot = nil
                                    fireSelect(i)
                                end
                            end)
                            if not ok2 then warn(err2) end
                        end)
                        if blockOriginalEmote then
                            return nil
                        end
                    end
                end
            end
            return oldNamecall(self, ...)
        end)
    end)

    if not success then        
        if EmoteChangerEmoteApply then
            EmoteChangerEmoteApply:Lock()
        end
        
        if EmoteChangerEmoteReset then
            EmoteChangerEmoteReset:Lock()
        end
        
        for i = 1, 12 do
            if currentEmoteInputs[i] and currentEmoteInputs[i].Lock then
                currentEmoteInputs[i]:Lock()
            end
            if selectEmoteInputs[i] and selectEmoteInputs[i].Lock then
                selectEmoteInputs[i]:Lock()
            end
        end
        
        WindUI:Notify({
            Title = "Executor Incompatible",
            Content = "Your executor is not supported. Some features have been disabled.",
            Duration = 5
        })
    end
    
    if player.Character then
        task.spawn(onRespawn)
    end
    
    player.CharacterAdded:Connect(function()
        task.wait(1)
        onRespawn()
    end)
    
    if workspace:FindFirstChild("Game") and workspace.Game:FindFirstChild("Players") then
        workspace.Game.Players.ChildAdded:Connect(function(child)
            if child.Name == player.Name then
                task.wait(0.5)
                onRespawn()
            end
        end)
        
        workspace.Game.Players.ChildRemoved:Connect(function(child)
            if child.Name == player.Name then
                currentTag = nil
                pendingSlot = nil
            end
        end)
    end
end

Tabs.EmoteChanger:Section({ Title = "Emote Changer", TextSize = 20 })
Tabs.EmoteChanger:Divider()

for i = 1, 12 do
   currentEmoteInputs[i] = Tabs.EmoteChanger:Input({
        Title = "Current Emote " .. i,
        Placeholder = "Enter current emote name",
        Value = currentEmotes[i],
        Callback = function(v) 
            currentEmotes[i] = v:gsub("%s+", "")
        end
    })
end

Tabs.EmoteChanger:Divider()

for i = 1, 12 do
   selectEmoteInputs[i] = Tabs.EmoteChanger:Input({
        Title = "Select Emote " .. i,
        Placeholder = "Enter select emote name",
        Value = selectEmotes[i],
        Callback = function(v) 
            selectEmotes[i] = v:gsub("%s+", "")
        end
    })
end

EmoteChangerEmoteOption = Tabs.EmoteChanger:Input({
    Title = "Emote Possible option",
    Desc = "Higher Value may Broke emote animation recommend Use 1-3",
    Placeholder = "1",
    Callback = function(v)
        local num = tonumber(v) or 1
        local Players = game:GetService("Players")
        local player = Players.LocalPlayer
        
        local currentNum = num
        
        local function setupCharacter(character)
            if character == player.Character then
                character:SetAttribute("EmoteNum", currentNum)
            end
        end
        
        local function monitorCharacter()
            while true do
                wait(1)
                local character = player.Character
                if character and character:GetAttribute("EmoteNum") ~= currentNum then
                    character:SetAttribute("EmoteNum", currentNum)
                end
            end
        end
        
        if player.Character then
            setupCharacter(player.Character)
        end
        
        player.CharacterAdded:Connect(function(character)
            wait(1)
            setupCharacter(character)
        end)
        
        spawn(monitorCharacter)
    end
})

EmoteChangerEmoteApply = Tabs.EmoteChanger:Button({
    Title="Apply Emote Mappings",
    Icon="check",
    Callback=function()
        local hasAnyEmote = false
        
        for i=1,12 do
            if currentEmotes[i] ~= "" or selectEmotes[i] ~= "" then
                hasAnyEmote = true
                break
            end
        end
        
        if not hasAnyEmote then
            WindUI:Notify({
                Title="Emote Changer",
                Content="Please enter your emote",
                Duration=3
            })
            return
        end
        
        local function normalizeEmoteName(name)
            return name:gsub("%s+", ""):lower()
        end
        
        local function isValidEmote(emoteName)
            if emoteName == "" then return false, "" end
            
            local normalizedInput = normalizeEmoteName(emoteName)
            local emotesFolder = game:GetService("ReplicatedStorage"):FindFirstChild("Items")
            if emotesFolder then
                emotesFolder = emotesFolder:FindFirstChild("Emotes")
                if emotesFolder then
                    for _, emoteModule in ipairs(emotesFolder:GetChildren()) do
                        if emoteModule:IsA("ModuleScript") then
                            local normalizedEmote = normalizeEmoteName(emoteModule.Name)
                            if normalizedEmote == normalizedInput then
                                return true, emoteModule.Name
                            end
                        end
                    end
                end
            end
            return false, ""
        end
        
        local sameEmoteSlots = {}
        local missingEmoteSlots = {}
        local invalidEmoteSlots = {}
        local successfulSlots = {}
        
        for i=1,12 do
            if currentEmotes[i] ~= "" and selectEmotes[i] ~= "" then
                local currentValid, currentActual = isValidEmote(currentEmotes[i])
                local selectValid, selectActual = isValidEmote(selectEmotes[i])
                
                if not currentValid and not selectValid then
                    table.insert(invalidEmoteSlots, {slot = i, currentInvalid = true, currentName = currentEmotes[i], selectInvalid = true, selectName = selectEmotes[i]})
                elseif not currentValid then
                    table.insert(invalidEmoteSlots, {slot = i, currentInvalid = true, currentName = currentEmotes[i], selectInvalid = false, selectName = selectEmotes[i]})
                elseif not selectValid then
                    table.insert(invalidEmoteSlots, {slot = i, currentInvalid = false, currentName = currentEmotes[i], selectInvalid = true, selectName = selectEmotes[i]})
                elseif currentActual:lower() == selectActual:lower() then
                    table.insert(sameEmoteSlots, i)
                else
                    table.insert(successfulSlots, {slot = i, current = currentActual, select = selectActual})
                end
            elseif currentEmotes[i] ~= "" or selectEmotes[i] ~= "" then
                table.insert(missingEmoteSlots, i)
            end
        end
        
        local message = ""
        
        if #successfulSlots > 0 then
            message = message .. "<font color='#00FF00'><stroke color='#000000' width='0.0001'>✓ Successfully applied emote on:</stroke></font>\n"
            for _, data in ipairs(successfulSlots) do
                message = message .. "<font color='#00FF00'><stroke color='#000000' width='0.0001'>Slot " .. data.slot .. " Emote: " .. data.current .. " → " .. data.select .. "</stroke></font>\n"
            end
            message = message .. "\n"
        end
        
        if #sameEmoteSlots > 0 then
            message = message .. "<font color='##ff0000'><stroke color='#FFFFFF' width='0.0001'>⚠️ Failed to apply emote on:</stroke></font>\n"
            for _, slot in ipairs(sameEmoteSlots) do
                message = message .. "<font color='##ff0000'><stroke color='#FFFFFF' width='0.0001'>Slot " .. slot .. " - Cannot change emote with the same name</stroke></font>\n"
            end
            message = message .. "\n"
        end
        
        if #invalidEmoteSlots > 0 then
            message = message .. "<font color='##ff0000'><stroke color='#FFFFFF' width='0.0001'>⚠️ Failed to apply emote on:</stroke></font>\n"
            for _, data in ipairs(invalidEmoteSlots) do
                message = message .. "<font color='##ff0000'><stroke color='#FFFFFF' width='0.0001'>Slot " .. data.slot .. " - "
                if data.currentInvalid and data.selectInvalid then
                    message = message .. "Invalid current emote: \"" .. data.currentName .. "\", Invalid select emote: \"" .. data.selectName .. "\"</stroke></font>\n"
                elseif data.currentInvalid then
                    message = message .. "Invalid current emote: \"" .. data.currentName .. "\", Select emote: \"" .. data.selectName .. "\"</stroke></font>\n"
                else
                    message = message .. "Current emote: \"" .. data.currentName .. "\", Invalid select emote: \"" .. data.selectName .. "\"</stroke></font>\n"
                end
            end
            message = message .. "\n"
        end
        
        if #missingEmoteSlots > 0 then
            message = message .. "<font color='##ff0000'><stroke color='#FFFFFF' width='0.0001'>⚠️ Failed to apply emote on:</stroke></font>\n"
            for _, slot in ipairs(missingEmoteSlots) do
                if currentEmotes[slot] == "" then
                    message = message .. "<font color='##ff0000'><stroke color='#FFFFFF' width='0.0001'>Slot " .. slot .. " - Current emote slot is missing text</stroke></font>\n"
                else
                    message = message .. "<font color='##ff0000'><stroke color='#FFFFFF' width='0.0001'>Slot " .. slot .. " - Select emote slot is missing text</stroke></font>\n"
                end
            end
        end
        
        for i=1,12 do
            local currentValid = isValidEmote(currentEmotes[i])
            local selectValid = isValidEmote(selectEmotes[i])
            emoteEnabled[i] = (currentValid and selectValid and currentEmotes[i]:lower() ~= selectEmotes[i]:lower())
        end
        
        WindUI:Notify({
            Title="Emote Changer",
            Content=message,
            Duration=8
        })
    end
})

EmoteChangerEmoteReset = Tabs.EmoteChanger:Button({
    Title = "Reset All Emotes",
    Icon = "trash-2",
    Callback = function()
        for i = 1, 12 do
            currentEmotes[i] = ""
            selectEmotes[i] = ""
            emoteEnabled[i] = false
            
            if currentEmoteInputs[i] and currentEmoteInputs[i].Set then
                currentEmoteInputs[i]:Set("")
            end
            if selectEmoteInputs[i] and selectEmoteInputs[i].Set then
                selectEmoteInputs[i]:Set("")
            end
        end
        
        WindUI:Notify({
            Title = "Emote Changer", 
            Content = "All emotes have been reset!"
        })
    end
})
Tabs.EmoteChanger:Section({ Title = "Legacy remote function hooks"})
yaneedtobeinlegacymodetousethis = Tabs.EmoteChanger:Paragraph({ Title = "ya need to be in legacy mode to use this"})
local placeId = game.PlaceId

if placeId == 96537472072550 then
    if yaneedtobeinlegacymodetousethis then
        yaneedtobeinlegacymodetousethis:Lock()
    end
    
    if EmoteChangerEmoteApply then
        EmoteChangerEmoteApply:Lock()
    end
    
    if EmoteChangerEmoteReset then
        EmoteChangerEmoteReset:Lock()
    end
    
    for i = 1, 12 do
        if currentEmoteInputs[i] and currentEmoteInputs[i].Lock then
            currentEmoteInputs[i]:Lock()
        end
        if selectEmoteInputs[i] and selectEmoteInputs[i].Lock then
            selectEmoteInputs[i]:Lock()
        end
    end
    
    originalEmotes = {}
    for i = 1, 8 do
        originalEmotes[i] = game:GetService("Players").LocalPlayer:GetAttribute("Emote" .. i) or ""
    end
    
    hookInstalled = false
    blockRemote = false
    emoteSpeedConnection = nil
    tpcameraConnection = nil
    emotingAttributeConnection = nil
    pendingEmoteChanges = {}
    emoteSpeedCache = {}
    
    function GetPlayerTagData()
        local player = game:GetService("Players").LocalPlayer
        local character = player.Character
        
        if character then
            return character:GetAttribute("Tag")
        end
        
        return nil
    end
    
    function TriggerTagEmote(emoteSlot)
        if not blockRemote then return end
        
        local emoteName = pendingEmoteChanges[emoteSlot] or game:GetService("Players").LocalPlayer:GetAttribute("Emote" .. emoteSlot)
        if not emoteName or emoteName == "" then return end
        
        local tagData = GetPlayerTagData()
        if not tagData then return end
        
        local characterEvent = game:GetService("ReplicatedStorage").Events.Character.Emote
        firesignal(characterEvent.OnClientEvent, tagData, emoteName)
    end
    
    function GetEmoteSpeedFromModule(emoteName)
        if emoteSpeedCache[emoteName] then
            return emoteSpeedCache[emoteName]
        end
        
        local replicatedStorage = game:GetService("ReplicatedStorage")
        if not replicatedStorage then return 1 end
        
        local itemsFolder = replicatedStorage:FindFirstChild("Items")
        if not itemsFolder then return 1 end
        
        local emotesFolder = itemsFolder:FindFirstChild("Emotes")
        if not emotesFolder then return 1 end
        
        local emoteModule = emotesFolder:FindFirstChild(emoteName)
        if not emoteModule or not emoteModule:IsA("ModuleScript") then return 1 end
        
        local success, emoteData = pcall(require, emoteModule)
        if not success or not emoteData then return 1 end
        
        local speedMult = emoteData.SpeedMult or emoteData.EmoteInfo and emoteData.EmoteInfo.SpeedMult or 1
        emoteSpeedCache[emoteName] = speedMult
        return speedMult
    end
    
    function SetupEmoteSpeedChange(apply)
        if emoteSpeedConnection then
            emoteSpeedConnection:Disconnect()
            emoteSpeedConnection = nil
        end
        
        local playerModel = workspace:FindFirstChild("Game") and workspace.Game:FindFirstChild("Players")
        if playerModel then
            local localPlayerModel = playerModel:FindFirstChild(game.Players.LocalPlayer.Name)
            if localPlayerModel then
                local isEmoting = localPlayerModel:GetAttribute("Emoting")
                
                if isEmoting == true then
                    local emoteName = nil
                    for i = 1, 8 do
                        local currentEmote = game:GetService("Players").LocalPlayer:GetAttribute("Emote" .. i)
                        if currentEmote and currentEmote ~= "" then
                            emoteName = currentEmote
                            break
                        end
                    end
                    
                    if emoteName then
                        local speedMult = GetEmoteSpeedFromModule(emoteName)
                        local statChanges = localPlayerModel:FindFirstChild("StatChanges")
                        if statChanges then
                            local speed = statChanges:FindFirstChild("Speed")
                            if speed then
                                local emoteSpeed = speed:FindFirstChild("EmoteSpeed")
                                
                                if apply then
                                    if emoteSpeed then
                                        emoteSpeed.Value = speedMult
                                    else
                                        emoteSpeed = Instance.new("NumberValue")
                                        emoteSpeed.Name = "EmoteSpeed"
                                        emoteSpeed.Value = speedMult
                                        emoteSpeed.Parent = speed
                                    end
                                else
                                    if emoteSpeed then
                                        emoteSpeed:Destroy()
                                    end
                                end
                            end
                        end
                    end
                else
                    local statChanges = localPlayerModel:FindFirstChild("StatChanges")
                    if statChanges then
                        local speed = statChanges:FindFirstChild("Speed")
                        if speed then
                            local emoteSpeed = speed:FindFirstChild("EmoteSpeed")
                            if emoteSpeed then
                                emoteSpeed:Destroy()
                            end
                        end
                    end
                end
                
                if apply then
                    emoteSpeedConnection = localPlayerModel:GetAttributeChangedSignal("Emoting"):Connect(function()
                        local newIsEmoting = localPlayerModel:GetAttribute("Emoting")
                        local statChanges = localPlayerModel:FindFirstChild("StatChanges")
                        
                        if statChanges then
                            local speed = statChanges:FindFirstChild("Speed")
                            if speed then
                                local emoteSpeed = speed:FindFirstChild("EmoteSpeed")
                                
                                if newIsEmoting == true then
                                    local emoteName = nil
                                    for i = 1, 8 do
                                        local currentEmote = game:GetService("Players").LocalPlayer:GetAttribute("Emote" .. i)
                                        if currentEmote and currentEmote ~= "" then
                                            emoteName = currentEmote
                                            break
                                        end
                                    end
                                    
                                    if emoteName then
                                        local speedMult = GetEmoteSpeedFromModule(emoteName)
                                        if not emoteSpeed then
                                            emoteSpeed = Instance.new("NumberValue")
                                            emoteSpeed.Name = "EmoteSpeed"
                                            emoteSpeed.Value = speedMult
                                            emoteSpeed.Parent = speed
                                        else
                                            emoteSpeed.Value = speedMult
                                        end
                                    end
                                else
                                    if emoteSpeed then
                                        emoteSpeed:Destroy()
                                    end
                                end
                            end
                        end
                    end)
                end
            end
        end
    end
    
    function SetupTPCameraOnEmoting(apply)
        if tpcameraConnection then
            tpcameraConnection:Disconnect()
            tpcameraConnection = nil
        end
        
        if emotingAttributeConnection then
            emotingAttributeConnection:Disconnect()
            emotingAttributeConnection = nil
        end
        
        if apply then
            local playerModel = workspace:FindFirstChild("Game") and workspace.Game:FindFirstChild("Players")
            if playerModel then
                local localPlayerModel = playerModel:FindFirstChild(game.Players.LocalPlayer.Name)
                if localPlayerModel then
                    emotingAttributeConnection = localPlayerModel:GetAttributeChangedSignal("Emoting"):Connect(function()
                        local isEmoting = localPlayerModel:GetAttribute("Emoting")
                        if isEmoting == true then
                            local Event = game:GetService("Players").LocalPlayer.Character.Client
                            firesignal(Event.OnClientEvent, "TPCamera", {Zoom = 10})
                        end
                    end)
                end
            end
        end
    end
    
    function InstallHook()
        local Event = game:GetService("ReplicatedStorage").Events.Emote
        
        if hookInstalled then return end
        
        local success, errorMsg = pcall(function()
            local mt = getrawmetatable(Event)
            if mt and mt.__namecall then
                local oldNamecall = mt.__namecall
                
                setreadonly(mt, false)
                
                mt.__namecall = function(self, ...)
                    local method = getnamecallmethod()
                    if method == "FireServer" then
                        local args = {...}
                        local emoteNum = tostring(args[1])
                        if blockRemote and emoteNum:match("^[1-8]$") then
                            TriggerTagEmote(tonumber(emoteNum))
                            return
                        end
                    end
                    return oldNamecall(self, ...)
                end
                
                setreadonly(mt, true)
                hookInstalled = true
                WindUI:Notify({
                    Title = "Hook Status",
                    Content = "Emote hook installed successfully",
                    Duration = 3
                })
            else
                WindUI:Notify({
                    Title = "Hook Status",
                    Content = "Could not get metatable, using fallback",
                    Duration = 3
                })
            end
        end)
        
        if not success then
            WindUI:Notify({
                Title = "Hook Error",
                Content = "Failed to install hook: " .. tostring(errorMsg),
                Duration = 3
            })
        end
        
        if not hookInstalled then
            WindUI:Notify({
                Title = "Hook Status",
                Content = "Using fallback method",
                Duration = 3
            })
        end
    end
    
    function ScanReplicatedStorageEmotes()
        emotes = {}
        replicatedStorage = game:GetService("ReplicatedStorage")
        
        if replicatedStorage then
            itemsFolder = replicatedStorage:FindFirstChild("Items")
            if itemsFolder then
                emotesFolder = itemsFolder:FindFirstChild("Emotes")
                if emotesFolder then
                    for _, item in pairs(emotesFolder:GetChildren()) do
                        table.insert(emotes, item.Name)
                    end
                end
            end
        end
        
        return #emotes > 0 and emotes or {"No emotes found"}
    end
    
    emoteValues = ScanReplicatedStorageEmotes()
    
    legacyemoteDropdowns = {}
    
    for i = 1, 8 do
        currentEmote = game:GetService("Players").LocalPlayer:GetAttribute("Emote" .. i) or ""
        
        legacyemoteDropdowns[i] = Tabs.EmoteChanger:Dropdown({
            Title = "Emote Slot " .. i,
            Flag = "EmoteSlot" .. i,
            Desc = "Current: " .. currentEmote,
            Values = emoteValues,
            Value = currentEmote,
            Multi = false,
            AllowNone = true,
            Callback = function(value)
                pendingEmoteChanges[i] = value
                legacyemoteDropdowns[i].Desc = "Pending: " .. (value or "Not set")
            end
        })
    end
    
    Tabs.EmoteChanger:Space()
    
    LegacyApply = Tabs.EmoteChanger:Button({
        Title = "Apply All Emotes",
        Desc = "Apply current emote settings",
        Callback = function()
            blockRemote = true
            local success, errorMsg = pcall(function()
                for i = 1, 8 do
                    if pendingEmoteChanges[i] then
                        game:GetService("Players").LocalPlayer:SetAttribute("Emote" .. i, pendingEmoteChanges[i])
                        legacyemoteDropdowns[i].Desc = "Applied: " .. (pendingEmoteChanges[i] or "Not set")
                    end
                end
                pendingEmoteChanges = {}
                SetupEmoteSpeedChange(true)
                SetupTPCameraOnEmoting(true)
                InstallHook()
            end)
            
            if success then
                WindUI:Notify({
                    Title = "Emotes Applied",
                    Content = "Custom emotes are now active",
                    Duration = 3
                })
            else
                WindUI:Notify({
                    Title = "Apply Error",
                    Content = "Failed to apply emotes: " .. tostring(errorMsg),
                    Duration = 3
                })
            end
        end
    })
    
    LegacyReset = Tabs.EmoteChanger:Button({
        Title = "Reset All Emotes",
        Desc = "Restore original emote state",
        Callback = function()
            blockRemote = false
            local success, errorMsg = pcall(function()
                SetupEmoteSpeedChange(false)
                SetupTPCameraOnEmoting(false)
                pendingEmoteChanges = {}
                for i = 1, 8 do
                    game:GetService("Players").LocalPlayer:SetAttribute("Emote" .. i, originalEmotes[i])
                    legacyemoteDropdowns[i]:Set(originalEmotes[i])
                    legacyemoteDropdowns[i].Desc = "Current: " .. (originalEmotes[i] or "Not set")
                end
            end)
            
            if success then
                WindUI:Notify({
                    Title = "Emotes Reset",
                    Content = "All emotes restored to original",
                    Duration = 3
                })
            else
                WindUI:Notify({
                    Title = "Reset Error",
                    Content = "Failed to reset emotes: " .. tostring(errorMsg),
                    Duration = 3
                })
            end
        end
    })
    
    game:GetService("Players").LocalPlayer.CharacterAdded:Connect(function()
        task.wait(1)
        
        if blockRemote then
            local success = pcall(function()
                SetupEmoteSpeedChange(true)
                SetupTPCameraOnEmoting(true)
            end)
        end
    end)
    
    if game:GetService("Players").LocalPlayer.Character then
        if blockRemote then
            task.wait(1)
            local success = pcall(function()
                SetupEmoteSpeedChange(true)
                SetupTPCameraOnEmoting(true)
            end)
        end
    end
    
    InstallHook()
end
Tabs.EmoteChanger:Section({ Title = "Swapping mode (Global)"})
Tabs.EmoteChanger:Section({ Title = "What's different of emote Swapper and emote changer? well it's different because emote swap is gonna sawp emote from ReplicatedStorage and emote changer is gonna fetch what emote you executed from remote spy, this may not working on shitty executeor", TextSize = 10 })
Tabs.EmoteChanger:Divider()

EmoteSwapper = {
 CurrentEmotes = {},
 SelectedEmotes = {},
 SwappedPairs = {},
 InputFields = {},
 PendingApply = false,
 PendingSwaps = {}
}

for i = 1, 12 do
 EmoteSwapper.CurrentEmotes[i] = ""
 EmoteSwapper.SelectedEmotes[i] = ""
end

Tabs.EmoteChanger:Section({ Title = "Current Emotes", TextSize = 16 })

for i = 1, 12 do
 EmoteSwapper.InputFields["CurrentEmote" .. i] = Tabs.EmoteChanger:Input({
  Title = "Current Emote " .. i,
  Placeholder = "Enter current emote name",
  Value = "",
  Callback = function(value)
  EmoteSwapper.CurrentEmotes[i] = value
  end
 })
end

Tabs.EmoteChanger:Section({ Title = "Selected Emotes", TextSize = 16 })

for i = 1, 12 do
 EmoteSwapper.InputFields["SelectedEmote" .. i] = Tabs.EmoteChanger:Input({
  Title = "Select Emote " .. i,
  Placeholder = "Enter replacement emote name",
  Value = "",
  Callback = function(value)
  EmoteSwapper.SelectedEmotes[i] = value
  end
 })
end

function SwapEmoteNames(currentName, selectedName)
 Items = game:GetService("ReplicatedStorage"):FindFirstChild("Items")
 if not Items then return false end
 
 EmotesFolder = Items:FindFirstChild("Emotes")
 if not EmotesFolder then return false end
 
 currentEmoteObj = EmotesFolder:FindFirstChild(currentName)
 selectedEmoteObj = EmotesFolder:FindFirstChild(selectedName)
 
 if currentEmoteObj and selectedEmoteObj then
  tempName = selectedName .. "_EmoteSwapTemp"
  
  while EmotesFolder:FindFirstChild(tempName) do
  tempName = tempName .. "_"
  end
  
  currentEmoteObj.Name = tempName
  selectedEmoteObj.Name = currentName
  currentEmoteObj.Name = selectedName
  
  return true
 end
 return false
end

function ResetEmoteNames()
 Items = game:GetService("ReplicatedStorage"):FindFirstChild("Items")
 if not Items then return false end
 
 EmotesFolder = Items:FindFirstChild("Emotes")
 if not EmotesFolder then return false end
 
 for currentEmote, selectedEmote in pairs(EmoteSwapper.SwappedPairs) do
  currentEmoteObj = EmotesFolder:FindFirstChild(selectedEmote)
  selectedEmoteObj = EmotesFolder:FindFirstChild(currentEmote)
  
  if currentEmoteObj and selectedEmoteObj then
  tempName = currentEmote .. "_EmoteSwapTemp"
  
  while EmotesFolder:FindFirstChild(tempName) do
 tempName = tempName .. "_"
  end
  
  currentEmoteObj.Name = tempName
  selectedEmoteObj.Name = selectedEmote
  currentEmoteObj.Name = currentEmote
  end
 end
 
 return true
end

function ProcessPendingSwaps()
 if not EmoteSwapper.PendingSwaps or #EmoteSwapper.PendingSwaps == 0 then
  return
 end
 
 swappedCount = 0
 failedCount = 0
 
 for _, swapData in ipairs(EmoteSwapper.PendingSwaps) do
  currentEmote = swapData[1]
  selectedEmote = swapData[2]
  
  if SwapEmoteNames(currentEmote, selectedEmote) then
  EmoteSwapper.SwappedPairs[currentEmote] = selectedEmote
  swappedCount = swappedCount + 1
  else
  failedCount = failedCount + 1
  end
 end
 
 EmoteSwapper.PendingSwaps = {}
 EmoteSwapper.PendingApply = false
 
 return swappedCount, failedCount
end

function CheckIfPlayerDead()
 return not player.Character or not player.Character:FindFirstChild("Humanoid") or player.Character.Humanoid.Health <= 0
end

function CheckIfPlayerDowned()
 return player.Character and player.Character:GetAttribute("Downed")
end

EmoteSwapApplyButton = Tabs.EmoteChanger:Button({
 Title = "Apply Emote Swap",
 Desc = "Swap the current emotes with selected ones",
 Icon = "refresh-cw",
 Callback = function()
  if CheckIfPlayerDead() and not CheckIfPlayerDowned() then
  EmoteSwapper.PendingSwaps = {}
  
  for i = 1, 12 do
 currentEmote = EmoteSwapper.CurrentEmotes[i]
 selectedEmote = EmoteSwapper.SelectedEmotes[i]
 
 if currentEmote ~= "" and selectedEmote ~= "" then
  table.insert(EmoteSwapper.PendingSwaps, {currentEmote, selectedEmote})
 end
  end
  
  if #EmoteSwapper.PendingSwaps > 0 then
 EmoteSwapper.PendingApply = true
 WindUI:Notify({
  Title = "Emote Swapper",
  Content = "Player is dead. Emote swap will be applied when you respawn.",
  Icon = "clock",
  Duration = 3
 })
  else
 WindUI:Notify({
  Title = "Emote Swapper",
  Content = "No emotes specified to swap",
  Icon = "x-circle",
  Duration = 3
 })
  end
  return
  end
  
  swappedCount = 0
  failedCount = 0
  
  for i = 1, 12 do
  currentEmote = EmoteSwapper.CurrentEmotes[i]
  selectedEmote = EmoteSwapper.SelectedEmotes[i]
  
  if currentEmote ~= "" and selectedEmote ~= "" then
 if SwapEmoteNames(currentEmote, selectedEmote) then
  EmoteSwapper.SwappedPairs[currentEmote] = selectedEmote
  swappedCount = swappedCount + 1
 else
  failedCount = failedCount + 1
 end
  end
  end
  
  message = ""
  if swappedCount > 0 then
  message = "Successfully swapped " .. tostring(swappedCount) .. " emote(s)"
  end
  if failedCount > 0 then
  if message ~= "" then message = message .. " | " end
  message = message .. "Failed to swap " .. tostring(failedCount) .. " emote(s)"
  end
  if message == "" then
  message = "No emotes specified to swap"
  end
  
  WindUI:Notify({
  Title = "Emote Swapper",
  Content = message,
  Icon = swappedCount > 0 and "check-circle" or "x-circle",
  Duration = 3
  })
 end
})

EmoteSwapResetButton = Tabs.EmoteChanger:Button({
 Title = "Reset Emote Module",
 Desc = "Restore all emotes to their original names",
 Icon = "rotate-ccw",
 Callback = function()
  if ResetEmoteNames() then
  EmoteSwapper.SwappedPairs = {}
  EmoteSwapper.PendingSwaps = {}
  EmoteSwapper.PendingApply = false
  
  for i = 1, 12 do
 EmoteSwapper.CurrentEmotes[i] = ""
 EmoteSwapper.SelectedEmotes[i] = ""
 
 if EmoteSwapper.InputFields["CurrentEmote" .. i] then
  EmoteSwapper.InputFields["CurrentEmote" .. i]:Set("")
 end
 if EmoteSwapper.InputFields["SelectedEmote" .. i] then
  EmoteSwapper.InputFields["SelectedEmote" .. i]:Set("")
 end
  end
  
  WindUI:Notify({
 Title = "Emote Swapper",
 Content = "All emotes have been restored to original names!",
 Icon = "check-circle",
 Duration = 3
  })
  else
  WindUI:Notify({
 Title = "Emote Swapper",
 Content = "Failed to reset emotes!",
 Icon = "x-circle",
 Duration = 3
  })
  end
 end
})

player.CharacterRemoving:Connect(function()
 if next(EmoteSwapper.SwappedPairs) then
  ResetEmoteNames()
 end
end)

player.CharacterAdded:Connect(function(character)
 task.wait(1)
 
 if CheckIfPlayerDowned() then
  return
 end
 
 if next(EmoteSwapper.SwappedPairs) then
  for currentEmote, selectedEmote in pairs(EmoteSwapper.SwappedPairs) do
  SwapEmoteNames(currentEmote, selectedEmote)
  end
 end
 
 if EmoteSwapper.PendingApply and #EmoteSwapper.PendingSwaps > 0 then
  swappedCount, failedCount = ProcessPendingSwaps()
  
  message = ""
  if swappedCount > 0 then
  message = "Successfully swapped " .. tostring(swappedCount) .. " emote(s)"
  end
  if failedCount > 0 then
  if message ~= "" then message = message .. " | " end
  message = message .. "Failed to swap " .. tostring(failedCount) .. " emote(s)"
  end
  
  if message ~= "" then
  WindUI:Notify({
 Title = "Emote Swapper",
 Content = message,
 Icon = swappedCount > 0 and "check-circle" or "x-circle",
 Duration = 3
  })
  end
 end
end)

player.CharacterAdded:Connect(function(character)
 task.wait(1)
 
 if character:GetAttribute("Downed") then
  return
 end
 
 if next(EmoteSwapper.SwappedPairs) then
  for currentEmote, selectedEmote in pairs(EmoteSwapper.SwappedPairs) do
  SwapEmoteNames(currentEmote, selectedEmote)
  end
 end
end)

Features & Information

Free visual emote

Community Comments (1)

angelhellsinggangelhellsinggJan 26, 2026

don`t work :c

More Scripts for Evade