I get the error attempt to call local "xpLvlTable" (a table value) and I have a metatable inside the table that is activated with __call when the table is called
'Script'
-- Variables
local xp_lvlDataStore = game:GetService('DataStoreService'):GetDataStore('xp/lvlStore')
local repStorage = game:GetService('ReplicatedStorage')
local xpChanger = repStorage:WaitForChild('Xp_LvlChanged')
local xpToAdd = 5
local part = script.Parent
local maxLvl = 350
-- Events
pcall(part.ClickDetector.MouseClick:Connect(function(plr)
local key = 'Player-'..plr.UserId
local xpLvlTable = xp_lvlDataStore:GetAsync(key)
-- Fire to player
xpChanger:FireClient(plr,xpToAdd)
-- Sends added xp then saves
xpLvlTable(xpToAdd)
end))
It errors on line 16
'Table'
-- sets the xp to 0 if plr is new
local xpLvlTable = {0,0}
local LvlHandler = {
-- Fired when xpLvlTable is called
__call = function(xpLvlTable,xpToAdd)
-- Gets current lvl and xp
local curLvl = xpLvlTable[2]
local newXp = xpLvlTable[1] + xpToAdd
-- Checks if you lvled up
if curLvl == 0 and newXp >= 10 then
print('FIRST LVL UP')
local newXp = newXp - 10
-- Checks if can lvl up again
for i = curLvl,350 do
if i == 350 then
table.remove(xpLvlTable,1)
table.insert(xpLvlTable,1,0)
table.remove(xpLvlTable,2)
table.insert(xpLvlTable,2,350)
elseif newXp - (10*i) < 0 then
-- Sets xp + lvl in the table then saves
table.remove(xpLvlTable,1)
table.insert(xpLvlTable,1,newXp)
table.remove(xpLvlTable,2)
table.insert(xpLvlTable,2,i)
xp_lvl_DataStore:SetAsync(key,xpLvlTable)
break
else
newXp = newXp - (10*i)
end
end
elseif curLvl == 350 then
print('MAX LVL')
-- Sets xp + lvl in xpLvlTable then saves
table.remove(xpLvlTable,1)
table.insert(xpLvlTable,1,0)
xp_lvl_DataStore:SetAsync(key,xpLvlTable)
elseif newXp >= 10*curLvl then
print('LVL UP')
-- Gets current lvl and xp
local curLvl = xpLvlTable[2]
local newXp = xpLvlTable[1] + xpToAdd
-- Checks if you lvled up
local newXp = newXp - 10*curLvl
-- Checks if can lvl up again
for i = curLvl,350 do
if i == 350 then
table.remove(xpLvlTable,1)
table.insert(xpLvlTable,1,0)
table.remove(xpLvlTable,2)
table.insert(xpLvlTable,2,350)
elseif newXp - (10*i) < 0 then
-- Sets xp + lvl in the xpLvlTable then saves
table.remove(xpLvlTable,1)
table.insert(xpLvlTable,1,newXp)
table.remove(xpLvlTable,2)
table.insert(xpLvlTable,2,i)
xp_lvl_DataStore:SetAsync(key,xpLvlTable)
break
else
newXp = newXp - (10*i)
end
end
else
print('NO LVL')
-- Sets xp then saves
table.remove(xpLvlTable,1)
table.insert(xpLvlTable,1,newXp)
xp_lvl_DataStore:SetAsync(key,xpLvlTable)
end
end
}
setmetatable(xpLvlTable,LvlHandler)
xp_lvl_DataStore:SetAsync(key,(xpLvlTable))
return xp_lvl_DataStore:GetAsync(key)
end
end

3 comments
Is this two seperate scripts? If so when you assign xpLvlTable to xp_lvlDataStore:GetAsync(key) on line 12, GetAsync(key) returns Variant. A Variant can refer to multiple types of data like tables, strings, numbers, etc... So you don't know what exactly you are returning there so that's wrong. Also you are in a seperate script so even if you do return a table you never setmetatable in that script.
You should use a module script so you can return a table with a metatable already set.
So returns a table and does the actions and sets the other table and saves it ty.