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

"Argument 1 missing or nil" from CashGiver script?

I was making a tycoon, and used a script that AlvinBlox made for the leaderboards and for a passive cash giver, as well as a base script from dutchdeveloper for the actual tycoon. I tried editing these scripts to make sure that they worked with each other, as they all called for different types of cash, and wouldn't actually give me the money I needed to purchase the items I can buy from the Tycoon.

local TycoonInfo = script.Parent:WaitForChild("TycoonInfo")
local OwnerValue = TycoonInfo:WaitForChild("Owner")
local Buttons = script.Parent:WaitForChild("Buttons")
local Purchases = script.Parent:WaitForChild("Purchases")

local Objects = {}

function validateHitByOwner(Hit)
	if Hit and Hit.Parent and Hit.Parent:FindFirstChild("Humanoid") then
		local Player = game.Players:GetPlayerFromCharacter(Hit.Parent)
		if Player and OwnerValue.Value==  Player then
			return true
		end
	end
	return false
end

for i,v in pairs(Buttons:GetChildren()) do
	local Object = Purchases:FindFirstChild(v.Object.Value)
	if Object then
		Objects[Object.Name] = Object:Clone()
		Object:Destroy()
		
		if v:FindFirstChild("Dependency") then
			coroutine.resume(coroutine.create(function()
				v.Button.Transparency = 1
				v.Button.BillboardGui.Enabled = false
				v.Button.CanCollide = false
				if Purchases:WaitForChild(v.Dependency.Value,90000) then
					v.Button.Transparency = 0
					v.Button.CanCollide = true
					v.Button.BillboardGui.Enabled = true
				end
			end))
		end
		local DB = false
		v.Button.Touched:Connect(function(Hit)
			if validateHitByOwner(Hit)then
				if DB == false then
					DB = true
					if v.Button.Transparency == 0 then
						local Purchased = DoPurchase(Hit,v,v.Price.Value,Objects[v.Object.Value])
						if Purchased then
							warn("Purchased")
						else
							warn("Can't purchase")
						end
					end
					DB = false
				end
			end
		end)
	end
end

function DoPurchase(Hit,Button,Cost,Object)
	if Hit and Hit.Parent and Hit.Parent:FindFirstChild("Humanoid") then
		local Player = game.Players:GetPlayerFromCharacter(Hit.Parent)
		if Player and OwnerValue.Value == Player then
			local CashValue = game.ServerStorage.PlayerCash:FindFirstChild(Player.Name)
			if CashValue then
				if CashValue.Value >= Cost then
					CashValue.Value = CashValue.Value - Cost
					Object.Parent = Purchases
					Button:Destroy()
					return true	
				end	
			end
		end
	end
	return false
end

This is the script I used for the tycoon.

function FindEmptyTycoon()
	for i,v in pairs(workspace.Tycoons:GetChildren()) do
		if v.TycoonInfo.Owner.Value == nil then
			return v
		end
	end
	return nil
end


game.Players.PlayerAdded:Connect(function(Player)
	local Tycoon = FindEmptyTycoon()
	Tycoon.TycoonInfo.Owner.Value = Player
	
	
	local stats = Instance.new("BoolValue",Player)
	stats.Name = "leaderstats"
	
	local Cash = Instance.new("IntValue",stats)
	Cash.Name = Player.Name
	Cash.Value = 0
	Cash.Parent = game.ServerStorage.PlayerCash
end)

This is the script I used for the leaderboard. The cash is supposed to be stored in an IntValue in a Folder in ServerStorage, however:

local amount = 2
local timedelay = 2.33
local currencyname = "Cash"
wait(1)
while true do
	wait(timedelay)
	for i,v in pairs(game.ServerStorage.PlayerCash:FindFirstChild()) do
		if v:FindFirstChild("leaderstats") and v then
			v.leaderstats[currencyname].Value = v.leaderstats[currencyname].Value + amount
		end
	end
end

This is the script I used for the passive cash giver for the object that gives me money. It originally said:

for i,v in pairs(game.Players:GetPlayers()) do

but it came up with the error "Cash is not a valid member of BoolValue", so I thought I'd change it to what it is now so it can call for the Cash stored in the PlayerCash folder mentioned earlier. Am I on the right track or is this all completely wrong?

1 answer

✓ Accepted answer

Okay, here is the fix, read the comments:


local amount = 2
local timedelay = 2.33
local currencyname = "Cash"
wait(1)
while true do
    wait(timedelay)
    for i,v in pairs(game.ServerStorage.PlayerCash:GetChildren()) do --You had to use GetChildren as find first child just gets you one child.
        if v:FindFirstChild("leaderstats") and v then
            v.leaderstats[currencyname].Value = v.leaderstats[currencyname].Value + amount
        end
    end
end

Hope it helps!

1 comment

0

This does fix the error! However, the Value of the IntValue in PlayerCash isn't going up. Also, the cash isn't showing up in the leaderboards, it only comes up with my name.

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