Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
✓ ANSWER ACCEPTED

Why does it say "Attempt to index r (a nil value)" when i literally did it the line above?

This right here is the same script that i had a question with than yesterday, so if you think this seems familiar, thats why. So back to the problem, On Line 30 it says "Attempt to index r (a nil value)" but i literally did that a line before. Heres the script. Its (again) a script similar to Jailbreaks / Murder Mystery 2's Loot Boxes

 local m = {}

--get item
local items = require(game.ReplicatedStorage.Items)

---variables
local player = game.Players.LocalPlayer
local gui = player("WaitForChild","PlayerGui")
local ui = gui("WaitForChild","Ui")
local elements = gui("WaitForChild","Elements")

--function
	function m.getRarity(type)
		for a,b in ipairs(items.Rarities) do
			if b.name==type then
				return b
			end
		end
	end
	
	function m.createItem()
		local object = elements("WaitForChild","item"):Clone()
		local scaledSize = math.floor((object.Size.X.Scale*m.settings.cUI.AbsoluteSize.Y)+0.5)/m.settings.cUI.AbsoluteSize.X
		--Get / Set Types
		local types = {}
		for a,b in ipairs(m.settings.case.items) do
			for d,c in ipairs(items.Items) do
				if c.name==b then
					local r = m:getRarity(c.rarityType)
					for t=1,r.rarity*10 do
						table.insert(types,c)
					end
				end
			end
		end
		--select item
		local item = types[m.settings.prng:NextInteger(1,#types)]
		local itemType = m:getRarity(item.rarityType)
		
		--set other properties
		object.BorderColor3 = itemType.Color
		object.rarityMark.BackgroundColor3 = itemType.Color
		object.Name = item.name
		object.itemImage = "rbxassetid//"..item.imageID
		
		--set position
		object.Position = (m.settings.lastObject and
			m.settings.lastObject.Position+UDim2.new(scaledSize,0,0,0)+m.settings.offset) or UDim2.new(-scaledSize/2,0,0.5,0)
		--set parent
		object.parent = m.settings.cUI
		
		--set few variables
		m.settings.lastObject = object
		table.insert(m.settings.objects, object)
	end
	
	function m:check()
		for a,b in ipairs(m.settings.objects)do
			local scaledSize = b.AbsoluteSize
			if b.AbsolutePosition.X <= -scaledSize.x+m.settings.offset.X.Offset then
				table.remove(m.settings.objects,a)
				b:Destroy()
				m.createItem()
				m.check()
				break
			end
		end
	end
	
	function m:update()
		m.settings.speed = math.max(m.settings.speed-(0.03/m.settings.spinLength),0)
		m.settings.newAccel = m.settings.accel*math.sin((math.pi/2)*m.settings.speed)
		for a,b in ipairs(m.settings.objects)do
			b.Position = b.Position-UDim2.new(m.settings.newAccel/m.settings.cUI.AbsoluteSize.X,0,0,0)
		end
		if m.settings.newAccel==0 then m:result() end
	end
	
	function m:result()
		--disconnect
		m.render:disconnect()
		
		--get selected item
		local item
		for a,b in ipairs(m.settings.objects) do
			local left,right = b.AbsolutePosition.X/m.settings.cUI.AbsoluteSize.X,(b.AbsolutePosition.X+b.AbsoluteSize.X)/m.settings.cUI.AbsoluteSize.X
			if left <=0.5 and right >=0.5 then item=b break end
		end
		if item then
			m.newResult = item
		else
			local closestItems = {}
			for a,b in ipairs(m.settings.objects) do
				table.insert(closestItems,{
				mag=(Vector2.new(b.AbsolutePosition.X/m.settings.cUI.AbsoluteSize.X,0)-Vector2.new(0.5,0)).magnitude;
				item=b;
				})
			end
			table.sort(closestItems,function(a,b) return a.mag<b.mag end)
			m.newResult = closestItems[1].item
		end
	end
	
	function m:create(caseType)
		--Setings
		m.settings = {
			case=items.Cases[caseType];
			cUI=elements("WaitForChild","caseUI"):Clone();
			objects={};
			prng=Random.new();
			offset=UDim2.new(0,25,0,0);
			accel=30;
			speed=1;
			spinLength=5;
		}
		m.newResult=nil
		
		--presetup
		m.settings.cUI.Parent = ui
		for t=1,15 do
			m:createItem()
		end
		--services
		m.render = game("GetService","RunService").RenderStepped:connect(function()
			m:update()
			m:check()
		end)
		
		--wait for result
		repeat wait() until m.newResult
		
		--getrid of Ui
		spawn(function()
			wait(1)
			m.settings.cUI.TweenPosition(UDim2.new(0,0,1.15,0),"Out","Sine",1,true,function() m.settings.cUI:Destroy() end)
		end)

--return result
return m.newResult
	end
	
	return m

If you need more things for example my workspace, put it in the comments and ill give.

1 comment

0

You mean you copied the script from them?

1 answer

✓ Accepted answer

This should be obvious. getRarity() function sometimes simply does not return anything (no rarities?). You need to write exception, or rewrite getRarity function:

local r = m:getRarity(c.rarityType)
if r then
	for t=1,r.rarity*10 do
	table.insert(types,c)
else --r = nil
	--some stuff to do here when there are no "rarities"
end

This discussion is preserved as it was. New answers, comments, and votes are closed.