Type ‘number?’ could not be converted into ‘number’

Anyone know why it gives me that error at
if (tonumber(os.date("%j")) - 1) >= tonumber(player:GetAttribute("LastLogin")) and player:GetAttribute("DailyClaimed") == false then
or to be more clear
(tonumber(os.date("%j"))"
is underlined with that error?

This is the whole code:

--> Get The Services Needed.
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local DataStoreService = game:GetService("DataStoreService")

--> Setup The Data Stores
local DataStore = DataStoreService:GetDataStore("DailyRewardData2")

--> Get The Remote Event
local Event = ReplicatedStorage:WaitForChild("Events").Daily

--> Setup Rewards For Streaks
local Rewards = {
	[1] = function(player)
		player.Values.Coins.Value += 50
		
		--> Fire Remote With Reward String To Put In GUI
		Event:FireClient(player, "You Recieved 50 Coins! Come back tomorrow.")
	end,
	[2] = function(player)
		player.Values.Respawns.Value += 2

		--> Fire Remote With Reward String To Put In GUI
		Event:FireClient(player, "You Recieved 2 Respawns! Come back tomorrow.")
	end,
	[3] = function(player)
		player.Values.Coins.Value += 100

		--> Fire Remote With Reward String To Put In GUI
		Event:FireClient(player, "You Recieved 100 Coins! Come back tomorrow.")
	end,
	[4] = function(player)
		player.Values.Coins.Value += 150

		--> Fire Remote With Reward String To Put In GUI
		Event:FireClient(player, "You Recieved 200 Coins! Come back tomorrow.")
	end,
	[5] = function(player)
		player.Values.Respawns.Value += 4

		--> Fire Remote With Reward String To Put In GUI
		Event:FireClient(player, "You Recieved 4 Respawns! Come back tomorrow.")
	end,
	[6] = function(player)
		player.Values.Coins.Value += 200

		--> Fire Remote With Reward String To Put In GUI
		Event:FireClient(player, "You Recieved 200 Coins! Come back tomorrow.")
	end,
	[7] = function(player)
		player.Values.Coins.Value += 250
		player.Values.Respawns.Value += 2

		--> Fire Remote With Reward String To Put In GUI
		Event:FireClient(player, "You Recieved 250 Coins and 2 Respawns! Come back tomorrow.")
	end,
}

--> Data Functions
local function GetPlayerData(player: Player)
	local Succ, Data = pcall(function()
		return DataStore:GetAsync(player.UserId)
	end)
	
	return Data
end

local function SavePlayerData(player: Player)
	local Table = {
		Claimed = player:GetAttribute("DailyClaimed") or false,
		LastLogin = player:GetAttribute("LastLogin") or os.date("%j"),
		Streak = player:GetAttribute("Streak") or 1
	}
	
	DataStore:SetAsync(player.UserId, Table)
end

--> Player Functions
local function PlayerAdded(player: Player)
	local SavedData = GetPlayerData(player)
	
	if SavedData == nil or type(SavedData) ~= "table" then
		SavedData = {
			Claimed = false,
			LastLogin = 0,
			Streak = 1,
		}
	end
	
	player:SetAttribute("DailyClaimed", SavedData.Claimed)
	player:SetAttribute("LastLogin", SavedData.LastLogin)
	player:SetAttribute("Streak", SavedData.Streak)
	
	--> Check If Player Gets Daily Reward
	if (tonumber(os.date("%j")) - 1) >= tonumber(player:GetAttribute("LastLogin")) and player:GetAttribute("DailyClaimed") == false then
		local Streak = player:GetAttribute("Streak")
		
		player:SetAttribute("DailyClaimed", true)
		player:SetAttribute("LastLogin", os.date("%j"))
		
		Rewards[Streak](player)
		
		player:SetAttribute("Streak", Streak + 1)
		
		--> Reset Streak If It Goes Passed The Number Of Streaks
		if player:GetAttribute("Streak") > #Rewards then
			player:SetAttribute("Streak", 1)
		end
	end
	
end

local function PlayerRemoving(player: Player)
	SavePlayerData(player)
end

--> Race Conditions (If a player loads before this script does.)
for _, player in pairs(Players:GetPlayers()) do
	PlayerAdded(player)
end

--> Player Connections
Players.PlayerAdded:Connect(PlayerAdded)
Players.PlayerRemoving:Connect(PlayerRemoving)

--> Incase of server shutting down
game:BindToClose(function()
	for _, player in pairs(Players:GetPlayers()) do
		PlayerRemoving(player)
	end
end)

Thanks in advance!

1 Like

Try this:

if (tonumber(os.date("%j"))::number - 1) >= tonumber(player:GetAttribute("LastLogin"))::number and player:GetAttribute("DailyClaimed") == false then
1 Like

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.