Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
✓ ANSWER ACCEPTED

How do you change a value with a local script?

I have a game that I am working on. It has a paycheck system that uses an int value in the leaderboard script. The int value sets the amount of pay with a script. Here is the problem though, The script that sets the amount doesn't change the value. I use teams to get the value. I am new to scripting

Leaderboard (Script) (With data saving):

local datastore = game:GetService("DataStoreService")
local ds1 = datastore:GetDataStore("CashSaveSystem")

game.Players.PlayerAdded:connect(function(plr)
	local folder = Instance.new("Folder", plr)
	folder.Name = "leaderstats"
	local cash = Instance.new("IntValue", folder)
	cash.Name = "Money"
	
	cash.Value = ds1:GetAsync(plr.UserId) or 500
	ds1:SetAsync(plr.UserId, cash.Value)
	
	cash.Changed:connect(function()
		ds1:SetAsync(plr.UserId, cash.Value)
	end)
	while true do
		wait(60)
		cash.Value = cash.Value + script.PayCheck.Value
	end
end)

Pay Check setting script (Local)

local player = game.Players.LocalPlayer
local leaderstats = player:WaitForChild("leaderstats")
local paycheck = game.Workspace.Leaderboard.PayCheck.Value
local teams = game:GetService("Teams")

if player.Team == teams.Citizen then
	paycheck = 120
end
if player.Team == teams.Criminal then
	paycheck = 150
end
if player.Team == teams.Inmate then
	paycheck = 0
end
if player.Team == teams.Police then
	paycheck = 200
end
if player.Team == teams.HeavyGunDealer then
	paycheck = 225
end
if player.Team == teams.GunDealer then
	paycheck = 165
end
if player.Team == teams.AdminOnDuty then
	paycheck = 10000
end

2 comments

0

I'd assume this is because you are using a local script, since that only changes the stats locally, not globally. Maybe try using a regular script? (Corrected)

0

Use remote function or event.

3 answers

✓ Accepted answer

Well, I would recommend you to do it on Server-Side to prevent any type of exploitation. This is what you might do :

local datastore = game:GetService("DataStoreService")
local ds1 = datastore:GetDataStore("CashSaveSystem")

game.Players.PlayerAdded:Connect(function(plr) -- Capital 'C'
   	local folder = Instance.new("Folder", plr)
    	folder.Name = "leaderstats"
    	local cash = Instance.new("IntValue", folder)
    	cash.Name = "Money"

    	cash.Value = ds1:GetAsync(plr.UserId) or 500
    	ds1:SetAsync(plr.UserId, cash.Value)

    	cash.Changed:connect(function()
        	ds1:SetAsync(plr.UserId, cash.Value)
    	end)

	local function PayCheck() -- Creating a function
		local paycheck = workspace.Leaderboard.PayCheck
		local teams = game:GetService("Teams")

		local payCheckTable = {
			["Citizen"] = 120,
    			["Criminal"] = 150,
    			["Inmate"] = 0,
    			["Police"] = 200,
   			["HeavyGunDealer"] = 225,
    			["GunDealer"] = 165,
    			["AdminOnDuty"] = 1000		
		} -- Thanks to Feelings_La

		-- Time for checking the player's team
		for i, v in pairs(payCheckTable) do -- i = team of the player, v = price of paycheck
			if plr.Team == team[i] then -- Checks if the player is in the team in the table
				paycheck.Value = v
			end
		end
	end

    	while wait(60) do
		PayCheck() -- Triggers our function
        	cash.Value = cash.Value + script.PayCheck.Value
    	end

	-- Don't add code after a while loop, as it is never ending. So, the code after the while loop never gets checked
end)

Lemme know if it helps!

1 comment

0

This one works

You are changing your value locally not globally.

Use Remote Function or Events. They are great to allow you communicate between server and client! Becareful when you are using remote function/events though. Since exploiters can manipulate it.

More info about Remote Function/Events:

On your local script: I'd suggest you to make a table for paycheck instead of messy giant script.

local player = game.Players.LocalPlayer
local leaderstats = player:WaitForChild("leaderstats")
local leaderboard = game.Workspace.Leaderboard


local ReplicatedStorage = game:GetService("ReplicatedStorage")
local UpdateBoard = ReplicatedStorage.UpdateBoard -- create a new remote function

local payChecks = {
	["Citizen"] = 120,
	["Criminal"] = 150,
	["Inmate"] = 0,
	["Police"] = 200,
	["HeavyGunDealer"] = 225,
	["GunDealer"] = 165,
	["AdminOnDuty"] = 10000
	
}

for team, paycheck in pairs(payChecks) do
	if player.Team == game:GetService("Teams")[team] then
		leaderboard.PayCheck.Value = paycheck
	end
end

while wait(60) do -- DO THIS on local script instead of server!
	UpdateBoard:InvokeServer(leaderboard.PayCheck.Value)
end

Then on your server script:


-- THIS IS FOR SAFETY REASON
local payChecks = { 
	["Citizen"] = 120,
	["Criminal"] = 150,
	["Inmate"] = 0,
	["Police"] = 200,
	["HeavyGunDealer"] = 225,
	["GunDealer"] = 165,
	["AdminOnDuty"] = 10000
	
}
local RS = game:GetService("ReplicatedStorage")
local UpdateBoard = ReplicatedStorage.UpdateBoard

UpdateBoard.OnServerInvoke = function(plr, payCheck)
	if payCheck == payChecks[player.Team] then
		plr.leaderstats.Cash.Value = plr.leaderstats.Cash.Value + payCheck
	end
end

1 comment

0

Still gives me 0

you should use a remote event and do it from a server script cus if u change the value in a local script it wont register to the server and it will only save the data thats on the server so you'll need a server script to change the value

This discussion is preserved as it was. New answers, comments, and votes are closed.