Problem with Tycoon spawning

  1. What do you want to achieve? Keep it simple and clear!
    Yeah again got in errors, while was testing with 2 players my tycoon. On start everything goes good. Tycoon spawns. But problem start right after this. For some strange reason one of the players can’t activate a button, game thinks he is not owner of that button. After i tryed to activate it on other player, it got activated and for some strange reason created a miner(dropper exactly) for both players, but both of them was giving money to this player.
  2. What is the issue? Include screenshots / videos if possible!
    Explained on first. Here is an video of that: Problem - YouTube
  3. What solutions have you tried so far? Did you look for solutions on the Developer Hub? I was making this by youtube video and it should work. But i was making an custom dropper, instead of spawning drop it just gives money. But i don’t think this connected with problem right now.
    Here is all scripts which create tycoon and buy things.

Server Code:

local Tycoon = require(script.Parent.Tycoon)
local PlayerManager = require(script.Parent.PlayerManager)

local function FindSpawn()
	for _, spawnPoint in ipairs(workspace.Spawns:GetChildren()) do
		if not spawnPoint:GetAttribute("Occupied") then
			print("Found a spawn! :D")
			return spawnPoint -- returning spawn location
		end
	end
	print("Could not find spawn! :(")
end
PlayerManager.Start()

PlayerManager.PlayerAdded:Connect(function(player)
	local tycoon = Tycoon.new(player, FindSpawn())
	tycoon:Init()
end)

Player Manager(Module):

local Players = game:GetService("Players")

local function LeaderboardSetup()
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	
	local Cash = Instance.new("NumberValue")
	Cash.Name = "Cash"
	Cash.Value = 0
	Cash.Parent = leaderstats
	return leaderstats
end

local playerAdded = Instance.new("BindableEvent")
local playerRemoving = Instance.new("BindableEvent")

local PlayerManager = {}

PlayerManager.PlayerAdded = playerAdded.Event
PlayerManager.PlayerRemoving = playerRemoving.Event
function PlayerManager.Start()
	for _,player in ipairs(Players:GetPlayers()) do
	  coroutine.wrap(PlayerManager.OnPlayerAdded)(player)	
	end
	
	Players.PlayerAdded:Connect(PlayerManager.OnPlayerAdded)	
	Players.PlayerRemoving:Connect(PlayerManager.OnPlayerRemoving)	
end

function PlayerManager.OnPlayerAdded(player)
	player.CharacterAdded:Connect(function(character)
		PlayerManager.OnCharacterAdded(player, character)
	end)
	local leaderstats = LeaderboardSetup()
	leaderstats.Parent = player
	
	playerAdded:Fire(player)
end

function PlayerManager.OnCharacterAdded(player, character)
	local humanoid = character:FindFirstChild("Humanoid")
	if humanoid then
		humanoid.Died:Connect(function()
			wait(1)
			player:LoadCharacter()
		end)
	end
end

function PlayerManager.GetMoney(player)
	local leaderstats = player:FindFirstChild("leaderstats")
	if leaderstats then
		local Cash = leaderstats:FindFirstChild("Cash")
		if Cash then
			return Cash.Value
		end
	end
	return 0
end

function PlayerManager.SetMoney(player, value)
	if value then
		local leaderstats = player:FindFirstChild("leaderstats")
		if leaderstats then
			local Cash = leaderstats:FindFirstChild("Cash")
			if Cash then
				Cash.Value = value
			end
		end	
	end
end

function PlayerManager.OnPlayerRemoving(player)
	playerRemoving:Fire(player)
end
return PlayerManager

Tycoon(Module):

local CollectionService = game:GetService("CollectionService")
local template = game:GetService("ServerStorage").Template
local componentFolder = script.Parent.Components
local tycoonStorage = game:GetService("ServerStorage").TycoonStorage
local playerManager = require(script.Parent.PlayerManager)

local function NewModel(model, cframe)
	local newModel = model:Clone()
	newModel:PivotTo(cframe)
	newModel.Parent = workspace
	return newModel
end

local Tycoon = {}
Tycoon.__index = Tycoon

function Tycoon.new(player, spawnPoint)
	local self = setmetatable({}, Tycoon)	
	Tycoon.Owner = player
	Tycoon._topicEvent = Instance.new("BindableEvent")
	self._spawn = spawnPoint
	return self
end

function Tycoon:Init()
	print(self._spawn)
	self.Model = NewModel(template, self._spawn.CFrame)
	self._spawn:SetAttribute("Occupied", true)
	self.Owner.RespawnLocation = self.Model.Spawn
	self.Owner:LoadCharacter()
	
	self:LockAll()
	self:WaitForExit()
end

function Tycoon:LockAll()
	for _, instance in ipairs(self.Model:GetDescendants()) do -- Here is error
		if CollectionService:HasTag(instance, "Unlockable") then
			self:Lock(instance)
		else
			self:AddComponents(instance)
		end
	end
end

function Tycoon:Lock(instance)
	instance.Parent = tycoonStorage
	self:CreateComponent(instance, componentFolder.Unlockable)
	
end

function Tycoon:Unlock(instance, id)
	CollectionService:RemoveTag(instance, "Unlockable")
	self:AddComponents(instance)
	instance.Parent = self.Model	
