Difference between revisions of "Left 4 Voting"
(Added new links) |
(Added Server Entity) |
||
| Line 7: | Line 7: | ||
# Clients use the "Vote" command to register their votes ("Yes" or "No"), after which the server sends a vote_cast_yes or vote_cast_no event, followed by a vote_changed event with updated numbers. | # Clients use the "Vote" command to register their votes ("Yes" or "No"), after which the server sends a vote_cast_yes or vote_cast_no event, followed by a vote_changed event with updated numbers. | ||
# Server ends the vote by sending vote_ended event, followed by a vote_passed or vote_failed event. | # Server ends the vote by sending vote_ended event, followed by a vote_passed or vote_failed event. | ||
| + | |||
| + | == Server Entity == | ||
| + | |||
| + | The server should update this as appropriate. Unfortunately, the valid values for m_iActiveIssueIndex is unknown. | ||
| + | |||
| + | {{begin-hl2msg|vote_controller (CVoteController)|string}} | ||
| + | {{hl2msg|int|m_activeIssueIndex|Number of the active issue}} | ||
| + | {{hl2msg|int|m_onlyTeamToVote|Corresponds to VoteStart's team argument.}} | ||
| + | {{hl2msg|int|m_votesYes|Current Yes votes}} | ||
| + | {{hl2msg|int|m_votesNo|Current No votes}} | ||
| + | {{hl2msg|int|m_potentialVotes|Number of players eligible to vote}} | ||
| + | {{end-hl2msg}} | ||
== Console Commands == | == Console Commands == | ||
Revision as of 16:36, 2 February 2013
Left 4 Dead has a new VGUI voting system, it's controlled by a bunch of events. You can use either a string from the resource file, or L4D_TargetID_Player which will let you create any vote you want.
Contents
How voting works
- Server sends a vote_started event
- Servers sends a vote_changed event
- Clients use the "Vote" command to register their votes ("Yes" or "No"), after which the server sends a vote_cast_yes or vote_cast_no event, followed by a vote_changed event with updated numbers.
- Server ends the vote by sending vote_ended event, followed by a vote_passed or vote_failed event.
Server Entity
The server should update this as appropriate. Unfortunately, the valid values for m_iActiveIssueIndex is unknown.
| Name: | vote_controller (CVoteController) | |||||||||||||||
| Structure: |
|
Console Commands
Vote
Note: This command is only valid when a vote is ongoing.
| Name: | Vote | |||
| Structure: |
|
Events
Note: team is -1 when sent to all players)
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: |
|
vote_cast_yes
| Name: | vote_cast_yes | ||||||
| Structure: |
|
vote_cast_no
| Name: | vote_cast_no | ||||||
| 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>
new yesvotes;
new novotes;
#define MAX_VOTES 4
public OnPluginStart()
{
RegConsoleCmd("testvote",Callvote_Handler);
RegConsoleCmd("Vote",vote);
}
public Action:Callvote_Handler(client, args)
{
new Handle:msg = CreateEvent("vote_started");
SetEventString(msg,"issue","#L4D_TargetID_Player");
SetEventString(msg,"param1","Is gaben fat?");
SetEventInt(msg,"team",0);
SetEventInt(msg,"initiator",0);
FireEvent(msg);
yesvotes = 0;
novotes = 0;
UpdateVotes();
return Plugin_Handled;
}
public UpdateVotes()
{
new Handle:msg = CreateEvent("vote_changed");
SetEventInt(msg,"yesVotes",yesvotes);
SetEventInt(msg,"noVotes",novotes);
SetEventInt(msg,"potentialVotes",MAX_VOTES);
FireEvent(msg);
if (yesvotes+novotes == MAX_VOTES)
{
PrintToServer("voting complete!");
msg = CreateEvent("vote_ended");
FireEvent(msg);
if (yesvotes > novotes)
{
msg = CreateEvent("vote_passed");
SetEventString(msg,"details","#L4D_TargetID_Player");
SetEventString(msg,"param1","Gaben is fat");
SetEventInt(msg,"team",0);
FireEvent(msg);
}
else
{
msg = CreateEvent("vote_failed");
SetEventInt(msg,"team",0);
FireEvent(msg);
}
}
}
public Action:vote(client, args)
{
new String:arg[8];
GetCmdArg(1,arg,8);
PrintToServer("Got vote %s from %i",arg,client);
if (strcmp(arg,"Yes",true) == 0)
{
yesvotes++;
}
else if (strcmp(arg,"No",true) == 0)
{
novotes++;
}
UpdateVotes();
return Plugin_Continue;
}
See the following images for examples what this looks like:
http://devicenull.org/temp/l4d_question.jpg
http://devicenull.org/temp/l4d_result.jpg
See Also
- Left 4 Voting 2
- TF2 Voting
- BuiltinVotes, a SourceMod extension that exposes a voting API that uses this voting system.