Hi devs, i wanted to do a “Equip Best” button for my pet UI.
I tried some of my knowledge but didn’t work.
This is my script now:
Module script:
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Remotes = ReplicatedStorage:WaitForChild("Remotes")
local PetsConfig = require(ReplicatedStorage.Config.PetsConfig)
local PetModels = ReplicatedStorage.Pets
local player = Players.LocalPlayer
local screenGui = script.Parent
local frame = screenGui.Frame
local container = frame.PetsContainer
local info = frame.Info
local stats = frame.Stats
local petInfo = info.PetInfo
local deleteInfo = info.DeleteFrame
local equippedStat = stats.Pets
local storageStat = stats.Storage
local exit = frame.ExitButton
local template = script.Template
local module = {}
module.SelectedPet = nil
module.SelectedPets = {}
module.Mode = "Default"
function module.GetRarityColor(rarity: string)
local color
if rarity == "Common" then
color = Color3.fromRGB(173, 173, 173)
elseif rarity == "Uncommon" then
color = Color3.fromRGB(9, 176, 0)
elseif rarity == "Rare" then
color = Color3.fromRGB(19, 193, 164)
elseif rarity == "Secret" then
color = Color3.fromRGB(0, 0, 0)
elseif rarity == "Premium" then
color = Color3.fromRGB(170, 85, 255)
end
return color
end
function module.equipBest(container: ScrollingFrame)
local list = container
local bestPet
local table = {}
for _, pet in ipairs(list:GetChildren()) do
if not pet:IsA("TextButton") then continue end
end
return bestPet
end
function module.GenerateViewportFrame(viewportFrame: ViewportFrame, petModel: Model)
petModel:PivotTo(CFrame.new() * CFrame.Angles(0, math.rad(180), 0))
petModel.Parent = viewportFrame
local camera = Instance.new("Camera", viewportFrame)
viewportFrame.CurrentCamera = camera
if petModel.Name == "Giant_Chicken" or "Giant_Doge" or "Neon_Agony" or "Neon_Angel" then
camera.FieldOfView = 120
camera.CFrame = CFrame.new(Vector3.new(-0.5,0,4), petModel.PrimaryPart.Position)
else
camera.FieldOfView = 10
camera.CFrame = CFrame.new(Vector3.new(-1,1,4), petModel.PrimaryPart.Position)
end
end
function module.UpdatePetStored()
local stored = #player.petInventory:GetChildren()
storageStat.Number.Text = "📦"..stored.."/"..player.petInfo.MaxStored.Value
end
function module.UpdatePetsEquipped()
local equipped = 0
for _, pet in ipairs(player.petInventory:GetChildren()) do
if pet.Equipped.Value then
equipped += 1
end
end
equippedStat.Number.Text = "🐶"..equipped.."/"..player.petInfo.MaxEquipped.Value
end
function module.DisplayPetInfo(pet: table)
local petStat = PetsConfig[pet.ID][pet.Rarity]
local petInstance = player.petInventory:FindFirstChild(pet.UUID)
petInfo.Namee.Text = pet.ID:gsub("_", " ")
petInfo.Rarity.Text = pet.Rarity
petInfo.Rarity.TextColor3 = module.GetRarityColor(pet.Rarity)
petInfo.StatsFrame.Dribbles.Text = "x"..petStat
petInfo.StatsFrame.Coins.Text = "x"..petStat
local previousModel = petInfo.ViewportFrame:FindFirstChildOfClass("Model")
if previousModel then
previousModel:Destroy()
end
local petModel = PetModels[pet.ID]:Clone()
module.GenerateViewportFrame(petInfo.ViewportFrame, petModel)
if petInstance.Equipped.Value then
petInfo.EquipBtn.Text = "Unequip"
petInfo.EquipBtn.BackgroundColor3 = Color3.fromRGB(255, 0, 4)
else
petInfo.EquipBtn.Text = "Equip"
petInfo.EquipBtn.BackgroundColor3 = Color3.fromRGB(12, 190, 2)
end
end
function module.GeneratePet(pet: table)
local clone = template:Clone()
clone.Visible = true
clone.Parent = container
clone.Name = pet.UUID
clone.Stat.Value = PetsConfig[pet.ID][pet.Rarity]
clone.Holder.PetName.Text = pet.ID:gsub("_", " ")
clone.Holder.Equipped.Visible = pet.Equipped
local petModel = PetModels[pet.ID]:Clone()
module.GenerateViewportFrame(clone.Holder.ViewportFrame, petModel)
clone.MouseButton1Click:Connect(function()
if module.Mode == "Default" then
module.SelectedPet = pet
module.DisplayPetInfo(pet)
petInfo.Visible = true
else
if table.find(module.SelectedPets, pet) then
table.remove(module.SelectedPets, table.find(module.SelectedPets, pet))
clone.Holder.Delete.Visible = false
else
table.insert(module.SelectedPets, pet)
clone.Holder.Delete.Visible = true
end
deleteInfo.Selected.Text = "Pets selected: "..#module.SelectedPets
end
end)
end
function module.PetInstanceToTable(pet: Instance)
local newpet = {}
newpet.UUID = pet.Name
newpet.ID = pet.ID.Value
newpet.Rarity = pet.Rarity.Value
newpet.Equipped = pet.Equipped.Value
return newpet
end
return module
Local script:
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Handler = require(script.Parent.Handler)
local Remotes = ReplicatedStorage:WaitForChild("Remotes")
local PetsConfig = require(ReplicatedStorage.Config.PetsConfig)
local PetModels = ReplicatedStorage.Pets
local player = Players.LocalPlayer
local screenGui = script.Parent
local frame = screenGui.Frame
local container = frame.PetsContainer
local info = frame.Info
local warning = frame.Warn
local multiDelete = frame.MultiDeleteBtn
local deleteInfo = info.DeleteFrame
local confBtn = deleteInfo.ConfirmBtn
local petInfo = info.PetInfo
local equipBtn = petInfo.EquipBtn
local deleteButton = petInfo.DeleteButton
local exit = frame.ExitButton
--local template = script.Template
for _, pet in ipairs(player.petInventory:GetChildren()) do
local petTable = Handler.PetInstanceToTable(pet)
Handler.GeneratePet(petTable)
end
Handler.UpdatePetsEquipped()
Handler.UpdatePetStored()
equipBtn.MouseButton1Click:Connect(function()
if not Handler.SelectedPet then return end
local result = Remotes.PetEquip:InvokeServer(Handler.SelectedPet.UUID)
if not result then return end
local petTemplateInstance = container:FindFirstChild(Handler.SelectedPet.UUID)
if result == "Equipped" then
petInfo.EquipBtn.Text = "Unequip"
petInfo.EquipBtn.BackgroundColor3 = Color3.fromRGB(255, 0, 4)
petTemplateInstance.Holder.Equipped.Visible = true
Handler.UpdatePetsEquipped()
elseif result == "Unequipped" then
petInfo.EquipBtn.Text = "Equip"
petInfo.EquipBtn.BackgroundColor3 = Color3.fromRGB(12, 190, 2)
petTemplateInstance.Holder.Equipped.Visible = false
Handler.UpdatePetsEquipped()
elseif result == "Full" then
warning.Visible = true
task.delay(3, function()
warning.Visible = false
end)
end
end)
deleteButton.MouseButton1Click:Connect(function()
if not Handler.SelectedPet then return end
Remotes.PetDelete:FireServer(Handler.SelectedPet.UUID)
local petTemplateInstance = container:FindFirstChild(Handler.SelectedPet.UUID)
petTemplateInstance:Destroy()
petInfo.Visible = false
task.delay(.01, function()
Handler.UpdatePetStored()
Handler.UpdatePetsEquipped()
end)
end)
multiDelete.MouseButton1Click:Connect(function()
Handler.SelectedPet = nil
Handler.SelectedPets = {}
if Handler.Mode == "Default" then
Handler.Mode = "Delete"
petInfo.Visible = false
deleteInfo.Visible = true
deleteInfo.Selected.Text = "Pets Selected: 0"
else
Handler.Mode = "Default"
petInfo.Visible = true
deleteInfo.Visible = false
for _, pet in ipairs(container:GetChildren()) do
if not pet:IsA("TextButton") then continue end
pet.Holder.Delete.Visible = false
end
end
end)
confBtn.MouseButton1Click:Connect(function()
for _, pet in ipairs(Handler.SelectedPets) do
Remotes.PetDelete:FireServer(pet.UUID)
local petTemplateInstance = container:FindFirstChild(pet.UUID)
petTemplateInstance:Destroy()
end
deleteInfo.Visible = false
Handler.Mode = "Default"
task.delay(.01, function()
Handler.UpdatePetStored()
Handler.UpdatePetsEquipped()
end)
end)
exit.MouseButton1Click:Connect(function()
screenGui.Enabled = not screenGui.Enabled
end)
Remotes.PetHatched.OnClientEvent:Connect(function(player: Player, pet: table, petInstance: Instance)
local petTable = Handler.PetInstanceToTable(pet)
Handler.GeneratePet(petTable)
Handler.UpdatePetStored()
end)
frame.EquipBest.TextButton.MouseButton1Click:Connect(function()
Handler.equipBest(container)
end)
Thanks!