[Tutorial] Jogador ganha moeda quando passa por um checkpoint

E aí, gente! Queria mostrar essa dúvida da Hinata aluna do Roblox Maker que deu origem a esse mini projeto.

Ela queria adicionar no seu jogo, um sistema que dá dinheiro ao jogador quando ele chega num determinado lugar. Eu tinha sugerido fazer com Parts que ficariam no chão e quando o jogador pisasse nelas, ele ganharia o dinheiro. Ela também queria que esse dinheiro fosse dado apenas 1 vez por jogador, então vamos ver como isso funcionaria.

Eu criei uma pasta no Workspace para os checkpoints organizados dentro dele. Isso facilitará na hora de fazer os scripts. Para fazer o sistema funcionar, eu vou só precisar de 2 scripts que ficaram no ServerScriptService.

O 1º script é o de “JogadorAdicionado”. O que ele faz é adicionar 2 pastas dentro de cada jogador que entrar no jogo.
A primeira pasta é a de leaderstats que faz com que um menu simples aparece na hora do jogo, e nele será exibido a quantidade de dinheiro que a pessoa tem.
A segunda pasta é a de Checkpoints que terá um valor booleano para cada checkpoint do jogo onde verdadeiro significa que o jogador já passou por aquele checkpoint, e false significa que ele ainda não passou por lá.

-- script JogadorAdicionado
local Jogadores = game:GetService("Players")

Jogadores.PlayerAdded:Connect(function (Jogador) -- função que é ativada sempre que um jogador entra no jogo
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = Jogador -- cria um leaderstats em cada jogador
	
	local Dinheiro = Instance.new("IntValue")
	Dinheiro.Name = "Dinheiro"
	Dinheiro.Value = 0
	Dinheiro.Parent = leaderstats -- cria uma seção de dinheiro em cada leaderstats
	
	local Checkpoints = Instance.new("Folder")
	Checkpoints.Name = "Checkpoints"
	Checkpoints.Parent = Jogador -- cria outra seção de checkpoints em cada jogador
	
	for _, Checkpoint in pairs(workspace.Checkpoints:GetChildren()) do -- itera sobre cada filho da pasta Checkpoints
		local NovoCheckpoint = Instance.new("BoolValue")
		NovoCheckpoint.Name = Checkpoint.Name
		NovoCheckpoint.Value = false
		NovoCheckpoint.Parent = Checkpoints -- cria um checkpoint para cada filho e adiciona a pasta de Checkpoints
	end
end)

O 2º script é o de “CheckpointAtingido”. O que ele faz é adicionar um evento de toque para cada checkpoint dentro da pasta Checkpoints que se encontra no Workspace.
A primeira coisa que esse evento faz é verificar se o que tocou no checkpoint possou um Humanoid, ou seja, se é um boneco de jogador. Se não for, a função não precisa fazer nada.
Mas caso seja um jogador que tenha tocado no checkpoint, a próxima verificação é a de se o jogador já passou por aquele checkpoint. Se não tiver passado, a gente acessa o dinheiro do leaderstats e incrementa esse valor na quantidade que quisermos, em que nesse exemplo é 1.

-- script CheckpointAtingido
local Checkpoints = workspace.Checkpoints:GetChildren()  -- pega referência todos os filhos da pasta Checkpoints

for _, Checkpoint in pairs(Checkpoints) do -- itera sobre cada filho da pasta Checkpoints
	Checkpoint.Touched:Connect(function (objeto) -- essa função é chamada sempre que algo toca nesse Checkpoint
		
		if not objeto.Parent:FindFirstChild("Humanoid") then
			return  -- se objeto não possui um humanoid, retorna sem fazer nada
		end
		
		local Jogador = game.Players[objeto.Parent.Name]  -- pega referência de jogador que tocou no Checkpoint através do nome de seu boneco
		local AtingiuCheckpoint = Jogador.Checkpoints[Checkpoint.Name] -- pega referência do valor do Checkpoint de dentro do jogador
		if not AtingiuCheckpoint.Value then -- verifica se o jogador já tinha checado nesse Checkpoint antes, se não tiver, entra na condição
			AtingiuCheckpoint.Value = true -- troca esse Checkpoint para verdadeiro, para que o jogador não receba outra moeda aqui
			local Dinheiro = Jogador.leaderstats.Dinheiro -- pega referência do Dinheiro do leaderstats
			Dinheiro.Value = Dinheiro.Value + 1 -- incrementa o valor do Dinheiro
		end
	end)
end

Feito isso, o sistema está pronto! Por falta de espaço eu não expliquei os códigos aqui mas sim dei uma resumida no que ele faz. Vou postar o projeto aqui em baixo e dentro deles tem comentários! Qualquer dúvida, só perguntar!

[E é isso, gente! Eu fiz esse post para comunidade do discord nossa, mas achei legal compartilhar aqui com vocês também. Valeu!]

1 Curtida