Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Why does it say "attempt to index" even tough i defined it?

Asked by 4 years ago
Edited 4 years ago

Yep its this script for the THIRD time, and i think this time i will comment and not create a fourth post for this script. This time, it says "attempt to inde item" even tough i defined it. so i had the same problem on the last post, but that fix couldnt fix this one.

Problem is on Line 44

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)
                    if r then
                    for t=1,r.rarity*10 do
                        table.insert(types,c)
                    if not r
                    then  --r = nil
                        print "None"
                        end
                        end
                    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
0
Give the exact error. Lua errors never only say "attempt to index", they say what you attempted to index as well. User#24403 69 — 4y
0
Just because you doesn't define it doesn't necessarily mean it won't point to nil. You can define nil and attempt to index it, which will lead to a nasty error. Check if the index you are looking for is in the table first by using a conditional statement, if (item) then, then continue with your code.e Fifkee 2017 — 4y

Answer this question