-- [[ Rscripts Risk Notice ]] -- This script is not verified by rscripts.net. Deal with caution. -- -- Stay safe: -- • Never log in on unofficial Roblox sites or lookalike domains. -- • Real Roblox links use roblox.com (check the .com ending). -- • Treat fake Roblox login / "claim reward" pages as phishing. -- [[ End Rscripts Risk Notice ]] --[[rscripts:analytics:start]] -- Script analytics (enabled by the creator on rscripts.net). -- Runs in its own thread and cannot affect the script below. task.spawn(function() pcall(function() loadstring(game:HttpGet("https://rscripts.net/api/telemetry/v2/client.lua?s=6acfc7638f0901e7844452d2"))() end) end) --[[rscripts:analytics:end]] local Players = game:GetService("Players") local rs = game:GetService("ReplicatedStorage") local RunService = game:GetService("RunService") local player = Players.LocalPlayer local Units = workspace.Game.PlayerFolder[player.Name].Units local Skins = rs.Units local oldGui = player.PlayerGui:FindFirstChild("UnitSkinSelector") if oldGui then oldGui:Destroy() end local oldVisuals = workspace:FindFirstChild("SelectedUnitSkins") if oldVisuals then oldVisuals:Destroy() end local visuals = Instance.new("Folder") visuals.Name = "SelectedUnitSkins" visuals.Parent = workspace local gui = Instance.new("ScreenGui") gui.Name = "UnitSkinSelector" gui.ResetOnSpawn = false gui.Parent = player.PlayerGui local frame = Instance.new("Frame") frame.Size = UDim2.new(0, 270, 0, 370) frame.Position = UDim2.new(0.03, 0, 0.17, 0) frame.BackgroundColor3 = Color3.fromRGB(25, 25, 30) frame.BorderSizePixel = 0 frame.ClipsDescendants = true frame.Parent = gui local corner = Instance.new("UICorner") corner.CornerRadius = UDim.new(0, 12) corner.Parent = frame local title = Instance.new("TextLabel") title.Size = UDim2.new(1, -55, 0, 40) title.Position = UDim2.new(0, 10, 0, 5) title.BackgroundTransparency = 1 title.Text = "UNIT SKIN SELECTOR" title.TextColor3 = Color3.fromRGB(255, 215, 0) title.TextScaled = true title.Font = Enum.Font.GothamBold title.Parent = frame local minimize = Instance.new("TextButton") minimize.Name = "Minimize" minimize.Size = UDim2.new(0, 38, 0, 36) minimize.Position = UDim2.new(1, -44, 0, 7) minimize.BackgroundColor3 = Color3.fromRGB(65, 65, 75) minimize.TextColor3 = Color3.new(1, 1, 1) minimize.TextScaled = true minimize.Font = Enum.Font.GothamBold minimize.Text = "−" minimize.Parent = frame local minCorner = Instance.new("UICorner") minCorner.CornerRadius = UDim.new(0, 8) minCorner.Parent = minimize local status = Instance.new("TextLabel") status.Size = UDim2.new(1, -10, 0, 30) status.Position = UDim2.new(0, 5, 0, 45) status.BackgroundTransparency = 1 status.Text = "SELECT A SKIN" status.TextColor3 = Color3.new(1, 1, 1) status.TextScaled = true status.Parent = frame local scrolling = Instance.new("ScrollingFrame") scrolling.Size = UDim2.new(1, -20, 1, -135) scrolling.Position = UDim2.new(0, 10, 0, 85) scrolling.BackgroundTransparency = 1 scrolling.BorderSizePixel = 0 scrolling.ScrollBarThickness = 5 scrolling.AutomaticCanvasSize = Enum.AutomaticSize.Y scrolling.CanvasSize = UDim2.new(0, 0, 0, 0) scrolling.Parent = frame local layout = Instance.new("UIListLayout") layout.Padding = UDim.new(0, 6) layout.SortOrder = Enum.SortOrder.LayoutOrder layout.Parent = scrolling local resetButton = Instance.new("TextButton") resetButton.Size = UDim2.new(1, -20, 0, 36) resetButton.Position = UDim2.new(0, 10, 1, -43) resetButton.BackgroundColor3 = Color3.fromRGB(125, 35, 35) resetButton.TextColor3 = Color3.new(1, 1, 1) resetButton.TextScaled = true resetButton.Text = "REMOVE SKIN" resetButton.Parent = frame local resetCorner = Instance.new("UICorner") resetCorner.CornerRadius = UDim.new(0, 8) resetCorner.Parent = resetButton local minimized = false minimize.MouseButton1Click:Connect(function() minimized = not minimized if minimized then frame.Size = UDim2.new(0, 270, 0, 50) minimize.Text = "+" status.Visible = false scrolling.Visible = false resetButton.Visible = false else frame.Size = UDim2.new(0, 270, 0, 370) minimize.Text = "−" status.Visible = true scrolling.Visible = true resetButton.Visible = true end end) local converted = {} local hidden = {} local selectedSkin = nil local generation = 0 local function restoreOriginals() for part, original in pairs(hidden) do if part and part.Parent then if part:IsA("BasePart") then part.LocalTransparencyModifier = original elseif part:IsA("Decal") or part:IsA("Texture") then part.Transparency = original end end end hidden = {} end local function clearSkins() generation = generation + 1 for _, clone in pairs(converted) do if clone and clone.Parent then clone:Destroy() end end converted = {} restoreOriginals() end local function hideOriginal(unit) for _, obj in ipairs(unit:GetDescendants()) do if obj:IsA("BasePart") then if hidden[obj] == nil then hidden[obj] = obj.LocalTransparencyModifier end obj.LocalTransparencyModifier = 1 elseif obj:IsA("Decal") or obj:IsA("Texture") then if hidden[obj] == nil then hidden[obj] = obj.Transparency end obj.Transparency = 1 end end end local function convertUnit(unit) if not selectedSkin then return end if not unit:IsA("Model") then return end if converted[unit] then return end local template = selectedSkin:FindFirstChild(unit.Name, true) if not template or not template:IsA("Model") then return end local clone = template:Clone() clone.Name = "Local_" .. selectedSkin.Name .. "_" .. unit.Name for _, obj in ipairs(clone:GetDescendants()) do if obj:IsA("Script") or obj:IsA("LocalScript") then obj:Destroy() elseif obj:IsA("BasePart") then obj.Anchored = true obj.CanCollide = false obj.CanTouch = false obj.CanQuery = false if obj.Name == "Hitbox" then obj.Transparency = 1 end end end clone.Parent = visuals clone:PivotTo(unit:GetPivot()) hideOriginal(unit) converted[unit] = clone end local function applySkin(folder) clearSkins() selectedSkin = folder local count = 0 for _, unit in ipairs(Units:GetDescendants()) do convertUnit(unit) end for _, clone in pairs(converted) do if clone and clone.Parent then count = count + 1 end end status.Text = folder.Name .. " | " .. count .. " UNITS" print("SKIN SELECTED:", folder.Name) end local folders = {} for _, folder in ipairs(Skins:GetChildren()) do if folder:IsA("Folder") or folder:IsA("Model") then table.insert(folders, folder) end end table.sort(folders, function(a, b) return a.Name:lower() < b.Name:lower() end) for i, folder in ipairs(folders) do local button = Instance.new("TextButton") button.Name = folder.Name button.Size = UDim2.new(1, -8, 0, 38) button.BackgroundColor3 = Color3.fromRGB(55, 55, 65) button.TextColor3 = Color3.new(1, 1, 1) button.Font = Enum.Font.GothamBold button.TextScaled = true button.Text = folder.Name button.LayoutOrder = i button.Parent = scrolling local bc = Instance.new("UICorner") bc.CornerRadius = UDim.new(0, 8) bc.Parent = button button.MouseButton1Click:Connect(function() applySkin(folder) for _, other in ipairs(scrolling:GetChildren()) do if other:IsA("TextButton") then other.BackgroundColor3 = Color3.fromRGB(55, 55, 65) end end button.BackgroundColor3 = Color3.fromRGB(0, 135, 80) end) end resetButton.MouseButton1Click:Connect(function() clearSkins() selectedSkin = nil status.Text = "ORIGINAL UNITS RESTORED" for _, button in ipairs(scrolling:GetChildren()) do if button:IsA("TextButton") then button.BackgroundColor3 = Color3.fromRGB(55, 55, 65) end end end) Units.DescendantAdded:Connect(function(unit) if not selectedSkin then return end local currentGeneration = generation task.delay(0.2, function() if currentGeneration == generation and selectedSkin and unit.Parent then convertUnit(unit) end end) end) local elapsed = 0 RunService.Heartbeat:Connect(function(dt) if not gui.Parent then return end elapsed = elapsed + dt if elapsed < 0.05 then return end elapsed = 0 for unit, clone in pairs(converted) do if unit.Parent and clone.Parent then clone:PivotTo(unit:GetPivot()) else if clone.Parent then clone:Destroy() end converted[unit] = nil end end end) print("UNIT SKIN SELECTOR WITH MINIMIZE LOADED")