What's the best way to do this? (Awarding Badges)

Is this a bad practice or is this fine? What if I were to have 800 to 1000 stages and the same pattern would persist?

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

Players.PlayerAdded:Connect(function(Player)
	
	local leaderstats = Player:WaitForChild("leaderstats")
	local Stage = leaderstats:WaitForChild("Stage")

	Stage.Changed:Connect(function(newValue)
		
		if newValue >= 25 and not BadgeService:UserHasBadge(Player.UserId, 0) then
			
			BadgeService:AwardBadge(Player.UserId, 0)
		
		end
		
		if newValue >= 50 and not BadgeService:UserHasBadge(Player.UserId, 0) then
			
			BadgeService:AwardBadge(Player.UserId, 0)
		
		end
		
		if newValue >= 75 and not BadgeService:UserHasBadge(Player.UserId, 0) then
			
			BadgeService:AwardBadge(Player.UserId, 0)
		
		end
		
		if newValue >= 100 and not BadgeService:UserHasBadge(Player.UserId, 0) then
			
			BadgeService:AwardBadge(Player.UserId, 0)
		
		end
	end)
end)
2 Likes

you could use a module to store the awards:

Award1 = {StageReq = --stage required
BadgeId = --badgeID
}

and in the other code:

for _, v in pairs(module:GetChildren()) do
if v.StageReq <= newvalue and not BadgeService:UserHasBadge(plr.UserId, module.BadgeID then
    BadgeService:AwardBadge(plr.UserId, module.BadgeId)
  end
end)

Hope that could help

2 Likes

is it a bad practice to do what i did?

also im probably going to use a module instead that looks more efficient

1 Like

Its not really the best method, it does the job, but in a bigger game, your number 1 priority is to optimize your game

1 Like

You don’t really need to use modules for this as its just a badge script which should only be used by 1 script to detect when to award a badge.

-- # Services
local Players = game:GetService('Players');
local BadgeService = game:GetService('BadgeService');

-- # Badges
local Badges = { -- # [Stage Number] = BadgeId
	[25] = 0000;
	[50] = 0000;
	[75] = 0000;
	[100] = 0000;
};

-- # Functions
local StageChanged = function(player: Player, Stage)
	for _stage, badge in ipairs(Badges) do
		if Stage.Value >= _stage then
			if not BadgeService:UserHasBadgeAsync(player.UserId, badge) then
				BadgeService:AwardBadge(player.UserId, badge);
			end;
		end;
	end;
end;

local PlayerAdded = function(player: Player) -- # Give a badge if you made a badge after the player was already at that stage and didn't get it.
	local leaderstats = player:WaitForChild('leaderstats');
	local Stage = leaderstats:WaitForChild('Stage');
	
	for _stage, badge in ipairs(Badges) do
		if Stage.Value >= _stage then
			if not BadgeService:UserHasBadgeAsync(player.UserId, badge) then
				BadgeService:AwardBadge(player.UserId, badge);
			end;
		end;
	end;
	
	Stage:GetPropertyChangedSignal('Value'):Connect(function()
		StageChanged(player, Stage);
	end);
end;

-- # Connections
for _, v in ipairs(Players:GetPlayers()) do
	PlayerAdded(v);
end;

Players.PlayerAdded:Connect(PlayerAdded);
2 Likes

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