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

My Script For Loading A Saved Tycoon Isn't Working?

This script is having a glitch? I designed it to load a tycoons data when is has data, It loads until it get's to a certain item? then it says: 08:16:19.311 - Workspace.Zednov's Tycoon Kit.Tycoons.Blue Food Tycoon.PurchaseHandler:273: attempt to index field '?' (a nil value)

Can you help me?

	--[[
		All configurations are located in the "Settings" Module script.
		Please don't edit this script unless you know what you're doing.
	--]]
	local gp = game:GetService("GamePassService")
	local id = 780368541
	local Objects = {}
	local TeamColor = script.Parent.TeamColor.Value
	local Settings = require(script.Parent.Parent.Parent.Settings)
	local Money = script.Parent.CurrencyToCollect
	local Debris = game:GetService('Debris')
	local Stealing = Settings.StealSettings
	local CanSteal = true -- don't change or else you won't be able to steal currency
	
	script.Parent.Essentials.Spawn.TeamColor = TeamColor
	script.Parent.Essentials.Spawn.BrickColor = TeamColor
	
	function Sound(part,id)
		if part:FindFirstChild('Sound') then
			return
		else
			local Sound = Instance.new('Sound',part)
			Sound.SoundId = "rbxassetid://"..tostring(id)
			Sound.Volume = 0.25
			Sound:Play()
			delay(Sound.TimeLength, function()
				Sound:Destroy()
			end)
		end
	end
	
	--Parts that fall into the collector(s) get processed
	for i,v in pairs(script.Parent.Essentials:GetChildren()) do
		if v.Name == "PartCollector" then
			v.Touched:connect(function(Part)
				if Part:FindFirstChild('Cash') then
					if script.Parent.QuickCash.Value == true then
						local stats = game.ServerStorage.PlayerMoney:FindFirstChild(script.Parent.OwnerName.Value)
						stats.Value = stats.Value + Part.Cash.Value
					else
					Money.Value = Money.Value + Part.Cash.Value

					end	
				Debris:AddItem(Part,0.1)
				end
			end)
		end
	end
	
	--Player Touched Collector processor
	deb = false
	script.Parent.Essentials.Giver.Touched:connect(function(hit)
		local player = game.Players:GetPlayerFromCharacter(hit.Parent)
		if player ~= nil then
			if script.Parent.Owner.Value == player then
				if hit.Parent:FindFirstChild("Humanoid") then
					if hit.Parent.Humanoid.Health > 0 then
						if deb == false then
							deb = true
							script.Parent.Essentials.Giver.BrickColor = BrickColor.new("Bright red")
							local Stats = game.ServerStorage.PlayerMoney:FindFirstChild(player.Name)
							if Stats ~= nil then 
							Sound(script.Parent.Essentials, Settings.Sounds.Collect)
							Stats.Value = Stats.Value + Money.Value
							Money.Value = 0
							wait(1)
							script.Parent.Essentials.Giver.BrickColor = BrickColor.new("Sea green")
							deb = false
							end
						end
					end
				end
			elseif Stealing.Stealing then -- if player isn't owner and stealing is on
				if CanSteal == true then
					CanSteal = false
					delay(Stealing.PlayerProtection, function()
						CanSteal = true
					end)
					if hit.Parent:FindFirstChild("Humanoid") then
						if hit.Parent.Humanoid.Health > 0 then
							local Stats = game.ServerStorage.PlayerMoney:FindFirstChild(player.Name)
							if Stats ~= nil then
								local Difference = math.floor(Money.Value * Stealing.StealPrecent)
								Sound(script.Parent.Essentials, Settings.Sounds.Collect)
								Stats.Value = Stats.Value + Difference
								Money.Value = Money.Value - Difference
							end
						end
					end
				else
					Sound(script.Parent.Essentials, Settings.Sounds.Error)
				end
			end
		end
	end)
	
	script.Parent:WaitForChild("Buttons")
	for i,v in pairs(script.Parent.Buttons:GetChildren()) do
		spawn(function()
		if v:FindFirstChild("Head") then
			
			local ThingMade = script.Parent.Purchases:WaitForChild(v.Object.Value)
			if ThingMade ~= nil then
				Objects[ThingMade.Name] = ThingMade:Clone()
				ThingMade:Destroy()
			else
				--//Button doesn't have object, remove it
				error('Object missing for button: '..v.Name..', button has been removed')
				v.Head.CanCollide = false
				v.Head.Transparency = 1
			end
									
			if v:FindFirstChild("Dependency") then --// if button needs something unlocked before it pops up
				for i,c in pairs(v:GetChildren()) do
							if c:FindFirstChild("NamingGui") then
							c.NamingGui.Frame.Visible = false
							end
					if c:IsA("Part") then
				c.CanCollide = false
				c.Transparency = 1
				    end
				end
				coroutine.resume(coroutine.create(function()
					if script.Parent.PurchasedObjects:WaitForChild(v.Dependency.Value) then
						if Settings['ButtonsFadeIn'] then
							for i=1,20 do
								wait(Settings['FadeInTime']/20)
								for i,c in pairs(v:GetChildren()) do
									if c:IsA("Part") then
										if c.Name ~= "Head" then
									   c.Transparency = c.Transparency - 0.05
									    end	
									end
								end
							end
						end
						for i,c in pairs(v:GetChildren()) do
							if c:FindFirstChild("NamingGui") then
								c.NamingGui.Frame.Visible = true
							end
							if c:IsA("Part") then
						c.CanCollide = true
						if c.Name == "Head" then
						c.Transparency = 1
						else
							c.Transparency = 0
						end
						    end
						end
					end
				end))
			end
			
			v.Head.Touched:connect(function(hit)
				local player = game.Players:GetPlayerFromCharacter(hit.Parent)
				if v.Head.CanCollide == true then
					if player ~= nil then
						if script.Parent.Owner.Value == player then
							if hit.Parent:FindFirstChild("Humanoid") then
								if hit.Parent.Humanoid.Health > 0 then
									local PlayerStats = game.ServerStorage.PlayerMoney:FindFirstChild(player.Name)
									if PlayerStats ~= nil then
										if (v:FindFirstChild('Gamepass')) and (v.Gamepass.Value >= 1) then
											if game:GetService("MarketplaceService"):PlayerOwnsAsset(player,v.Gamepass.Value) then
												Purchase({[1] = v.Price.Value,[2] = v,[3] = PlayerStats})
											else
												game:GetService('MarketplaceService'):PromptPurchase(player,v.Gamepass.Value)
											end
										elseif (v:FindFirstChild('DevProduct')) and (v.DevProduct.Value >= 1) then
											game:GetService('MarketplaceService'):PromptProductPurchase(player,v.DevProduct.Value)
										elseif PlayerStats.Value >= v.Price.Value then
											Purchase({[1] = v.Price.Value,[2] = v,[3] = PlayerStats})
											Sound(v, Settings.Sounds.Purchase)
										else
											Sound(v, Settings.Sounds.ErrorBuy)
										end
									end
								end
							end
						end
					end
				end
			end)
			end
		end)
	end
	
	
	--// Loads Players Tycoon Data
	script.Parent.Entrance["Touch to claim!"].Head.Touched:connect(function(hit)
		local player = game.Players:GetPlayerFromCharacter(hit.Parent)
	if player ~= nil then
		local PlayerStats = game.ServerStorage.PlayerMoney:FindFirstChild(player.Name)
		if PlayerStats ~= nil then
			local ownstycoon = PlayerStats:FindFirstChild("OwnsTycoon")
			if ownstycoon ~= nil then
				if ownstycoon.Value == nil then
					if script.Parent.Owner.Value == nil then
						if hit.Parent:FindFirstChild("Humanoid") then
							if hit.Parent.Humanoid.Health > 0 then
								if not player.PlayerGui:FindFirstChild("Gui") then
								--Gui Script
								local gui = script.Gui:Clone()
								gui.Parent = player.PlayerGui
								gui.Frame.Load.MouseButton1Down:connect(function()
									for i,v in pairs(player.TycoonData:GetChildren()) do
										if player.TycoonData.Mine.Value == false then
											gui.Frame.Load.Text = "No Data Found"
											wait(1)
											gui.Frame.Load.Text = "Load Tycoon"
										else
											local chills = player.TycoonData:GetChildren()
											for i = 1,#chills do
												wait(0.1)
												if chills[i].Value == true then
													local item = Objects[chills[i].Name]:Clone()
													if item ~= nil then
													item.Parent = script.Parent.PurchasedObjects
													else
														print(item.Name.." is Nil")
														item:remove()
													end
												   end
												local buttons = script.Parent.Buttons:GetChildren()
												for i = 1,#buttons do
													wait()
													if player.TycoonData:FindFirstChild(buttons[i].Object.Value) then
														for i,v in pairs(buttons[i]:GetChildren()) do
															if v:IsA("Part") then
															v.Transparency = 1
															v.CanCollide = false
															end
															if v:FindFirstChild("NamingGui") then
																v.NamingGui.Frame.Visible = false
															end
														end
													end
												end
											    end
										    end
									    end
									--Gui Script
								    end)
								end
							end
						end
					end
				end
			end
		end
	end

2 comments

0

Why did it mix my code up :O

0

What tycoon kit is this from

1 answer

There's way to much code to look at here, so I'll just tell you what your error message means. Your error means that either you haven't defined PurchaseHandler (as in it doesn't exist), or it could also mean that PurchaseHandler hasn't loaded into the game yet. Assuming it's the second one, you can utilize WaitForChild().

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