Otimizando todos os sistemas

Nesse ponto você possivelmente já percebeu que, ao gastar os pontos que obtivemos e logo após obtemos mais pontos, é como se o jogo não tivesse percebido que nossa pontuação havia sido reduzida (Exemplo: interagindo com um objeto que me dá 1 ponto quando clico nele ou consigo chegar a dez pontos e comprar a primeira melhoria. Ao fazer isso meus pontos vão para zero como esperado, mas ao interagir novamente com o mesmo objeto a minha pontuação pula para 11, e não para 1 como deveria!)

Isso acontece por conta de uma limitação que o Roblox Studio tem: todo o funcionamento do nosso jogo depende de um servidor, ou seja uma conexão online com o jogo, para que nossa experiência funcione. Por conta disso temos dois tipos de partes: Local e Global (ou Servidor e Cliente).

Nós já chegamos a utilizar um elemento de cada tipo sem nem mesmo perceber, e para isso só precisamos olhas para os scripts! Até então utilizamos um que era uma folha branca com o nome apenas de "Script", enquanto outros, com o que foi colocado na pontuação e loja, são uma folha azul chamada "LocalScript"

Pasted image 20251010101105.png|300

De forma resumida, o Script vai fazer coisas para TODOS os jogadores, seja abrir uma porta, ganhar um item, perder vida, etc. Normalmente ele vai ser usado em blocos que ficam no workspace, já que qualquer jogador pode interagir com ele. Enquanto isso o LocalScript vai afetar apenas o jogador que tem ele, então é perfeito para usar com elementos de tela como pontuação, loja, bônus de dano, etc. Se um jogador abrisse uma porta, o "Script" abriria para todos enquanto o "LocalScript" só abriria para aquele jogador.

Porém temos uma limitação gigantesca: Scripts e LocalScripts não conversam entre si! Então se eu quiser que todos os jogadores saibam quando um jogador conseguiu abrir a porta, eu nunca conseguiria fazer isso!

Ou melhor, não diretamente.


RemoteEvents e como resolver nosso problema de pontuação

Para fazer com que códigos Locais e Globais conversem entre si, eu preciso fazer uma espécie de "Grupo do Whats", onde um dos códigos envia uma mensagem para esse grupo e todos os outros códigos a recebem, executando funções de acordo com a mensagem que receberem.

Dentro do Roblox Studio fazemos isso utilizando algo chamado RemoteEvents, e criamos ele dentro da pasta ReplicatedStorage. Nesse caso criaremos dois, um para aumentar e diminuir a pontuação e outro para clonar as melhorias ou a aplicar no jogador/construção.

Pasted image 20251010102406.png|200 Pasted image 20251010102417.png|200


Nosso código também vai receber algumas mudanças: colocaremos nosso IntValue em um local mais acessível, o jeito que ganhamos pontos muda assim como como clonamos objetos, então preste bastante atenção nos prints abaixo para ver como cada parte vai ficar!

Pasted image 20251010102656.png|300

Código do controladorDePontos:

local replicatedStorage = game:GetService("ReplicatedStorage")
local pontosEvento = replicatedStorage:FindFirstChild("pontosEvento")
local player = game.Players.LocalPlayer
local intvalue = Instance.new("IntValue")
intvalue.Name = "Pontos"
intvalue.Value = 0
intvalue.Parent = player

pontosEvento.OnClientEvent:Connect(function(valor)
	intvalue.Value += valor
end)

Pasted image 20251010102759.png|300

Código do LocalScript do item1:

LEMBRE-SE: As duas primeiras linhas mudam de acordo com onde fica a minha melhoria a ser clonada!

local melhorias = workspace:FindFirstChild("Melhorias")
local melhoria1 = melhorias:WaitForChild("Item 1 ponto")
local replicatedStorage = game:GetService("ReplicatedStorage")
local clonesEvento = replicatedStorage:FindFirstChild("clonesEvento")
local botao = script.Parent
local gui = botao.Parent
local player = game.Players.LocalPlayer
local pontos = player:WaitForChild("Pontos")

script.Parent.Activated:Connect(function(hit)
	
	if pontos.Value < 20  then
		print("Você não tem pontos suficientes")
	else
		pontos.Value -= 20
		local clone = melhoria1:Clone();
		clonesEvento:FireServer(melhoria1)
	end
end)

Código do LocalScript do TextLabel:

local texto = script.Parent
local player = game.Players.LocalPlayer
local pontos = player:WaitForChild("Pontos")

print(pontos)

while true do
	texto.Text = pontos.Value
	wait(0.01)
end

Pasted image 20251010102916.png|300

Código do ClonagemScript:

local replicatedStorage = game:GetService("ReplicatedStorage")
local clonesEvento = replicatedStorage:FindFirstChild("clonesEvento")
local melhorias = workspace:WaitForChild("Melhorias")

clonesEvento.OnServerEvent:Connect(function(player, parte)
	local clone = parte:Clone()
	clone.Parent = workspace
	clone.Position = Vector3.new(0, 5, 0)
	
end)

Pasted image 20251010103100.png|300

Código que ficará no Script dos itens que geram a pontuação:

local players = game:GetService("Players")
local prompt = script.Parent
local part = prompt.Parent
local replicatedStorage = game:GetService("ReplicatedStorage")
local pontosEvento = replicatedStorage:FindFirstChild("pontosEvento")


script.Parent.Triggered:Connect(function(jogador)
		pontosEvento:FireClient(jogador, 1)
end)

Para mudar quantos pontos o jogador recebe quando interage, mude o número da seguinte linha: pontosEvento:FireClient(jogador, 1)