avatar copier
Key RequiredUniversal

avatar copier

Universal Scriptinfotrankieuinfotrankieu 2.6K views 1.9K executesUpdated Jan 8, 2026
4.3/ 5(7 votes)
6186% Positive
Lua Script•616 lines (19192 chars)
local Players = game:GetService("Players")
local TweenService = game:GetService("TweenService")
local UserInputService = game:GetService("UserInputService")
local LocalPlayer = Players.LocalPlayer

pcall(function()
	Players.CharacterAutoLoads = false
end)

local currentTargetName = nil


-- GUI


local Copier = Instance.new("ScreenGui")
local Main = Instance.new("Frame")
local Line = Instance.new("Frame")
local TextLabel = Instance.new("TextLabel")
local CopierPage = Instance.new("Frame")
local Username = Instance.new("TextBox")
local tutorial = Instance.new("TextLabel")
local UserPFP = Instance.new("ImageLabel")
local Copy = Instance.new("TextButton")
local Buttons = Instance.new("Frame")
local CopierPage_2 = Instance.new("TextButton")
local PremadePage = Instance.new("TextButton")
local IngamePage = Instance.new("TextButton")
local Premade = Instance.new("Frame")
local Ingame = Instance.new("Frame")
local ScrollingFrame = Instance.new("ScrollingFrame")
local Frame = Instance.new("Frame")

Copier.Name = "Copier"
Copier.Parent = LocalPlayer:WaitForChild("PlayerGui")
Copier.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
Copier.ResetOnSpawn = false

Main.Name = "Main"
Main.Parent = Copier
Main.BackgroundColor3 = Color3.fromRGB(33, 42, 42)
Main.BorderColor3 = Color3.fromRGB(255, 255, 255)
Main.Position = UDim2.new(0.304305285, 0, 0.286624104, 0)
Main.Size = UDim2.new(0, 418, 0, 328)
Main.ZIndex = 2

Line.Name = "Line"
Line.Parent = Main
Line.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
Line.BorderColor3 = Color3.fromRGB(0, 0, 0)
Line.BorderSizePixel = 0
Line.Position = UDim2.new(0, 0, 0.120575413, 0)
Line.Size = UDim2.new(0, 418, 0, 1)

TextLabel.Parent = Line
TextLabel.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
TextLabel.BackgroundTransparency = 1
TextLabel.BorderColor3 = Color3.fromRGB(0, 0, 0)
TextLabel.BorderSizePixel = 0
TextLabel.Position = UDim2.new(0, 0, -41, 0)
TextLabel.Size = UDim2.new(0, 417, 0, 41)
TextLabel.Font = Enum.Font.Unknown
TextLabel.Text = "Avatar Copier - By ProjectLigma"
TextLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
TextLabel.TextScaled = true
TextLabel.TextSize = 14
TextLabel.TextWrapped = true

CopierPage.Name = "CopierPage"
CopierPage.Parent = Main
CopierPage.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
CopierPage.BackgroundTransparency = 1
CopierPage.BorderColor3 = Color3.fromRGB(0, 0, 0)
CopierPage.BorderSizePixel = 0
CopierPage.Position = UDim2.new(0, 0, 0.123624288, 0)
CopierPage.Size = UDim2.new(0, 418, 0, 229)

Username.Name = "Username"
Username.Parent = CopierPage
Username.BackgroundColor3 = Color3.fromRGB(100, 124, 119)
Username.BorderColor3 = Color3.fromRGB(92, 118, 121)
Username.Position = UDim2.new(0.344497621, 0, 0.0436681211, 0)
Username.Size = UDim2.new(0, 266, 0, 55)
Username.ClearTextOnFocus = false
Username.Font = Enum.Font.Unknown
Username.Text = "ProjectLigma"
Username.TextColor3 = Color3.fromRGB(255, 255, 255)
Username.TextScaled = true
Username.TextSize = 14
Username.TextWrapped = true

