The game I'm working on uses some of the elements from the Simulator genre that's so popular right now. You gather 'salvage' in the game world and exchange it for 'silver' at the sell spot. The silver is stored in the leaderboard and is the game's primary currency. Here is my code for the sell spot:
local isTouched = false script.Parent.Touched:Connect(function(hit) local findhum = hit.Parent:FindFirstChild("Humanoid") if findhum then if not isTouched then isTouched = true local character = hit.Parent local player = game.Players:GetPlayerFromCharacter(character) local silver = player.leaderstats.Silver local packContainer = character:WaitForChild("Container") --Get player's bag local packSpace = packContainer.Max.Value --Max amount the bag can hold local packCur = packContainer.Value.Value --Current amount in the bag silver.Value = silver.Value + packCur * 2 --Add silver to leaderboard packContainer.Value.Value = 0 --Set bag to empty wait(5) isTouched = false end end end)
You use the silver earned at one of the stores to buy new tools. Here's the code for the store that deals with the purchasing of a new tool.
local cam = workspace.CurrentCamera local character = script.Parent local player = game.Players:GetPlayerFromCharacter(character) local macheteSpawnEvent = game.ReplicatedStorage:WaitForChild("MacheteSpawnEvent") local hammerSpawnEvent = game.ReplicatedStorage:WaitForChild("HammerSpawnEvent") --Set camera to look at store repeat wait() cam.CameraType = Enum.CameraType.Scriptable until cam.CameraType == Enum.CameraType.Scriptable cam.CFrame = workspace.StartingStation.cameraPart1.CFrame --Show Store Interface player.PlayerGui.StoreGui.Frame.Visible = false local screenStuff = player.PlayerGui.MacheteGui.Frame screenStuff.Visible = true local hammerScreenStuff = player.PlayerGui.HammerGui.Frame --Disable normal gui local StarterGui = game:GetService('StarterGui') StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.All, false) local mPresent = player.Backpack:FindFirstChild("Machete") --Check to see if player already has Machete if mPresent == nil then screenStuff.Buy.Active = true else screenStuff.Buy.Active = false screenStuff.Buy.Text = "Purchased" end function buttonActive() local silver = player.leaderstats.Silver --Get silver from leaderboard local cost = game.Workspace.StartingStation.Machete.Value.Value -- Get cost of Machete if cost < silver.Value then player.leaderstats.Silver.Value = player.leaderstats.Silver.Value - cost --Subtract cost of machete from leaderboard print("Silver after purchase.."..player.leaderstats.Silver.Value) macheteSpawnEvent:FireServer(player) --Give player machete screenStuff.Buy.Active = false screenStuff.Buy.Text = "Purchased" end end function closeActive() screenStuff.Visible = false --Return camera to player game.Workspace.CurrentCamera.CameraSubject = game.Players.LocalPlayer.Character.Humanoid game.Workspace.CurrentCamera.CameraType = "Custom" --Enable normal gui local StarterGui = game:GetService('StarterGui') StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.All, true) script:Destroy() end function rightActive() screenStuff.Visible = false hammerScreenStuff.Visible = true cam.CFrame = workspace.StartingStation.cameraPart2.CFrame end function hammerLeftActive() hammerScreenStuff.Visible = false screenStuff.Visible = true cam.CFrame = workspace.StartingStation.cameraPart1.CFrame end function hammerButtonActive() local silver = game.Players.LocalPlayer.leaderstats.Silver local cost = game.Workspace.StartingStation.Hammer.Value.Value if cost <= silver.Value then game.Players.LocalPlayer.leaderstats.Silver.Value = silver.Value - cost hammerSpawnEvent:FireServer(player) hammerScreenStuff.Buy.Active = false hammerScreenStuff.Buy.Text = "Purchased" end end function hammerCloseActive() hammerScreenStuff.Visible = false --Return camera to player game.Workspace.CurrentCamera.CameraSubject = game.Players.LocalPlayer.Character.Humanoid game.Workspace.CurrentCamera.CameraType = "Custom" --Enable normal gui local StarterGui = game:GetService('StarterGui') StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.All, true) script:Destroy() end function hammerRightActive() end screenStuff.Buy.Activated:connect(buttonActive) screenStuff.CloseButton.Activated:connect(closeActive) screenStuff.RightButton.Activated:Connect(rightActive) hammerScreenStuff.LeftButton.Activated:Connect(hammerLeftActive) hammerScreenStuff.Buy.Activated:connect(hammerButtonActive) hammerScreenStuff.CloseButton.Activated:Connect(hammerCloseActive) hammerScreenStuff.RightButton.Activated:Connect(hammerRightActive)
Once you buy the machete the leaderboard does update and show the proper amount of silver left. I can click into the player's leaderstats folder and clearly see that the Silver.Value has been changed accordingly. However... if I go collect another salvage and trade it for silver, the leaderboard jumps back to the original pre-purchase amount plus the new salvage. For example, I have 214 Silver. The machete costs 200 Silver. Leaderboard now shows 14 Silver. I collect 1 Salvage, which sells for 2 Silver. My new total should be 16, but instead the leaderboard now shows 216.
What have I done wrong?