Attempt to index nil with 'Type'

You can write your topic however you want, but you need to answer these questions:

  1. What do you want to achieve?

A craft all button for a pet system!

  1. What is the issue?

The issue is that it keeps giving me an error!

  1. 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);

The error is on this line

if v2.Type.Value ~= "Amazing" then

Thank you in advance!

  1. Could we possibly get the error? We cannot give you help without seeing the error

https://gyazo.com/3d8c9ae4bb44a347678b88eca427af53

Could you send the server script?

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

This was the line that was causing the error. The object “Type” was not found and it caused the error.
Make sure Type isn’t nil.

Should I do

if v2.Type.Value == "Amazing" then
1 Like

No, it’s the same thing. You should do:

local Type = v2:FindFirstChild("Type")
if Type then
-- your code here
end

This still might not be the fix as if Type for some reason is nil it wont work.

It still gives me an error on line 10 which is

game:GetService("ReplicatedStorage").RemoteEvents:WaitForChild("PetActionRequest"):InvokeServer(unpack({ "Craft", {

Send the image of the error, I cannot assist you without it.

image

i seriously dont know what could be the issue at this point. sorry

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

I don’t understand how I could use it in that script?

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);

This still doesn’t work for some reason!

Same error still? Or is it something new now?

Its basically same error I don’t even know why

So it’s still attempt to index nil with 'Type'?