-
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. -
What is the issue? Include screenshots / videos if possible!
Explained on first. Here is an video of that: Problem - YouTube -
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.