tutorial.Name = "tutorial"
tutorial.Parent = CopierPage
tutorial.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
tutorial.BackgroundTransparency = 1
tutorial.BorderColor3 = Color3.fromRGB(0, 0, 0)
tutorial.BorderSizePixel = 0
tutorial.Position = UDim2.new(0.0167464111, 0, 0.602620065, 0)
tutorial.Size = UDim2.new(0, 402, 0, 92)
tutorial.Font = Enum.Font.Unknown
tutorial.Text = "Put the target name on the textbox, then click \"Copy this avatar!\" to get the target's avatar!"
tutorial.TextColor3 = Color3.fromRGB(255, 255, 255)
tutorial.TextScaled = true
tutorial.TextSize = 22
tutorial.TextWrapped = true
tutorial.TextXAlignment = Enum.TextXAlignment.Left
tutorial.TextYAlignment = Enum.TextYAlignment.Top

UserPFP.Name = "UserPFP"
UserPFP.Parent = CopierPage
UserPFP.BackgroundColor3 = Color3.fromRGB(33, 42, 42)
UserPFP.BorderColor3 = Color3.fromRGB(170, 170, 255)
UserPFP.Position = UDim2.new(0.0167464111, 0, 0.0436681211, 0)
UserPFP.Size = UDim2.new(0, 128, 0, 120)
UserPFP.Image = "rbxasset://textures/ui/GuiImagePlaceholder.png"

Copy.Name = "Copy"
Copy.Parent = CopierPage
Copy.BackgroundColor3 = Color3.fromRGB(100, 124, 119)
Copy.BorderColor3 = Color3.fromRGB(92, 118, 121)
Copy.Position = UDim2.new(0.344497621, 0, 0.336244553, 0)
Copy.Size = UDim2.new(0, 265, 0, 53)
Copy.Font = Enum.Font.SourceSansLight
Copy.Text = "Copy this avatar!"
Copy.TextColor3 = Color3.fromRGB(171, 203, 198)
Copy.TextScaled = true
Copy.TextSize = 14
Copy.TextWrapped = true

Buttons.Name = "Buttons"
Buttons.Parent = Main
Buttons.BackgroundColor3 = Color3.fromRGB(33, 42, 42)
Buttons.BorderColor3 = Color3.fromRGB(255, 255, 255)
Buttons.Position = UDim2.new(0, 0, 0.843136489, 0)
Buttons.Size = UDim2.new(0, 418, 0, 51)

CopierPage_2.Name = "CopierPage"
CopierPage_2.Parent = Buttons
CopierPage_2.BackgroundColor3 = Color3.fromRGB(60, 77, 79)
CopierPage_2.BorderColor3 = Color3.fromRGB(92, 118, 121)
CopierPage_2.Position = UDim2.new(0.0189999659, 0, 0.0899999291, 0)
CopierPage_2.Size = UDim2.new(0, 128, 0, 43)
CopierPage_2.Font = Enum.Font.SourceSansLight
CopierPage_2.Text = "Avatar Copier"
CopierPage_2.TextColor3 = Color3.fromRGB(171, 203, 198)
CopierPage_2.TextScaled = true
CopierPage_2.TextSize = 14
CopierPage_2.TextWrapped = true

PremadePage.Name = "PremadePage"
PremadePage.Parent = Buttons
PremadePage.BackgroundColor3 = Color3.fromRGB(60, 77, 79)
PremadePage.BorderColor3 = Color3.fromRGB(92, 118, 121)
PremadePage.Position = UDim2.new(0.674287081, 0, 0.0799997374, 0)
PremadePage.Size = UDim2.new(0, 129, 0, 43)
PremadePage.Font = Enum.Font.SourceSansLight
PremadePage.Text = "Premade avatars"
PremadePage.TextColor3 = Color3.fromRGB(171, 203, 198)
PremadePage.TextScaled = true
PremadePage.TextSize = 14
PremadePage.TextWrapped = true

