Why can i claim my award multiple times?

Heya! I Have encountered an issue where when i press a button, it should give an award. Which it does. However, it gives an award even if i have claimed the reward.

local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")

local RemoteEvent = ReplicatedStorage.ClaimReward

-- Detect when the player joins the game
game.Players.PlayerAdded:Connect(function(player)

	-- Define your rewards, locally this time
	local Rewards = {
		{
			Name = "1st",
			Time = 1, --120,
			Coins = 100,
			Reached = false,
			Claimed = false,
		},
		{
			Name = "2nd",
			Time = 2, --180, -- 1200s = 20 minute,
			Coins = 200,
			Reached = false,
			Claimed = false,
		},
		{
			Name = "3rd",
			Time = 3,--300, -- 1200s = 20 minute,
			Coins = 200,
			Reached = false,
			Claimed = false,
		},
		{
			Name = "4th",
			Time = 4, --600, -- 1200s = 20 minute,
			Coins = 500,
			Reached = false,
			Claimed = false,
		},
		{
			Name = "5th",
			Time = 5, --720, -- 1200s = 20 minute,
			Coins = 800,
			Reached = false,
			Claimed = false,
		},
		{
			Name = "6th",
			Time =6, --780, -- 1200s = 20 minute,
			Coins = 900,
			Reached = false,
			Claimed = false,
		},
		{
			Name = "7th",
			Time =7, --900, -- 1200s = 20 minute,
			Coins = 1000,
			Reached = false,
			Claimed = false,
		},
		{
			Name = "8th",
			Time =8, --1200, -- 1200s = 20 minute,
			Coins = 200,
			Reached = false,
			Claimed = false,
		},
		{
			Name = "9th",
			Time =9, --1500, -- 1200s = 20 minute,
			Coins = 0,
			Gems = 50,
			Reached = false,
			Claimed = false,
		},
		{
			Name = "10th",
			Time =10, --1800, -- 1200s = 20 minute,
			Coins = 2500,
			Gems = 125,
			Pet = "Test",
			Reached = false,
			Claimed = false,
		},
		{
			Name = "11th",
			Time = 11, --2100, -- 1200s = 20 minute,
			Coins = 5000,
			Gems = 500,
			Reached = false,
			Claimed = false,
		},
		{
			Name = "12th",
			Time =12, --300, -- 1200s = 20 minute,
			Coins = 10000,
			Gems = 750,
			Pet = "Test 2",
			Reached = false,
			Claimed = false,
		},
	}

	-- Detect when the remote is fired from a client
	RemoteEvent.OnServerEvent:Connect(function(remotePlayer, rewardName)
		if remotePlayer ~= player then return end
		for i, v in ipairs(Rewards) do
			if v.Name == rewardName and v.Reached then -- If the reward is found and it is reached
				if not v.Claimed then -- Check if it was claimed already
					player.leaderstats.Coins.Value += v.Coins
					if v.Gems then
						player.leaderstats.Gems.Value += v.Gems
					end
					if v.Pet then
					print(v.Pet)
					end
				end
			end
		end
	end)

	-- Initialize their playtime. Note; I'm using seconds in this example, but feel free to use minutes.
	local playerPlaytime = 0

	-- Every one second
	while true and wait(1) do

		-- Add a second to their playtime
		playerPlaytime += 1

		-- Unlock rewards if playerPlaytime is enough
		for i, v in ipairs(Rewards) do
			if v.Time == playerPlaytime then
				v.Reached = true
				break
			end
		end
	end

end)

if you need the script that detects when the button is pressed, let me know!

4 Likes

It looks like after you check that the reward had not been claimed, you give them the rewards but I do not see anything that updates the state of the reward. At the end, try:

if not v.Claimed then
  …
  v.Claimed = true
end
3 Likes

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