You can write your topic however you want, but you need to answer these questions:
What do you want to achieve?
A craft all button for a pet system!
What is the issue?
The issue is that it keeps giving me an error!
What solutions have you tried so far?
Finding a solution!
wait(1);
local l__Pets__1 = game.Players.LocalPlayer:WaitForChild("Pets");
script.Parent.EquipButton.MouseButton1Click:Connect(function()
for v1, v2 in pairs(l__Pets__1:GetChildren()) do
spawn(function()
if v2.Type.Value ~= "Amazing" then
game:GetService("ReplicatedStorage").RemoteEvents:WaitForChild("PetActionRequest"):InvokeServer(unpack({ "Craft", {
PetID = v2.PetID.Value
} }));
end;
end);
end;
end);
local TS = game:GetService("TweenService")
local MS = game:GetService("MarketplaceService")
local RS = game.ReplicatedStorage
local Library = RS.Pets
local Eggs = require(Library:WaitForChild("Eggs"))
local RemoteEvents = RS.RemoteEvents
local EggModels = workspace.Eggs
local PlayerDebounce = {}
function ChoosePet(Egg)
local Data = Eggs[Egg]
local Pets = Data["Pets"]
local TotalWeight = 0
for i,v in pairs(Pets) do
TotalWeight = TotalWeight + v.Rarity
end
local Chance = math.random(1,TotalWeight)
local Counter = 0
for i,v in pairs(Pets) do
Counter = Counter+v.Rarity
if Counter >= Chance then
return v.Name
end
end
end
function totalPets(Player)
local Pets = 0
for i,v in pairs(Player.Pets:GetChildren()) do
Pets = Pets + 1
end
return Pets
end
function RandomID(Player)
local Rand = math.random(2,1000000)
for i,v in pairs(Player.Pets:GetChildren()) do
if v.PetID.Value == Rand then
return RandomID()
end
end
return Rand
end
function singleEgg(Player, Egg)
local Data = Eggs[Egg]
local Cost = Data["Cost"]
local Currency = Data["Currency"]
local Pets = Data["Pets"]
local PetChosen = ChoosePet(Egg)
local Settings = RS.Pets.Models:FindFirstChild(PetChosen).Settings
if Currency ~= "R$" then
Player.leaderstats:FindFirstChild(Currency).Value = Player.leaderstats:FindFirstChild(Currency).Value - Cost
end
for i,v in pairs(PlayerDebounce) do
if v[1] == Player.Name then
v[2] = true
end
end
spawn(function()
wait(3.2)
for i,v in pairs(PlayerDebounce) do
if v[1] == Player.Name then
v[2] = false
end
end
end)
for i,v in pairs(Pets) do
if v.Name == PetChosen then
local Clone = RS.Pets.PetFolderTemplate:Clone()
Clone.PetID.Value = RandomID(Player)
Clone.Multiplier1.Value = Settings.Multiplier1.Value
Clone.Multiplier2.Value = Settings.Multiplier2.Value
Clone.Type.Value = v.Type
Clone.Parent = Player.Pets
Clone.Name = PetChosen
end
end
return PetChosen
end
function tripleEgg(Player, Egg)
local Data = Eggs[Egg]
local Cost = Data["Cost"]
local Currency = Data["Currency"]
local Pets = Data["Pets"]
local PetsChosen = {}
Player.leaderstats:FindFirstChild(Currency).Value = Player.leaderstats:FindFirstChild(Currency).Value - Cost * 3
for i,v in pairs(PlayerDebounce) do
if v[1] == Player.Name then
v[2] = true
end
end
spawn(function()
wait(3.2)
for i,v in pairs(PlayerDebounce) do
if v[1] == Player.Name then
v[2] = false
end
end
end)
for i = 1,3 do
local PetChosen = ChoosePet(Egg)
local Settings = RS.Pets.Models:FindFirstChild(PetChosen).Settings
for i,v in pairs(Pets) do
if v.Name == PetChosen then
local Clone = RS.Pets.PetFolderTemplate:Clone()
Clone.PetID.Value = RandomID(Player)
Clone.Multiplier1.Value = Settings.Multiplier1.Value
Clone.Multiplier2.Value = Settings.Multiplier2.Value
Clone.Type.Value = v.Type
Clone.Parent = Player.Pets
Clone.Name = PetChosen
PetsChosen[#PetsChosen + 1] = PetChosen
end
end
end
return PetsChosen
end
function UnboxEgg(Player, Egg, Type)
if Eggs[Egg] ~= nil then
local Data = Eggs[Egg]
local Cost = Data["Cost"]
local Currency = Data["Currency"]
local Pets = Data["Pets"]
local Model = EggModels:FindFirstChild(Egg)
local Debounce = false
for i,v in pairs(PlayerDebounce) do
if v[1] == Player.Name then
Debounce = v[2]
end
end
if (Player.Character.HumanoidRootPart.Position - Model.UIanchor.Position).Magnitude <= 10 then
if not Debounce then
if Currency ~= "R$" then
if Type == "Single" then
if Player.leaderstats:FindFirstChild(Currency).Value >= Cost then
if totalPets(Player) < Player.Data.MaxStorage.Value then
local PetChosen = singleEgg(Player, Egg)
return PetChosen
else
return "Error", "Not Enough Inventory Room"
end
else
return "Error", "Insufficient Currency"
end
elseif Type == "Triple" then
if Player.leaderstats:FindFirstChild(Currency).Value >= Cost * 3 then
if totalPets(Player) < Player.Data.MaxStorage.Value - 2 then
if Player.Data.TripleEggOwned.Value == true then
local PetsChosen = tripleEgg(Player, Egg)
return PetsChosen
else
return "Error", "Player Doesn't Own Gamepass"
end
else
return "Error", "Not Enough Inventory Room"
end
else
return "Error", "Insufficient Currency"
end
elseif Type == "Auto" then
if Player.Data.AutoEggOwned.Value == true then
if Player.Data.TripleEggOwned.Value == true then
if Player.leaderstats:FindFirstChild(Currency).Value >= Cost * 3 then
if totalPets(Player) < Player.Data.MaxStorage.Value - 2 then
if Player.Data.TripleEggOwned.Value == true then
local PetsChosen = tripleEgg(Player, Egg)
return PetsChosen
else
return "Error", "Player Doesn't Own Gamepass"
end
else
return "Error", "Not Enough Inventory Room"
end
else
return "Error", "Insufficient Currency"
end
else
if Player.leaderstats:FindFirstChild(Currency).Value >= Cost then
if totalPets(Player) < Player.Data.MaxStorage.Value then
local PetChosen = singleEgg(Player, Egg)
return PetChosen
else
return "Error", "Not Enough Inventory Room"
end
else
return "Error", "Insufficient Currency"
end
end
else
return "Error", "Player Doesn't Own Gamepass"
end
end
else
if totalPets(Player) < Player.Data.MaxStorage.Value then
return "Error", "Robux Purchase"
else
return "Error", "Not Enough Inventory Room"
end
end
end
else
return "Error", "Too far away"
end
end
end
game.Players.PlayerAdded:Connect(function(plr)
PlayerDebounce[#PlayerDebounce + 1] = {plr.Name, false}
end)
game.Players.PlayerRemoving:Connect(function(plr)
for i,v in pairs(PlayerDebounce) do
if v[1] == plr.Name then
v = nil
end
end
end)
for i,v in pairs(Eggs) do
local ProductID = v["ProductID"]
if ProductID ~= nil then
MS.ProcessReceipt = function(ReceiptInfo)
local Player = game:GetService("Players"):GetPlayerByUserId(ReceiptInfo.PlayerId)
if ReceiptInfo.ProductId == ProductID then
spawn(function()
local Result = singleEgg(Player, i)
RS.RemoteEvents.EggOpened:InvokeClient(Player, Eggs[i], Result)
end)
return Enum.ProductPurchaseDecision.PurchaseGranted
end
end
end
end
RS.RemoteEvents.EggOpened.OnServerInvoke = UnboxEgg
Not entirely sure that this is the issue but I suspect you may be running into a race condition here where v2 is nil once your spawn actually runs. Seems to me like this is not a good scenario to be using a RemoteFunction instead I would use a RemoteEvent as this is non-blocking and you will no longer need that spawn.
spawn doesn’t always run right away, it is a deferred function and will run when there is processing time available. So it’s entirely possible that by the time the spawn runs v2 no longer exists.
Here’s a screenshot of the documentation for spawn
Use what? The RemoteEvent? Just replace your RemoteFunction with a RemoteEvent and change :InvokeServer to :FireServer and change how the event is handled on the server to .OnClientEvent instead of .OnClientInvoke
The first script you posted would look like this:
wait(1);
local l__Pets__1 = game.Players.LocalPlayer:WaitForChild("Pets");
script.Parent.EquipButton.MouseButton1Click:Connect(function()
for v1, v2 in pairs(l__Pets__1:GetChildren()) do
if v2.Type.Value ~= "Amazing" then
game:GetService("ReplicatedStorage").RemoteEvents:WaitForChild("PetActionRequest"):FireServer(unpack({ "Craft", {
PetID = v2.PetID.Value
} }));
end;
end;
end);