IngamePage.Name = "IngamePage"
IngamePage.Parent = Buttons
IngamePage.BackgroundColor3 = Color3.fromRGB(60, 77, 79)
IngamePage.BorderColor3 = Color3.fromRGB(92, 118, 121)
IngamePage.Position = UDim2.new(0.344999999, 0, 0.0900000036, 0)
IngamePage.Size = UDim2.new(0, 131, 0, 43)
IngamePage.Font = Enum.Font.SourceSansLight
IngamePage.Text = "Ingame Avatars"
IngamePage.TextColor3 = Color3.fromRGB(171, 203, 198)
IngamePage.TextScaled = true
IngamePage.TextSize = 14
IngamePage.TextWrapped = true

Premade.Name = "Premade"
Premade.Parent = Main
Premade.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
Premade.BackgroundTransparency = 1
Premade.BorderColor3 = Color3.fromRGB(0, 0, 0)
Premade.BorderSizePixel = 0
Premade.Position = UDim2.new(0, 0, 0.123624288, 0)
Premade.Size = UDim2.new(0, 418, 0, 229)
Premade.Visible = false

local function makePremadeButton(name, posX, posY, sizeX, sizeY, text)
	local btn = Instance.new("TextButton")
	btn.Name = name
	btn.Parent = Premade
	btn.BackgroundColor3 = Color3.fromRGB(100, 124, 119)
	btn.BorderColor3 = Color3.fromRGB(92, 118, 121)
	btn.Position = UDim2.new(posX, 0, posY, 0)
	btn.Size = UDim2.new(0, sizeX, 0, sizeY)
	btn.Font = Enum.Font.SourceSansLight
	btn.Text = text
	btn.TextColor3 = Color3.fromRGB(171, 203, 198)
	btn.TextScaled = true
	btn.TextSize = 14
	btn.TextWrapped = true
	return btn
end

local ProjectLigma = makePremadeButton("ProjectLigma", 0.0172487106, 0.0262008738, 128, 50, "ProjectLigma")
local UXI_302 = makePremadeButton("UXI_302", 0.344999909, 0.0262008738, 131, 50, "UXI_302")
local babyoutmooooooon2o22 = makePremadeButton("babyoutmooooooon2o22", 0.6742872, 0.0262008738, 128, 50, "babyoutmooooooon2o22")
local Shedletsky = makePremadeButton("Shedletsky", 0.0172487106, 0.275109172, 128, 49, "Shedletsky")
local MrDoomBringer = makePremadeButton("MrDoomBringer", 0.344999909, 0.275109172, 131, 49, "MrDoomBringer")
local johnnyschwehel1234 = makePremadeButton("johnnyschwehel1234", 0.6742872, 0.275109172, 128, 49, "ProjectLigma's brother avatar")

Ingame.Name = "Ingame"
Ingame.Parent = Main
Ingame.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
Ingame.BackgroundTransparency = 1
Ingame.BorderColor3 = Color3.fromRGB(0, 0, 0)
Ingame.BorderSizePixel = 0
Ingame.Position = UDim2.new(0, 0, 0.123624288, 0)
Ingame.Size = UDim2.new(0, 418, 0, 229)
Ingame.Visible = false

ScrollingFrame.Parent = Ingame
ScrollingFrame.Active = true
ScrollingFrame.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
ScrollingFrame.BackgroundTransparency = 1
ScrollingFrame.BorderColor3 = Color3.fromRGB(0, 0, 0)
ScrollingFrame.BorderSizePixel = 0
ScrollingFrame.Position = UDim2.new(0.0167464837, 0, 0.0262008738, 0)
ScrollingFrame.Size = UDim2.new(0, 403, 0, 224)
ScrollingFrame.ScrollBarImageColor3 = Color3.fromRGB(0, 0, 0)
ScrollingFrame.CanvasSize = UDim2.new(0, 0, 6, 0)

Frame.Parent = ScrollingFrame
Frame.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
Frame.BackgroundTransparency = 1
Frame.BorderColor3 = Color3.fromRGB(0, 0, 0)
Frame.BorderSizePixel = 0
Frame.Size = UDim2.new(0, 403, 1, 0)


-- In-game player list buttons


local tehbuttons = 72
local positionsX = {0.024813896, 0.362282872, 0.679900765}
local startY = 0.0043668123
local stepY = 0.0429403214
local sizeX = {112, 110, 109}
local sizeY = 43
local ingameButtons = {}

for i = 1, tehbuttons do
	local col = ((i - 1) % 3) + 1
	local row = math.floor((i - 1) / 3)

	local plrqq = Instance.new("TextButton")
	plrqq.Parent = Frame
	plrqq.BackgroundColor3 = Color3.fromRGB(60, 77, 79)
	plrqq.BorderSizePixel = 0
	plrqq.Font = Enum.Font.SourceSansLight
	plrqq.TextScaled = true
	plrqq.TextWrapped = true
	plrqq.TextColor3 = Color3.fromRGB(171, 203, 198)
	plrqq.Visible = false
	plrqq.Size = UDim2.new(0, sizeX[col], 0, sizeY)
	plrqq.Position = UDim2.new(positionsX[col], 0, startY + (row * stepY), 0)
	plrqq:SetAttribute("PlayerName", "")

	plrqq.MouseButton1Click:Connect(function()
		local name = plrqq:GetAttribute("PlayerName")
		if name ~= "" then
			Ingame.Visible = false
			CopierPage.Visible = true
			Username.Text = name
		end
	end)

	table.insert(ingameButtons, plrqq)
end

local function refreshIngameButtons()
	local plrs = Players:GetPlayers()
	for i, btn in ipairs(ingameButtons) do
		local plr = plrs[i]
		if plr then
			btn.Visible = true
			btn.Text = plr.Name
			btn:SetAttribute("PlayerName", plr.Name)
		else
			btn.Visible = false
			btn:SetAttribute("PlayerName", "")
		end
	end
end

Players.PlayerAdded:Connect(refreshIngameButtons)
Players.PlayerRemoving:Connect(refreshIngameButtons)
refreshIngameButtons()
task.spawn(function()
	while true do
		refreshIngameButtons()
		task.wait(1)
	end
end)

-- Draggable window

local function dragify(frame)
	local dragToggle, dragSpeed, dragInput, dragStart, startPos

	local function updateInput(input)
		local delta = input.Position - dragStart
		local pos = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
		TweenService:Create(frame, TweenInfo.new(dragSpeed or 0), {Position = pos}):Play()
	end

	frame.InputBegan:Connect(function(input)
		if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
			dragToggle = true
			dragSpeed = 0
			dragStart = input.Position
			startPos = frame.Position
			input.Changed:Connect(function()
				if input.UserInputState == Enum.UserInputState.End then
					dragToggle = false
				end
			end)
		end
	end)

	frame.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 dragToggle then
			updateInput(input)
		end
	end)
end

dragify(Main)


-- Live avatar-picture preview while typing


task.spawn(function()
	while true do
		local name = Username.Text
		local ok, userId = pcall(function()
			return Players:GetUserIdFromNameAsync(name)
		end)
		if ok then
			UserPFP.Image = string.format("rbxthumb://type=AvatarHeadShot&id=%s&w=420&h=420", userId)
		end
		task.wait(0.1)
	end
end)

