Need some scripting math help

What’s happening is when a player collect 1 coin but has 0 rebirths they can automatically rebirth. I’ve tried to make it so the player needs at least 5000 coins but so far it’s not working. Below is a code within a touch event that supposed to check the cost against the players coins, set the value of coins to 0 and give 1 rebirth. What it does is allows the player to rebirth after collecting a single coin. I am unsure how to word it to correct this issue.

		local rebirthBaseCost = game.ReplicatedStorage.RebirthValue.Value --Any changes to value will also affect the BillboardGui.Text
		local newRebirthCost = rebirthBaseCost * ((rebirthStat.Value * 2.5) * 1.05)
		
		if rebirthStat == 0 or nil then
			newRebirthCost = rebirthBaseCost -- RebirthValue.Value is 5000
			if coinStat.Value >= newRebirthCost then
				coinStat.Value = 0
				rebirthStat.Value += 1
				rebirthToken.Value += 1 -- This is a value the player can use to increase their stats
				script.RebirthSound:Play()
			end
			else if rebirthStat ~= 0 then
				if coinStat.Value >= newRebirthCost then
					coinStat.Value = 0
					rebirthStat.Value += 1
					rebirthToken.Value += 1
					script.RebirthSound:Play()
				end
			end
		end

You need to check if rebirthStat.Value == 0… because this is value and you are checking Instance

Oh wow tyvm. Staring at screen for an hour not understanding the problem.

Your script had some issues, besides the one Yaroslav mentioned. Here they’re fixed.

local rebirthBaseCost = game.ReplicatedStorage.RebirthValue.Value --Any changes to value will also affect the BillboardGui.Text
local newRebirthCost = rebirthBaseCost * ((rebirthStat.Value * 2.5) * 1.05)
		
if rebirthStat.Value == 0 then -- If we have not rebirthed before
	if coinStat.Value < rebirthBaseCost then return end -- If our current coins is lower than the base rebirth cost, return end. Return in this case just means that the script wont go further.
else -- If not first time rebirthing
	if coinStat.Value < newRebirthCost then return end -- If our current coins is lower than the newRebirthCost then return end. Return in this case just means that the script wont go further.
end
-- If the script did not "return" we know we had enough coins, so just give them rebirth stuff.
coinStat.Value = 0
rebirthStat.Value += 1
rebirthToken.Value += 1 -- This is a value the player can use to increase their stats
script.RebirthSound:Play()

I tried your solution and nothing happened so I added a couple print statements to see if it activates when touched and nothing happened. I am unsure what the problem is.

I’ve added notes, it should work as intented. Did you put it correctly into the function?

I think so, here’s the whole thing.

-- Rebirth Upgrade Script --

local Players = game.Players
local rebirthPad = script.Parent
local db = true

local function onPartTouched(otherPart)
	local parent = otherPart.Parent
	local humanoid = parent:FindFirstChildWhichIsA("Humanoid")
	if humanoid and db then
		db = false
		
		local player = Players:GetPlayerFromCharacter(parent)
		local leaderstats = player.leaderstats
		local playerstats = player.playerstats
		local rebirthStat = leaderstats and leaderstats:FindFirstChild("Rebirth")
		local coinStat = leaderstats and leaderstats:FindFirstChild("Coins")
		local rebirthToken = playerstats and playerstats:FindFirstChild("RebirthToken")
		
------------- Put code in here --------------------------------------------------		
		
		local rebirthBaseCost = game.ReplicatedStorage.RebirthValue.Value --Any changes to value will also affect the BillboardGui.Text
		local newRebirthCost = rebirthBaseCost * ((rebirthStat.Value * 2.5) * 1.05)

		if rebirthStat.Value == 0 then
			if coinStat.Value < rebirthBaseCost then return end
			print(rebirthBaseCost)
		else
			if coinStat.Value < newRebirthCost then return end
			print(newRebirthCost)
		end
		
		coinStat.Value = 0
		rebirthStat.Value += 1
		rebirthToken.Value += 1 -- This is a value the player can use to increase their stats
		script.RebirthSound:Play()
		
		task.wait(1)
		db = true
	end	
end

rebirthPad.Touched:Connect(onPartTouched)

--[[

rebirth token "rToken" would be used to increase,
1+ gold
1+ run speed
1+ luck
+1 rebirth coin - used in shop or something

--]]

