Hello! You can only change a player’s leaderstats using a server
script. Doing it with a local
script wouldn’t work!
There is no point in checking when the player joins because all local scripts run when the player joins. It seems you do not know the difference between local and server scripts. You should learn about it here. It’s important!
In order to change the player’s leaderstats you will have to do it through a server
script. But since these are 2 different script types, in order for them to communicate, and pass on information (like when a leaderstats value changes), you will have to use RemoteEvents.
SERVER SCRIPT
local leaderstatsChanged = game.ReplicatedStorage.leaderstatsChanged -- remote event
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
player:WaitForChild("leaderstats").Stage:GetPropertyChangedSignal("Value"):Connect(function()
leaderstatsChanged:FireClient(player) -- We are telling the player's localscript that the stage changed.
end)
end)
In the server
script above, the moment a player joins, the first thing we are doing is basically putting a constant tracker on that stage value. So if it ever changes, the new and changed value will be sent to the local
script, where you can do whatever you want with it.
LOCAL SCRIPT
local leaderstatsChanged = game.ReplicatedStorage.leaderstatsChanged -- remote event
local player = game.Players.LocalPlayer
local playerimg = game.Players:GetUserThumbnailAsync(player.UserId, Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size48x48)
local img = script.Parent.ImageLabel
img.Image = playerimg
local ts = game:GetService("TweenService")
local ti = TweenInfo.new(1, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut)
local maxStages = 73 -- Put stages whatever you want
leaderstatsChanged.OnClientEvent:Connect(function(stage) -- the local script receives the server scrip's message that the Stage has changed
local tween = ts:Create(img, ti, {Position = UDim2.new(0.98/(maxStages/stage), 0, 0.05, 0)})
tween:Play()
script.Parent.Indicator.Text = "Stage: " ..tostring(stage)
end)
In the local
script above, I didn’t change much of your code. All I did was get the remote event, so that whenever the server
script detected a change in the player’s leaderstats stage value, it would pass on that value into the same local
script, where it would be used for tweeting or whatever…
P.S. Make sure you add a RemoteEvent into ReplicatedStorage, so that the code actually works!
Let me know if this helps and if there are any errors or other things you might need help with! I tried to cover everything in your post