local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") -- Create RemoteEvents for chatting and switching local cloneChat = Instance.new("RemoteEvent", ReplicatedStorage) cloneChat.Name = "CloneChat" local switchClone = Instance.new("RemoteEvent", ReplicatedStorage) switchClone.Name = "SwitchClone" -- Store clone info per player local playerClones = {} Players.PlayerAdded:Connect(function(player) player.CharacterAdded:Connect(function(character) wait(1) -- Clone character local clone = character:Clone() clone.Name = player.Name .. "_Clone" clone.Parent = workspace -- Make parts non-collidable for _, part in ipairs(clone:GetDescendants()) do if part:IsA("BasePart") then part.Anchored = true part.CanCollide = false end end -- Add chat label to clone's head local cloneHead = clone:FindFirstChild("Head") local label if cloneHead then local gui = Instance.new("BillboardGui", cloneHead) gui.Size = UDim2.new(0, 200, 0, 50) gui.StudsOffset = Vector3.new(0, 2, 0) gui.AlwaysOnTop = true label = Instance.new("TextLabel", gui) label.Size = UDim2.new(1, 0, 1, 0) label.BackgroundTransparency = 1 label.TextColor3 = Color3.new(1, 1, 1) label.TextScaled = true label.Text = "" end playerClones[player] = { clone = clone, original = character, chatLabel = label } end) end) -- Handle clone chatting cloneChat.OnServerEvent:Connect(function(player, message) local info = playerClones[player] if info and info.chatLabel then info.chatLabel.Text = message end end) -- Handle switching character to clone switchClone.OnServerEvent:Connect(function(player) local info = playerClones[player] if info and info.clone then player.Character = info.clone end end) -- Optional: reset back to original on death or leave Players.PlayerRemoving:Connect(function(player) playerClones[player] = nil end)