Trying to award a player a badge but error occurs

I want to award a player a badge when they touch a part.

I went to test it and it didn’t work. Luckily I opened the output tab because one of the scripts I used had a print function and I saw an multiple times error:

This is the script I used:

local part = script.Parent
local badgeService = game:GetService("BadgeService")
local badge = 2140926703

part.Touched:Connect(function(plr)
	local hasBadge = badgeService:UserHasBadgeAsync(plr.UserId, badge)
	if hasBadge then
		print( plr.Name .. " owns this badge!")
	else
		badgeService:AwardBadge(plr.UserId, badge)
	end
end)

I looked on here but I didn’t find anything to help with this. I’m not sure what’s happening here.

Your plr in this case isn’t the player, it’s the part that touched the part, so in this case plr would be a limb of your character if you touched it

Typically what you can do is get the character via getting the parent of the part (plr.Parent, recommend you rename plr since it’s not a player), then using Players:GetPlayerFromCharacter(), passing in the character as the function says, to confirm that a player touched the part, if they did, award the badge

I’m not entirely sure how that would look. I attempted to do that but I don’t know how based off of what you said.

Right so, firstly plr should be renamed to something else for clarity, I recommend hit as that’s what most use

When we make our character hit the part, hit will be a limb, like a leg for example, hit.Parent gives us the character, we pass the character to the function I mentioned, which returns a player instance if what we gave is a character, or nil if it isn’t, make sure if it’s nil we don’t continue on the code, and then award the badge

Something like this

local Players = game:GetService("Players")

local part = script.Parent
local badgeService = game:GetService("BadgeService")
local badge = 2140926703

part.Touched:Connect(function(hit)
	local player = Players:GetPlayerFromCharacter(hit.Parent)
	
	if not player then
		return
	end
	
	local hasBadge = badgeService:UserHasBadgeAsync(player.UserId, badge)
	if hasBadge then
		print( player.Name .. " owns this badge!")
	else
		badgeService:AwardBadge(player.UserId, badge)
	end
end)

No errors popped up this time but when I tested this it didn’t give me the badge, it did nothing like if I wasn’t a player.

I am maybe a little late, but I assume it’s because you are testing the game in Studio and not as a real game. I don’t think that an awarding of a badge is possible in Studio. To check that the function was still fired I would recommend using print, to make sure the function was successfully fired.

I already fixed it. I got some replies on my older topics recently.