Introduction
I have seen lots of guides and help topics on Roblox recreation games. But none for map voting! So today thats exactly what I’m going to teach you to do today!
Usually in Roblox games, there is 3 random maps chosen, then of those the one with the most votes is the one chosen.
Step 1: Creating the Randomizer
I’ve made a guide on this, because I was figuring out how to do this, and is very generic, so here is the guide. The guide provides an explanation.
But today, we are using the slightly modified blocks.
Use a trigger for the blocks.
Thanks to @Kosm0-o, for helping me realize that
and
is not suitable to this and or
is. 
Make sure the max random number is the same number of maps you have.
Make a lifecycle that transmits when the game starts, and is the same channel you are using for the randomizer to redo the trigger is the same channel that is transmitted on game start. [1]
Follow the guide step by step, and add the lifecycle, and you have created the randomizer!

[details = “Why does this work?”]
The variable “random” is set to a random integer from 1 to 6. The var “1” is spun to that variable. It re-spins the random integer, then sets that to var “2.” The same is done for var “3”.
After that, it performs an if
function.
With the or
check, it checks if 1=2, or 1=3, or 2=3
If it is, then it transmits on “redoTrigger,” which is the channel it starts on, making this a loop, until these conditions are not met.
Otherwise (else), it transmits on the channels. (“1room” + var “1”, “2room” + var “2”, “3room” + var “3”)
[/details]
Step 2: Creating Text and Voting Buttons
This one is real messy, so try to keep it organized.
Make a text, or google doc, saying each map, and have a number special to it [2], like this:
Set down 3 buttons.
Each button is disabled on game start, has a player active scope, and is invisible on game start.
When the buttons are pressed, transmit on “x,” and it deactivates on “x.”
Make the activation channels (different for each button):
- 1room1b
- 2room1b
- 3room1b
B is for button.
Notice: The 2nd to last number is the map id.
Also, group them like this when you are done:
The numbers on the left, are the last number in the channel aka the map id.
The numbers on the bottom, are the numbers that tell you which map option it is.
Do the exact same thing with the text. (Global Scope) [except it doesn’t have to receive on a channel ending with b.
To make it actually activate for all players, you have to use an all player relay.
Make the relay run on the same channels used in the button, except without the b.
And make the relay run on the same channel that it is run on, except with the b.
Example of the 1st relay.
Repeat this process for each relay, until all activation channels have been used.
[details = “Why does this work?”]
The buttons have a player activation scope, which means it activates upon the triggering player.
This means that you have to use a relay to activate them.
It is also invisible on game start, which means you can’t see the button. Also the “x” channels are there to prevent voting again.
Each button activates on a channel, (“1room” + var “1” (from the previous section) + “b”, “2room” + var “2” + “b”, and “3room” + var “3” + “b”)
The 2nd to last number is the map id.
It is the same with the texts, it activates globally on those same channels, and is not visible on game start.
[/details]
Step 3: Voting
Get some counters (1 for each map)
Properties (named the map id)
Wire the 1st row, to the 1st counter.
Button Pressed --> Increment Counter
That counter updates the property, “1.”
Do the same with the 2nd row, and 3rd row, and so on, so on.
(I used wire repeaters for organization, that is optional.)
[details = “What is happening?”]
All the buttons with the same map id increment a counter (when pressed). The counter is specific though, it has to be updating the same property as the last number in the activation channel (the map id)
This step is pretty straight-forward, but it gets messy with wires.
[/details]
Step 5: Ending the Voting
Follow this guide, on behalf of @NoNoWahoo.
Make the button, so the host can end the voting.
But what if the host never ends the voting?
We will have to make an auto-ending system.
You will need an overlay, trigger, counter, property, and a lifecycle.
The lifecycle is for the game start.
The trigger triggers every second. It transmits on “votingSecsLoop” and triggers on “votingSecsLoop”.
The counter’s starting value is 30 (for me, you can change it, to be however much you want it to be)
Triggered → Decrement Counter
Now the counter also updates the property secsLeftToVote.
Property Settings:
Now the overlay needs to update, so these are the blocks.
Remaining Overlay Settings:
Now, when the host presses the button or when the overlay reaches 0, broadcast on “votingEnd” or something along that idea. When that happens, make a popup show up.
Before we do that, lets run a relay on all players to stop voting. Broadcast on x.
And lets also let the players know with that relay that voting has ended.
Now lets begin with the popup.
Make the popup ask the host whether they want questions or not.
Image
Make the popup close when receiving on the channels optionClicked1 and when the call to action is pressed, broadcast on that channel.
Now, I used @NotYoyo’s guide for the question. I modified it so the channels weren’t interfering with mine, and relayed the relay only when the host clicked “yes.”
Now, lets ask the host if they want to be a spectator.
Do the exact same however, with different closing channels. I just replaced the 1 with a 2.
Wire the last popup to a trigger. (popup closed → Trigger)
Open blocks, and put this inside, on behalf of @Blackhole927:
Just change the properties to the properties used.
[details = “Why does this work?”]
When the button is pressed, the trigger is triggered. When it is triggered, the popup is opened just for the host. Then another popup is opened when closed, and when that one is closed, it runs the blocks. Also, the blocks are run when the timer is run out. When the button is pressed, the trigger is deactivated. And when the timer runs out, the trigger is deactivated. [the timer trigger loop]
It sets the greatest value to -999999. Then it sets the channel name to “1”. Then it checks if the 1st property is greater than the var “greatest”. If so, greatest is set to the current property value, and the channel name is changed to “1”
It does the same with the all the properties. Make sure: NO ELSE/ELSE IF BLOCKS.
At the very end, it broadcasts a message on var “channelname”
[/details]
Step 6: Teleportal to maps
This step, is fairly simple.
Get a relay that is all players, that runs on a map id (one for each map).
Then get a teleportal:
Make sure the teleportal and relay correspond to the right map.
Also, you could do a randomizer that teleports people.
Broadcast Message on Channel - Create Text With "mapName" + Random Integer from [1] to [10]
[details = “Why does this work?”]
When the block code above is run, it broadcasts a message on a channel. [3] Then a relay is run on all players when receiving on one of those channels. Then when it is, it teleports all players to that teleportal. Make sure the map and the relay channel are the SAME ID. (how much times do I have to say “map id” lol)
[/details]
Finishing Touches
Now, put all the buttons with the channel beginning with 1 to the left of the voting area, the ones with 2 in the middle and the ones with 3 at the end. And now, put the texts on top of the corresponding buttons. Now, to make a “fake” button, grab a barrier that activates on “x” and another that deactivates on “x”.
- 0/10
- 1/10
- 2/10
- 3/10
- 4/10
- 5/10
- 6/10
- 7/10
- 8/10
- 9/10
- 10/10
- 11/10
Anyways, that’s it, hope you liked this! If you did, a is appreciated! But I’m open to any critics :D