Difference between revisions of "TF2 Voting"
(→CallVoteFailed) |
(Formatted usermessages.) |
||
Line 14: | Line 14: | ||
===VoteSetup=== | ===VoteSetup=== | ||
{{qnotice|Sent to a player when they load the Call Vote screen, lists what votes are allowed on the server}}<br> | {{qnotice|Sent to a player when they load the Call Vote screen, lists what votes are allowed on the server}}<br> | ||
+ | {{begin-hl2msg|VoteSetup|string}} | ||
+ | {{hl2msg|byte|issue_count|Count of vote issues allowed on this server}} | ||
+ | {{hl2msg|string...|issue|An issue allowed to vote on}} | ||
+ | {{end-hl2msg}} | ||
− | + | There is one string sent for each supported issue. | |
− | |||
− | |||
Valid strings are: | Valid strings are: | ||
* Kick | * Kick | ||
Line 27: | Line 29: | ||
===CallVoteFailed=== | ===CallVoteFailed=== | ||
{{qnotice|Sent to a player when they attempt to call a vote and fail.}}<br> | {{qnotice|Sent to a player when they attempt to call a vote and fail.}}<br> | ||
− | + | {{begin-hl2msg|CallVoteFailed|string}} | |
− | + | {{hl2msg|byte|failure_code|Failure reason (1-2, 5-10)}} | |
− | + | {{hl2msg|short|time|For failure reason 2, time left until client can start another vote}} | |
+ | {{end-hl2msg}} | ||
Valid Failure Codes are:<br /> | Valid Failure Codes are:<br /> | ||
Line 44: | Line 47: | ||
{{qnotice|Sent to all players participating in a vote.}}<br /> | {{qnotice|Sent to all players participating in a vote.}}<br /> | ||
− | + | {{begin-hl2msg|VoteStart|string}} | |
− | + | {{hl2msg|byte|team|Team index or -1 for all}} | |
− | + | {{hl2msg|byte|entityid|Client index (NOT USERID) of person who started the vote, or 99 for the server.}} | |
− | + | {{hl2msg|string|issue|Vote issue translation string}} | |
− | + | {{hl2msg|string|param1|Vote issue text}} | |
+ | {{hl2msg|bool|yesno|true for Yes/No, false for Multiple choice}} | ||
+ | {{end-hl2msg}} | ||
===VotePass=== | ===VotePass=== | ||
{{qnotice|Sent to all players after a vote passes.}}<br /> | {{qnotice|Sent to all players after a vote passes.}}<br /> | ||
− | + | {{begin-hl2msg|VotePass|string}} | |
− | + | {{hl2msg|byte|team|Team index or -1 for all}} | |
− | + | {{hl2msg|string|issue|Vote issue translation string}} | |
+ | {{hl2msg|string|param1|Vote winner}} | ||
+ | {{end-hl2msg}} | ||
− | === | + | ===VoteFailed=== |
{{qnotice|Sent to all players after a vote fails.}}<br /> | {{qnotice|Sent to all players after a vote fails.}}<br /> | ||
− | + | {{begin-hl2msg|VoteFailed|string}} | |
− | + | {{hl2msg|byte|team|Team index or -1 for all}} | |
+ | {{hl2msg|byte|failure_code|Failure reason code (0, 3-4)}} | ||
+ | {{end-hl2msg}} | ||
Valid Failure codes are:<br /> | Valid Failure codes are:<br /> |
Revision as of 13:49, 15 July 2011
Team Fortress 2 has a new voting system based on the Left 4 Dead Voting system and is controlled by Game Events and User Messages. You can use either a string from the resource file, or TF_playerid_noteam which will let you create any vote you want.
How voting works
- The server sends a vote_options event.
- The values it sends are garbage data (or the previous multiple choice vote's choices) for Yes/No votes or the actual vote options for multiple choice.
- The VoteStart User Message is sent, the last argument determines the vote type.
- Clients use the "vote" command to register their votes (option1 through option5), after which the server sends a vote_cast event with a 0-based option number (so option1 = 0, option5 = 4).
- When the vote is complete, the server send either a VotePass or VoteFailed User Message.
User Messages
The User Messages that exist in the TF2 Voting system are:
VoteSetup
Note: Sent to a player when they load the Call Vote screen, lists what votes are allowed on the server
Name: | VoteSetup | ||||||
Structure: |
|
There is one string sent for each supported issue. Valid strings are:
- Kick
- RestartGame
- ChangeLevel
- NextLevel
- ScrambleTeams
CallVoteFailed
Note: Sent to a player when they attempt to call a vote and fail.
Name: | CallVoteFailed | ||||||
Structure: |
|
Valid Failure Codes are:
1 - Cannot call vote while other players are still loading
2 - You called a vote recently and cannot call another one for X seconds (second argument to CallVoteFailed specifies the number of seconds)
5 - Server has disabled that issue.
6 - That map does not exist.
7 - You must specify a map name
8 - This vote failed recently
9 - Your team cannot call this vote
10 - Voting not allowed while Waiting for Players
VoteStart
Note: Sent to all players participating in a vote.
Name: | VoteStart | |||||||||||||||
Structure: |
|
VotePass
Note: Sent to all players after a vote passes.
Name: | VotePass | |||||||||
Structure: |
|
VoteFailed
Note: Sent to all players after a vote fails.
Name: | VoteFailed | ||||||
Structure: |
|
Valid Failure codes are:
0 - Generic "Vote Failed" message
3 - Yes votes must outnumber No votes
4 - Not Enough Votes
Events
Used Events
vote_cast
Note: Sent to all players when a player chooses a vote option (or more specifically, the server receives a vote command)
Name: | vote_cast | |||||||||
Structure: |
|
vote_options
Note: Sent to players before VoteStart UserMessage to populate choices for a multiple choice vote
Name: | vote_options | ||||||||||||||||||
Structure: |
|
Unused Events
These are events that existed in L4D, but remain unused in the TF2 vote system.
vote_ended
Name: | vote_ended | |
Structure: |
|
vote_started
Name: | vote_started | ||||||||||||
Structure: |
|
vote_changed
Name: | vote_changed | ||||||||||||||||||
Structure: |
|
vote_passed
Name: | vote_passed | |||||||||
Structure: |
|
vote_failed
Name: | vote_failed | |||
Structure: |
|
Example voting plugin
This is a basic plugin that starts a vote, "Is gaben fat?". It does not ensure the same client does not vote multiple times, nor does it actually kick the user.
#include <sourcemod> // TF2's internal map vote uses client index 99 for the server #define TF2_SERVER_CLIENT_INDEX 99 #define TF2_TEAM_ALL -1 new yesvotes; new novotes; #define MAX_VOTES 4 public Plugin:myinfo = { name = "Test Yes/No Vote", author = "Powerlord", description = "A test vote plugin for the AlliedMods wiki", version = "1.0", url = "http://wiki.alliedmods.net/TF2_Voting" } public OnPluginStart() { RegConsoleCmd("testvote",Callvote_Handler); RegConsoleCmd("vote", vote); } public Action:Callvote_Handler(client, args) { new Handle:bf = StartMessageAll("VoteStart", USERMSG_RELIABLE); BfWriteByte(bf, TF2_TEAM_ALL); BfWriteByte(bf, TF2_SERVER_CLIENT_INDEX); BfWriteString(bf, "#TF_playerid_noteam"); BfWriteString(bf, "Is gaben fat?"); BfWriteBool(bf, true); EndMessage(); yesvotes = 0; novotes = 0; return Plugin_Handled; } UpdateVotes() { if (yesvotes+novotes >= MAX_VOTES) { PrintToServer("voting complete!"); if (yesvotes > novotes) { new Handle:bf = StartMessageAll("VotePass"); BfWriteByte(bf, TF2_TEAM_ALL); BfWriteString(bf, "#TF_playerid_noteam"); BfWriteString(bf, "Gaben is fat"); EndMessage(); } else { new Handle:bf = StartMessageAll("VoteFailed"); BfWriteByte(bf, TF2_TEAM_ALL); // Check list of failure reasons BfWriteByte(bf, 3); EndMessage(); } } } // If the TF2 vote system is running (sv_allow_votes 1), this needs to be a command listener because TF2 registers the vote command only when a vote is ongoing, and thus hooking it using RegConsoleCmd doesn't work. public Action:vote(client, args) { new String:arg[8]; new option = 0; GetCmdArg(1,arg,8); PrintToServer("Got vote %s from %i",arg,client); if (strcmp(arg,"option1",true) == 0) { yesvotes++; option = 0; } else if (strcmp(arg,"option2",true) == 0) { novotes++; option = 1; } new Handle:msg = CreateEvent("vote_cast"); SetEventInt(msg, "entityid", client); SetEventInt(msg, "team", -1); SetEventInt(msg, "vote_option", option); FireEvent(msg); UpdateVotes(); return Plugin_Continue; }
See the following images for examples what this looks like: