Map Voting Script Not Working

I followed Alvinblox’s youtube tutorial on making a map voting script, but it is not working. The gui setup and voting itself works, but when it calculates the winner it might pick the wrong one sometimes, but others it is correct. I have gone through my script, but I cannot find the problem. I am very new to scripting, so if it is possible to make it easily understanable, please do. Any help would be appreciated!

The script:

--Variables on server--
local plates = game.Workspace:WaitForChild("Plates")
local maps = {"Monster", "Clash"}
local voteTime = game.ReplicatedStorage.voteTime

local connections = {}
local votes = {}

local function choosePlate()
	local plateTable = {game.Workspace.Plates.Monster, game.Workspace.Plates.Clash}
	for i,v in pairs(plateTable) do
		if v:FindFirstChild("InUse") then
			if v.InUse.Value == false then
				v.InUse.Value = true
				return v
			end
		end
	end
	return nil
end

local function setupPlate(mapName)
	--Pick a plate not already in use
	local plate = choosePlate()
	votes[mapName] = {}
	--Set up viewport for that plate
	game.ReplicatedStorage.SendMapChoices:FireAllClients(plate,mapName)
	--Touched event that adds a vote
	connections[#connections+1] = plate.Touched:Connect(function(hit)
		local plr = game.Players:GetPlayerFromCharacter(hit.Parent)
		
		if plr then
			--Remove votes for this player from other plates
			for plateName, plateTable in pairs(votes) do
				for player, playerValue in pairs(plateTable) do
					if player.Name == plr.Name then
						plateTable[player] = nil
					end
				end
			end
			votes[mapName][plr] = true
		end
	end)
	--Store votes in a table
end

local function startVote()
	voteTime.Value = 20
	local chosenMaps = maps
	
	for i,v in pairs(chosenMaps) do
		setupPlate(v)
	end
	
	for i = 20, 0, -0.1 do
		for mapName, mapTable in pairs(votes) do
			local count = 0
			for playerName, value in pairs(mapTable) do
				count += 1
			end
			game.ReplicatedStorage.UpdateMapVotes:FireAllClients(mapName, count, i)
		end
		task.wait(0.1)
	end
	
	--Find the map with the most votes
	local highestVoteCount = 0
	local highestVoteMapNames = {}
	local winningMapName = ""
	
	for mapName, mapTable in pairs(votes) do
		local count = 0
		for playerName, value in pairs(mapTable) do
			count += 1
		end
		
		if count >= highestVoteCount then
			highestVoteCount = count
			table.insert(highestVoteMapNames,mapName)
		end
	end
	
	if #highestVoteMapNames > 1 then
		winningMapName = highestVoteMapNames[math.random(1, #highestVoteMapNames)]
	else
		winningMapName = highestVoteMapNames[1]
	end
	
	print("Chosen map via vote: "..winningMapName)
	print("Loading map "..winningMapName)
	
	game.ReplicatedStorage.Announce:FireAllClients("Next Map: "..winningMapName) --Shows a gui saying the winner
	if winningMapName == "Monster" then
		game.ReplicatedStorage.MapWonEvent.MonsterChosen:FireAllClients() --Plays the Monster song
	elseif winningMapName == "Clash" then
		game.ReplicatedStorage.MapWonEvent.ClashChosen:FireAllClients() -- Plays the Clash song
	end
	game.ReplicatedStorage.ClearMapChoices:FireAllClients() -- Hides the Guis on the plates
	for i,v in pairs(connections) do
		if v then
			v:Disconnect()
		end
	end
	
	for i,v in pairs(plates:GetChildren()) do
		v.InUse.Value = false
	end
	
	votes = {}
end

wait(1)
startVote()

is the value of winningMapName what you expect?

I am in school right now, so I can’t check, but I will as soon as I get home.

No, even if one has more votes than the other, it is still a random chance if it works.

Ok following on from my question if you run this in studio with three players and choose to vote Monster in two and Clash in the 3rd what do you get in the winningMapName?

I ran the script three times, for two of the times Clash was chosen and once Monster was, even though more players were on Monster than Clash.