Your prints wont print, if coinStat.Value is below the cost.
image

Edit:

Also here I fixed your variables

		local player = Players:GetPlayerFromCharacter(parent)
		if not player return end
		local leaderstats = player:FindFirstChild("leaderstats")
		local playerstats = player:FindFirstChild("playerstats")
		if not leaderstats or not playerstats return end
		local rebirthStat = leaderstats:FindFirstChild("Rebirth")
		local coinStat = leaderstats:FindFirstChild("Coins")
		local rebirthToken = playerstats:FindFirstChild("RebirthToken")
		if not rebirthStat or not coinStat or not rebirthToken return end

That’s true but this is also true.

it doesn’t activate on touch.

Try insert the updated variables.

Edit: Edited the variables once more.

Oh I didn’t see that. hold on!

Could you paste all the changes together and my copy/paste is making all the returns have red underlines and I’m unsure where the issues lie.

So I added then’s and the red lines went away. The first rebirth worked as intended but there was no second. Something’s causing it seeing as I even gave myself 50k coins but it still didn’t rebirth.

If that does not work, just stick to your original plan.

local Players = game.Players
local rebirthPad = script.Parent
local rebirthBaseCost = game.ReplicatedStorage.RebirthValue.Value --Any changes to value will also affect the BillboardGui.Text
local db = {}

local function setdb(player,Status)
	db[player.name] = Status
end

local function onPartTouched(otherPart)
	local parent = otherPart.Parent
	local player = Players:GetPlayerFromCharacter(parent)
	if not player return end
	if db[player.name] return end
	setdb(player,true)

    local player = Players:GetPlayerFromCharacter(parent)
    if not player then setdb(player) return end
    local leaderstats = player:FindFirstChild(leaderstats)
    local playerstats = player:FindFirstChild(playerstats)
    if not leaderstats or not playerstats then setdb(player) return end
    local rebirthStat = leaderstats:FindFirstChild(Rebirth)
    local coinStat = leaderstats:FindFirstChild(Coins)
    local rebirthToken = playerstats:FindFirstChild(RebirthToken)
    if not rebirthStat or not coinStat or not rebirthToken then setdb(player) return end


	if rebirthStat.Value == 0 then
		print("Have not rebirthed before.The player has enough coins:",coinStat.Value>=rebirthBaseCost)
		if coinStat.Value < rebirthBaseCost then setdb(player) return end
		print(rebirthBaseCost)
	else
		local newRebirthCost = rebirthBaseCost * ((rebirthStat.Value * 2.5) * 1.05)
		print("Have rebirthed before.The player has enough coins:",coinStat.Value>=newRebirthCost)
		if coinStat.Value < newRebirthCost then setdb(player) return end
	end
	
	coinStat.Value = 0
	rebirthStat.Value += 1
	rebirthToken.Value += 1 -- This is a value the player can use to increase their stats
	script.RebirthSound:Play()
	
	task.wait(1)
	setdb(player)
end

rebirthPad.Touched:Connect(onPartTouched)
1 Like

Very robust, awesome work tyvm. I got this error and I have no experience with

if not player then setdb(player) return end

I’m sure you copied it before I edited, try again. There was a | symbol at line 19 by mistake.

Works perfectly tyvm. I test in and out the game too fast I think as the Datastore values don’t always save but at least the rebirth system works now. Just have to tell the BillboardGui to display the coins needed to rebirth now and it’s good to move on to the next part. I can’t thank you enough.

For DataStore I would suggest DataStore2. It’s almost plug&play for beginners.

I was thinking that too but it took me months just to understand what Datastore does and i’m still struggling with it tbh. Datastore2 scares me as I’m on a time crunch now.

How could i make a sort of purchase saving system? - #6 by TortenSkjold Here is almost an plug and play understanding of how to set it up.

Extended info:

I would recommend that you use DataStore2. It’s a very good module for those who wish to just have a datasave system that works without much hassle!
Here’s the setup that I have for my own games. I’ve simplified it for you!

Have the module downloaded and place it into ServerStorage. Also create a “StringValue” in ServerStorage, that we use to change our DataVersion with, this way we can “wipe” all data in the future, just by changing the value of the DataVersion StringValue in ServerStorage. (I personally write “v1” as the default version. Also create a BoolValue in ServerStorage called “SaveInStudio”, if this boolvalue is false, then it won’t save data while you’re testing in studio.