So I recently had a problem involving a loop and a touched event. When I looped through the buttons and said when this button is touched do this, it did not work. So now I am cloning a module script into each button with an event in it:
local function findBaseplate(buildLevel, serverTycoon)
for i,v in pairs(serverTycoon:GetChildren()) do
if v.IsABaseplate.Value then
if v.RequiredLevel.Value == buildLevel then
return v
end
end
end
end
local function createDependentButtons(itemName, tycoon)
if #tycoon.Buttons:GetChildren() >= 1 then
for i,v in pairs(tycoon.Buttons:GetChildren()) do
wait()
if itemName == v.Dependency.Value then
v.Head.Transparency = 0
v.Head.CanCollide = true
end
end
end
end
local debounce = true
script.Parent.Touched:Connect(function(hit)
if script.Parent.CanCollide then
if hit.Parent:FindFirstChild("Humanoid") then
if hit.Parent.Humanoid.Health > 0 then
local tycoon = script.Parent.Parent.Parent.Parent
local plr = game.Players:GetPlayerFromCharacter(hit.Parent)
local plrName = plr.Name
if tycoon.IsOwned.Value then
if plrName == tycoon.Owner.Value then
local plrInfo = game.ServerStorage:FindFirstChild(plrName):WaitForChild("PlayerInfo")
local plrMoney = plrInfo.Money
local buildLevel = plrInfo.BuildLevel.Value
local serverTycoon = game.ServerStorage:FindFirstChild("Model"..tycoon.Color.Value.."Tycoon")
local baseplate = findBaseplate(buildLevel, serverTycoon)
local baseplateName = baseplate.Name
local tycoonBaseplate = tycoon:FindFirstChild("Baseplates"):WaitForChild(baseplateName)
local serverBaseplate = serverTycoon:WaitForChild(baseplateName)
local price = script.Parent.Parent.Price
if plr then
if debounce then
debounce = false
if plrMoney.Value >= price.Value then
local purchasableItemName = script.Parent.Parent.Item.Value
local itemType = script.Parent.Parent.ItemType
plrMoney.Value = plrMoney.Value - price.Value
if itemType.Value == "Dropper" then
local copy = serverBaseplate.PurchasableItems:FindFirstChild(purchasableItemName)
copy.Parent = tycoonBaseplate.PurchasedItems
local runDropperFunction = require(game.ServerStorage.ModuleScripts.RunDropper)
wait()
runDropperFunction(copy)
script.Parent.CanCollide = false
script.Parent.Transparency = 1
elseif itemType.Value == "Upgrader" then
local copy = serverBaseplate.PurchasableItems:FindFirstChild(purchasableItemName)
copy.Parent = tycoonBaseplate.PurchasedItems
local runUpgrader = require(game.ServerStorage.ModuleScripts.UpgraderScript)
wait()
runUpgrader(copy)
script.Parent.CanCollide = false
script.Parent.Transparency = 1
else
print("Error detecting the type of object you are trying to purchase.")
plr:Kick("Something went wrong please rejoin")
end
createDependentButtons(purchasableItemName, tycoon)
else
print(plrName.." does not have enough cash for the purchase")
end
wait(2)
debounce = true
end
end
end
end
end
end
end
end)
return true
First I would like to know if this is the best way or if there is a better way. Second I have a module script which is required by the one above. Here it is:
local function runUpgrader(upgrader)
spawn(function()
local upgradeAmount = upgrader:FindFirstChild("UpgradeAmount")
local upgradeType = upgrader:FindFirstChild("UpgradeType")
if upgradeAmount and upgradeType then
upgrader.UpgraderPart.Touched:Connect(function(hit)
if hit.Name == "Ore" then
if hit:FindFirstChild("Cash") then
local cash = hit.Cash
if upgradeType.Value == "Addition" then
cash.Value = hit.Cash.Value + upgradeAmount
elseif upgradeType.Value == "Multiplication" then
cash.Value = cash.Value * upgradeAmount
elseif upgradeType.Value == "ModulusAddition" then
print("Not currently a valid upgrade method")
elseif upgradeType.Value == "ModulusMultiplication" then
print("Not currently a valid upgrade method")
end
end
end
end)
end
end)
end
return runUpgrader
I am wondering if it is a good idea to have that many coroutines going on in my game and if it is not encouraged. Because before this I was doing the same thing as the buttons. I was cloning the module script into the dropper and having the event in the module script. Is there a better way? If the better way is to use coroutines then I would definitely use it for the button module script as well. Please tell me if the methods I am using are good or bad and what is the best way to go about this kind of thing. Thanks!

1 comment
The coroutine is the spawn near the beginning of the second script in the question.