-- R6 / R15 idle-walk-run-jump animation setup (shared, not duplicated)
local function setupR6Animate(character, humanoid)
	local animNames = {
		idle = "http://www.roblox.com/asset/?id=180435571",
		walk = "http://www.roblox.com/asset/?id=180426354",
		jump = "http://www.roblox.com/asset/?id=125750702",
		fall = "http://www.roblox.com/asset/?id=180436148",
		climb = "http://www.roblox.com/asset/?id=180436334",
		sit = "http://www.roblox.com/asset/?id=178130996",
	}

	local tracks = {}
	for name, id in pairs(animNames) do
		local anim = Instance.new("Animation")
		anim.AnimationId = id
		tracks[name] = humanoid:LoadAnimation(anim)
	end

	local current
	local function play(name)
		if current == name then return end
		if tracks[current] then tracks[current]:Stop(0.1) end
		current = name
		if tracks[name] then tracks[name]:Play(0.1) end
	end

	humanoid.Running:Connect(function(speed)
		play(speed > 0.5 and "walk" or "idle")
	end)
	humanoid.Jumping:Connect(function() play("jump") end)
	humanoid.FreeFalling:Connect(function() play("fall") end)
	humanoid.Climbing:Connect(function() play("climb") end)
	humanoid.Seated:Connect(function() play("sit") end)

	play("idle")

	task.spawn(function()
		while character.Parent do
			while humanoid.Health < humanoid.MaxHealth and character.Parent do
				task.wait(1)
				humanoid.Health = math.min(humanoid.Health + humanoid.MaxHealth * 0.01, humanoid.MaxHealth)
			end
			if not character.Parent then break end
			humanoid.HealthChanged:Wait()
		end
	end)
end

local function setupR15Animate(character, humanoid)
	local animNames = {
		idle = "http://www.roblox.com/asset/?id=507766388",
		walk = "http://www.roblox.com/asset/?id=507777826",
		jump = "http://www.roblox.com/asset/?id=507765000",
		fall = "http://www.roblox.com/asset/?id=507767968",
		climb = "http://www.roblox.com/asset/?id=507765644",
		sit = "http://www.roblox.com/asset/?id=2506281703",
	}

	local tracks = {}
	for name, id in pairs(animNames) do
		local anim = Instance.new("Animation")
		anim.AnimationId = id
		tracks[name] = humanoid:LoadAnimation(anim)
	end

	local current
	local function play(name)
		if current == name then return end
		if tracks[current] then tracks[current]:Stop(0.15) end
		current = name
		if tracks[name] then tracks[name]:Play(0.15) end
	end

	humanoid.Running:Connect(function(speed)
		play(speed > 0.75 and "walk" or "idle")
	end)
	humanoid.Jumping:Connect(function() play("jump") end)
	humanoid.FreeFalling:Connect(function() play("fall") end)
	humanoid.Climbing:Connect(function() play("climb") end)
	humanoid.Seated:Connect(function() play("sit") end)

	play("idle")
end

local function applyAnimate(character, humanoid)
	if humanoid.RigType == Enum.HumanoidRigType.R6 then
		setupR6Animate(character, humanoid)
	elseif humanoid.RigType == Enum.HumanoidRigType.R15 then
		setupR15Animate(character, humanoid)
	end
end

-- Core swap logic -- this is where the bug is actually fixed