end

function Tycoon:AddComponents(instance)
	for _, tag in ipairs(CollectionService:GetTags(instance)) do
		local component = componentFolder:FindFirstChild(tag)
		if component then
			self:CreateComponent(instance, component)
		end
	end
end

function Tycoon:CreateComponent(instance, componentScript)
	local compModule =require(componentScript)
	local newComp = compModule.new(self, instance)
	newComp:Init()
end

function Tycoon:PublishTopic(topicName, ...)
 self._topicEvent:Fire(topicName, ...)	
end

function Tycoon:SubscribeTopic(topicName, callback)
	local connection = self._topicEvent.Event:Connect(function(name, ...)
		if name == topicName then
			callback(...)
		end
	end)
    return connection	
end

function Tycoon:WaitForExit()
	playerManager.PlayerRemoving:Connect(function(player)
		if self.Owner == player then
			self:Destroy()
		end	
	end)	
end

function Tycoon:Destroy()
	self.Model:Destroy()
	self._topicEvent:Destroy()
	self._spawn:SetAttribute("Occupied", false)
end

return Tycoon

Button(Module):

local CollectionService = game:GetService("CollectionService")
local Dropper = {}
Dropper.__index = Dropper

function Dropper.new(tycoon, instance)
	local self = setmetatable({}, Dropper)
	self.Tycoon = tycoon
	self.Instance = instance
	self.Rate = instance:GetAttribute("Rate")
	self.Worth = instance:GetAttribute("Worth")
	self.Display = instance:GetAttribute("Display")
	return self
end

function Dropper:Init()
	if CollectionService:HasTag(self.Instance, "Dropper") then
		self.Instance.Head.BillboardGui.Frame.ProdRate.Text = self.Worth.."$/"..self.Rate.."s"
		self.Instance.Head.BillboardGui.Frame.UpgradeName.Text = self.Display
	end
	coroutine.wrap(function()
		while true do
			self:Drop()
			wait(self.Rate)
		end
	end)()
end

function Dropper:Drop()
	local Player = self.Tycoon.Owner
	Player.leaderstats.Cash.Value += self.Worth
end

return Dropper

Unlockable(Module):

local CollectionService = game:GetService("CollectionService")
local Dropper = {}
Dropper.__index = Dropper

function Dropper.new(tycoon, instance)
	local self = setmetatable({}, Dropper)
	self.Tycoon = tycoon
	self.Instance = instance
	self.Rate = instance:GetAttribute("Rate")
	self.Worth = instance:GetAttribute("Worth")
	self.Display = instance:GetAttribute("Display")
	return self
end

function Dropper:Init()
	if CollectionService:HasTag(self.Instance, "Dropper") then
		self.Instance.Head.BillboardGui.Frame.ProdRate.Text = self.Worth.."$/"..self.Rate.."s"
		self.Instance.Head.BillboardGui.Frame.UpgradeName.Text = self.Display
	end
	coroutine.wrap(function()
		while true do
			self:Drop()
			wait(self.Rate)
		end
	end)()
end

function Dropper:Drop()
	local Player = self.Tycoon.Owner
	Player.leaderstats.Cash.Value += self.Worth
end

return Dropper

Yeah this is already fifth topic, i have no idea why it’s no work now. It glitch somehow.

Can I see the Button Module, you put is as Dropper Module

Oh sorry my bad, here is it:

local PlayerManager = require(script.Parent.Parent.PlayerManager)
local Button = {}
Button.__index = Button

function Button.new(tycoon, part)
	local self = setmetatable({}, Button)
	self.Tycoon = tycoon
	self.Instance = part
	
	return self
end

function Button:Init()
	self.Prompt = self:CreatePrompt()
	self.Prompt.Triggered:Connect(function(...)
		self:Press(...)
	end)
end

function Button:CreatePrompt()
	local prompt = Instance.new("ProximityPrompt")
	prompt.HoldDuration = 0.5
	prompt.ActionText = ""
	prompt.Parent = self.Instance.Forcefield
	self.Instance.TopPart.BillboardGui.Frame.UpgradeName.Text = self.Instance:GetAttribute("Display")
	if self.Instance:GetAttribute("Cost") == 0 then
		self.Instance.TopPart.BillboardGui.Frame.Price.Text = "FREE"
	else
		self.Instance.TopPart.BillboardGui.Frame.Price.Text = self.Instance:GetAttribute("Cost").."$"
	end
	return prompt
end

function Button:Press(player)
	local id = self.Instance:GetAttribute("Id")
	local cost = self.Instance:GetAttribute("Cost")
	local cash = PlayerManager.GetMoney(player)
	if player == self.Tycoon.Owner and cash >= cost then
		PlayerManager.SetMoney(player, cash - cost)
		self.Tycoon:PublishTopic("Button", id)
		self.Instance:Destroy()
	end
end

return Button

Have you tried to replace Tycoon with self.

self.Owner = player
self._topicEvent = Instance.new("BindableEvent")
1 Like

Well i had an topic about this. While i use self here it breaks all other scripts. And they only work if i have Tycoon.

Ok nvm as i see it got fixed (old bugs) maybe, let me test if this fixed last error

Yoo this really fixed my problem, before that was breaking whole script, but now it works! Thank you.

1 Like