I have a chest unlocking system. Here is the code. unlock is the BillboardGui shown while unlocking. items is a table of items the chest can pick from.
local plr = script.Parent.Parent.Parent.Parent.Parent
local data = plr:WaitForChild("PlayerData")
local DS = game:GetService("DataStoreService"):GetDataStore("GameData")
local purchases = DS:GetAsync("ShovelsBought")
local itemdata = script.Parent.Parent.Parent.Items:FindFirstChild(script.Parent.Parent.itemName.Value)
script.Parent.MouseButton1Click:connect(function()
if data.Leaderstats.Currency.Value >= itemdata.Price.Value then
purchases = purchases + 1
DS:SetAsync("ShovelsBought",purchases)
purchases = DS:GetAsync("ShovelsBought")
data.Leaderstats.Currency.Value = data.Leaderstats.Currency.Value - itemdata.Price.Value
-- For use with shovels. This part works fine. Scroll to the line where it says itemdata.Type.Value == "Crate".
if itemdata.Type.Value == "Shovel" or itemdata.Type.Value == "Trail" then
local newitem = data.Inventory.Basic:Clone()
newitem.Name = script.Parent.Parent.itemName.Value
newitem.Value = true
newitem.Parent = data.Inventory
local scr = script.Parent.Parent.Parent.Frame.Scripts.Equip:Clone()
scr.Parent = script.Parent
scr.Disabled = false
script.Parent.Text = "Equip"
script:Destroy()
elseif itemdata.Type.Value == "Crate" then --Starts here.
local items = {} --Table for containing possible chest items
for _,v in pairs(itemdata:GetChildren()) do
if v.Name == "ChestItem" then
table.insert(items,v) --Inserts all chest items into the table.
end
end
local unlock = game.ServerStorage.UnlockingIcon:Clone() --Makes the Billboardgui
unlock.Parent = plr.Character.Head
--[[for i = 1,12 do --Temporarily noted. This works fine.
print("0a"..i)
unlock.ExtentsOffset = unlock.ExtentsOffset + Vector3.new(0,0.5,0)
wait(0.2)
end]]
local runs = 0
for i = 1,30 do --This is where problem starts.
local tempitem = items[math.random(1,#items)].Value
runs = runs +1
unlock.Frame.ItemImg.Image = "rbxassetid://"..tempitem.ImageId.Value
print(runs)
wait(0.15)
end
print(2)
end
end
end)
The problem is, the loop is randomly stopping, and stopping the rest of the script. I added runs for debugging purposes, and each time I run it, I see it stop at a random number, then the rest of the script doesn't run.
For instance: Run 1 output:
1
2
3
4
5
Run 2 output:
1
2
3
Etc. Any help?

1 comment
It sounds like a nil-value-access, but I would expect it to give an error in that case (which you don't mention). Right after "runs = runs + 1", put in "print(tmpItem, tmpItem and tmpItem.ImageId, tmpItem and tmpItem.ImageId and tmpItem.ImageId.Value)". If it prints out 'nil' anywhere, that's the problem.