Ayuda Soy Programador Principiante

Hola necesito hacer un script que cuando alguien toque una parte te de monedas y te suba de nivel tambien quiero que se guarden los datos osea las monedas y los niveles alguna sugerencia de como lo podria hacer ya tengo mi leaderstats pero no se como enlazar todo ayuda!!!

este es mi script de leaderstats:

local ServicioDatos = game:GetService(“DataStoreService”)
local DatosNiveles = ServicioDatos:GetDataStore(“DatosNiveles”)
local DatosMonedas = ServicioDatos:GetDataStore(“DatosMonedas”)
local DatosGemas = ServicioDatos:GetDataStore(“DatosGemas”)

local jugadores = game:GetService(“Players”)

jugadores.PlayerAdded:Connect(function(jugador)

local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats";
leaderstats.Parent = jugador;

local Niveles = Instance.new("IntValue");
Niveles.Parent = leaderstats;
Niveles.Name = "Stage";

local Monedas = Instance.new("IntValue");
Monedas.Parent = leaderstats;
Monedas.Name = "Coins"

local Gemas = Instance.new("IntValue");
Gemas.Parent = leaderstats;
Gemas.Name = "Gems";

wait(2)

local DatosN, DatosM, DatosG

local Correcto, Error = pcall(function()
	
	DatosN = DatosNiveles:GetAsync(jugador.UserId)
	DatosM = DatosMonedas:GetAsync(jugador.UserId)
	DatosG = DatosGemas:GetAsync(jugador.UserId)
	print(DatosN,  DatosM,  DatosG )
	
end)

if Correcto then
	
	Niveles.Value = DatosN
	print("Se Accedio A Los Datos De Los Niveles")
	
	Monedas.Value = DatosM
	print("Se Accedio A Los Datos De Las Monedas")
	
	Gemas.Value = DatosG
	print("Se Accedio A Los Datos De Las Gemas")
	
else
	warn("Ha Ocurrido Un Error" .. Error)
end		

end)

game.Players.PlayerRemoving:Connect(function(jugador)
local Correcto, Error = pcall(function()

	DatosNiveles:SetAsync(jugador.UserId, jugador.leaderstats.Stage.Value)
	DatosMonedas:SetAsync(jugador.UserId, jugador.leaderstats.Coins.Value)
	DatosGemas:SetAsync(jugador.UserId, jugador.leaderstats.Gems.Value)

end)
if Correcto then
	print("Se Guardaron Correctamente Los Niveles")
else
	warn("Ha Ocurrido Un Error" .. Error)
end

end)

1 Like

Estás mandando muchas requests al crear un DataStore por cada stat, te recomiendo que solo uses una y guardes todos los datos en una tabla.

Yendo al tema principal, solo debes usar un evento Touched (no creo que necesites tanta precisión), aumentarle las stats al jugador que tocó la BasePart y agregar el id del jugador a una lista de jugadores que ya tocaron la part para que no puedan recibir la recompensa nuevamente.

local PLS = game:GetService("Players") -- servicio de los jugadores

local Part = workspace.Part -- la part que recibirá el evento

local Debounces = { } -- lista de los ids de los jugadores que recibieron la recompensa

Part.Touched:Connect(function(hit: BasePart) -- evento que detecta cuando alguna otra BasePart toca la part
	local Character = hit:FindFirstAncestorWhichIsA("Model") -- si el hit tiene como ancestro algún modelo, que lo retorne
	local Client = PLS:GetPlayerFromCharacter(Character) -- el jugador

	if Client then -- si existe el jugador
		if Debounces[Client.UserId] then return end -- si el jugador ya reclamó la recompensa, que no lo vuelva a recompensar
		Debounces[Client.UserId] = true -- agregar el id del jugador a la lista
		local Leaderstats = Client:WaitForChild("leaderstats") -- la carpeta de leaderstats

		Leaderstats.Coins.Value += 50 -- le aumenta el valor de las monedas al jugador
		Leaderstats.Stage.Value += 1 -- le aumenta el valor de la stage al jugador
	end
end)

Esto es solo la idea básica, la categoría de soporte no está diseñada para pedir sistemas enteros; probablemente quieras agregar otra lista parecida a la de Debounces en el DataStore para guardar el progreso entero.

Esto me sirve gracias por ayudarme no sabia por donde comenzar :+1: