So I am making a voting system for my game, that two scripts communicate with each other: the main game script and the voting script. In the voting script I have some code to run when a bindable event, "Voting", fires. The problem is that the bindable event is firing multiple times and the global variables bug.
Look:
local AvMinigames = game.ServerStorage.Minigames.Images:GetChildren()
local display = script.Parent.Tela.SurfaceGui.Tela
local votesBEV = game.ReplicatedStorage.voting
local buttons = script.Parent:GetChildren()
local PlayerLocks = {}
local VotesWithMinigames = {}
local PlayerVotes = {}
local ButTouchedEVS = {}
local displays = {}
local function beVisible(bool)
if bool == true then
display.Visible = true
for i, v in pairs(buttons)do
v.SurfaceGui.Nome.Visible = true
end
else
display.Visible = false
for i, v in pairs(buttons)do
v.SurfaceGui.Nome.Visible = false
end
end
end
for i, v in pairs(display:GetChildren()) do
if v.ClassName == "ImageLabel" then
displays[#displays + 1] = v
end
end
for i, v in pairs(buttons) do
if v.ClassName ~= "Part" then
table.remove(buttons, i)
end
end
for i, v in pairs(buttons) do
if v.Name == "Tela" then
table.remove(buttons, i)
end
end
game.Players.PlayerRemoving:Connect(function(player)
if table.find(PlayerLocks, player) ~= nil then
local minigame = PlayerVotes[player]
VotesWithMinigames[minigame] = VotesWithMinigames[minigame] - 1
display[minigame]:WaitForChild("Votos").Text = VotesWithMinigames[minigame]
PlayerVotes[player] = nil
end
end)
votesBEV.Event:Connect(function(caso)
AvMinigames = game.ServerStorage.Minigames.Images:GetChildren()
if caso == 1 then
beVisible(true)
local function checktouch(part, button)
if part.Parent:FindFirstChild("Humanoid") then
local character = part.Parent
if table.find(PlayerLocks, character.Name) == nil then
PlayerLocks[#PlayerLocks + 1] = character.Name
local minigame = button.SurfaceGui.Nome.Text
if VotesWithMinigames[minigame] == nil then
PlayerVotes[character.Name] = minigame
VotesWithMinigames[minigame] = 1
display[minigame]:WaitForChild("Votos").Text = VotesWithMinigames[minigame]
else
PlayerVotes[character.Name] = minigame
VotesWithMinigames[minigame] = VotesWithMinigames[minigame] + 1
display[minigame]:WaitForChild("Votos").Text = VotesWithMinigames[minigame]
end
end
end
end
for i, v in pairs(displays) do
local imagenum = math.random(1, #AvMinigames)
displays[i].Image = AvMinigames[imagenum].Image
v.Name = AvMinigames[imagenum].Name
script.Parent:FindFirstChild(i).SurfaceGui.Nome.Text = AvMinigames[imagenum].Name
print("Image of minigame ".. AvMinigames[imagenum].Name.. " removed from the possibilities of minigames. ".. i)
table.remove(AvMinigames, imagenum)
end
for i, v in pairs(buttons) do
ButTouchedEVS[#ButTouchedEVS + 1] = v.Touched:Connect(function(touchedpart)
checktouch(touchedpart, v)
end)
end
elseif caso == 2 then
beVisible(false)
local MostVoted = {}
local loop = 1
VotesWithMinigames["Test"] = false
for minigame, votes in pairs(VotesWithMinigames) do
if minigame ~= "Test" then
VotesWithMinigames["Test"] = true
if loop == 1 then
MostVoted = {minigame, votes}
else
if votes == MostVoted[2] then
if not #MostVoted > 2 then
MostVoted[3] = minigame
MostVoted[4] = votes
elseif #MostVoted == 4 then
MostVoted[5] = minigame
MostVoted[6] = votes
end
elseif votes > MostVoted[2] then
table.clear(MostVoted)
MostVoted = {minigame, votes}
print("Minigame ".. minigame.. " with ".. votes.. " votes.")
end
end
end
for minigame, votes in pairs(VotesWithMinigames) do
print(tostring(votes))
if minigame == "Test" and votes == false then
local random = math.random(1,3)
VotesWithMinigames["Test"] = nil
MostVoted[1] = buttons[random].SurfaceGui.Nome.Text
MostVoted[2] = 0
print("Voting not done. Random minigame chosen: ".. MostVoted[1])
end
end
if #MostVoted > 2 then
if #MostVoted == 4 then
local random = math.random(1,2)
if random == 1 then
table.remove(MostVoted, 3)
table.remove(MostVoted, 4)
else
table.remove(MostVoted, 1)
table.remove(MostVoted, 2)
end
elseif #MostVoted == 6 then
local random = math.random(1,3)
if random == 1 then
table.remove(MostVoted, 3)
table.remove(MostVoted, 4)
table.remove(MostVoted, 5)
table.remove(MostVoted, 6)
elseif random == 2 then
table.remove(MostVoted, 1)
table.remove(MostVoted, 2)
table.remove(MostVoted, 5)
table.remove(MostVoted, 6)
elseif random == 3 then
table.remove(MostVoted, 1)
table.remove(MostVoted, 2)
table.remove(MostVoted, 3)
table.remove(MostVoted, 4)
end
end
end
print("Most voted minigame: ".. MostVoted[1].. " with ".. MostVoted[2].. " votes.")
_G.minigamec = game.Workspace.Minijogos[MostVoted[1]]
VotesWithMinigames = {}
PlayerLocks = {}
PlayerVotes = {}
for i, v in pairs(displays)do
v.Name = i
v.Votos.Text = 0 -- Reseta os nomes das imagens e o número (visível) de votos --
end
end
end
end)
You don't need to understand the script, it's fine in itself, but the problem is what the output is indicating:
14:56:58.258 false - Server - Voto:144 14:56:58.259 Voting not done. Random minigame chosen: Sinking tiles - Server - Voto:154 14:56:58.259 1 - Server - Voto:144 14:56:58.260 Most voted minigame: Sinking tiles with 0 votes. - Server - Voto:205 14:56:58.260 true - Server - Voto:144 14:56:58.260 Most voted minigame: Furnace jumps with 1 votes. - Server - Voto:205 14:56:58.475 false - Server - Voto:144 14:56:58.476 Voting not done. Random minigame chosen: Furnace jumps - Server - Voto:154 14:56:58.476 Most voted minigame: Furnace jumps with 0 votes. - Server - Voto:205
You see? The output indicates that the piece of code is running 2 or 3 times and the minigame selection bugs.

2 comments
In this script you use the [votesBEV] variable once and that's to connect the event to function, where do you fire it from? You probably fire it multiple times from other script.
Sorry for not responding it for you, I fire it from an main script that just fires it once, bc it has an wait loop until one var is true