local function LoadAvatar(targetName)
	if not targetName or targetName == "" then return end
    	-- Do not allow copying myself
	if string.lower(targetName) == string.lower(LocalPlayer.Name) then
		warn("[AvatarCopier] Không thể copy chính mình!")
		return
	end

	local ok, userId = pcall(function()
		return Players:GetUserIdFromNameAsync(targetName)
	end)

	-- Does not exist
	if not ok or not userId then
		warn("[AvatarCopier] Người dùng không tồn tại:", targetName)
		return
	end

	-- Check if banned / account deleted
	local okDesc, desc = pcall(function()
		return Players:GetHumanoidDescriptionFromUserId(userId)
	end)
	if not okDesc or not desc then
		warn("[AvatarCopier] Không thể copy (có thể bị ban hoặc account đã bị xóa):", targetName)
		return
	end

	local ok, userId = pcall(function()
		return Players:GetUserIdFromNameAsync(targetName)
	end)
	if not ok or not userId then
		warn("[AvatarCopier] Couldn't find user:", targetName)
		return
	end

	local ok2, character = pcall(function()
		return Players:CreateHumanoidModelFromUserId(userId)
	end)
	if not ok2 or not character then
		warn("[AvatarCopier] Couldn't build avatar for:", targetName)
		return
	end

	local humanoid = character:WaitForChild("Humanoid")

	-- Remove default animation
	local oldAnimate = character:FindFirstChild("Animate")
	if oldAnimate then
		oldAnimate:Destroy()
	end

	local oldChar = LocalPlayer.Character
	local position = CFrame.new(0, 5, 0)

	if oldChar and oldChar:FindFirstChild("HumanoidRootPart") then
		position = oldChar.HumanoidRootPart.CFrame
	end

	character.Name = LocalPlayer.Name
	character.Parent = workspace

	-- Set location now
	local root = character:WaitForChild("HumanoidRootPart")
	root.CFrame = position

	for _, v in ipairs(character:GetDescendants()) do
		if v:IsA("BasePart") then
			v.Anchored = false
		end
	end

	--Hide old character
	if oldChar and oldChar ~= character then
		pcall(function()
			for _, v in ipairs(oldChar:GetDescendants()) do
				if v:IsA("BasePart") then
					v.Anchored = true
					v.CanCollide = false
					v.Transparency = 1
				elseif v:IsA("Decal") then
					v.Transparency = 1
				end
			end
			local oldHumanoid = oldChar:FindFirstChildOfClass("Humanoid")
			if oldHumanoid then
				oldHumanoid.DisplayDistanceType = Enum.HumanoidDisplayDistanceType.None
			end
			oldChar.Parent = nil
		end)
	end

	LocalPlayer.Character = character

	-- Force camera + position again after 1 frame
	task.defer(function()
		if character and character.Parent then
			local hrp = character:FindFirstChild("HumanoidRootPart")
			if hrp then
				hrp.CFrame = position
			end
			workspace.CurrentCamera.CameraSubject = humanoid
			workspace.CurrentCamera.CameraType = Enum.CameraType.Custom
		end
	end)

	-- Press again after 0.15s to prevent being pulled back.
	task.delay(0.15, function()
		if character and character.Parent then
			local hrp = character:FindFirstChild("HumanoidRootPart")
			if hrp then
				hrp.CFrame = position
			end
			workspace.CurrentCamera.CameraSubject = humanoid
		end
	end)

	applyAnimate(character, humanoid)
	currentTargetName = targetName
end

local isSwapping = false

LocalPlayer.CharacterAdded:Connect(function(char)
	if currentTargetName and not isSwapping then
		isSwapping = true
		task.wait(0.3)
		LoadAvatar(currentTargetName)
		task.wait(0.5)
		isSwapping = false
	end
end)

-- Button hookups

CopierPage_2.MouseButton1Click:Connect(function()
	CopierPage.Visible = true
	Ingame.Visible = false
	Premade.Visible = false
end)

IngamePage.MouseButton1Click:Connect(function()
	CopierPage.Visible = false
	Ingame.Visible = true
	Premade.Visible = false
end)

PremadePage.MouseButton1Click:Connect(function()
	CopierPage.Visible = false
	Ingame.Visible = false
	Premade.Visible = true
end)

Copy.MouseButton1Click:Connect(function()
	LoadAvatar(Username.Text)
end)

ProjectLigma.MouseButton1Click:Connect(function() LoadAvatar("ProjectLigma") end)
UXI_302.MouseButton1Click:Connect(function() LoadAvatar("UXI_302") end)
babyoutmooooooon2o22.MouseButton1Click:Connect(function() LoadAvatar("babyoutmooooooon2o22") end)
Shedletsky.MouseButton1Click:Connect(function() LoadAvatar("Shedletsky") end)
MrDoomBringer.MouseButton1Click:Connect(function() LoadAvatar("MrDoomBringer") end)
johnnyschwehel1234.MouseButton1Click:Connect(function() LoadAvatar("johnnyschwehel1234") end)

Features & Information

copy any roblox player avatar, become skin walker ,become any one in sever new update: fix copy in little time
#fe#universal#free#nokey#keyless

Community Comments (2)

trankieuscripttrankieuscriptJan 8, 2026

like if you like it

trankieuscripttrankieuscriptJan 8, 2026

@Near404 idk

More Scripts for Universal Scripts