merged vote start/end messages

This commit is contained in:
oy 2012-08-14 00:16:54 +02:00
parent d2924b5ad6
commit dc22f9fa1c
5 changed files with 117 additions and 106 deletions

View file

@ -3,13 +3,14 @@ from datatypes import *
Pickups = Enum("PICKUP", ["HEALTH", "ARMOR", "GRENADE", "SHOTGUN", "LASER", "NINJA"])
Emotes = Enum("EMOTE", ["NORMAL", "PAIN", "HAPPY", "SURPRISE", "ANGRY", "BLINK"])
Emoticons = Enum("EMOTICON", ["OOP", "EXCLAMATION", "HEARTS", "DROP", "DOTDOT", "MUSIC", "SORRY", "GHOST", "SUSHI", "SPLATTEE", "DEVILTEE", "ZOMG", "ZZZ", "WTF", "EYES", "QUESTION"])
Votes = Enum("VOTE", ["UNKNOWN", "START_OP", "START_KICK", "START_SPEC", "END_ABORT", "END_PASS", "END_FAIL"])
PlayerFlags = Flags("PLAYERFLAG", ["CHATTING", "SCOREBOARD", "READY", "DEAD", "WATCHING"])
GameFlags = Flags("GAMEFLAG", ["TEAMS", "FLAGS", "SURVIVAL"])
GameStateFlags = Flags("GAMESTATEFLAG", ["WARMUP", "SUDDENDEATH", "ROUNDOVER", "GAMEOVER", "PAUSED", "STARTCOUNTDOWN"])
CoreEventFlags = Flags("COREEVENTFLAG", ["GROUND_JUMP", "AIR_JUMP", "HOOK_ATTACH_PLAYER", "HOOK_ATTACH_GROUND", "HOOK_HIT_NOHOOK"])
GameMsgIDs = Enum("GAMEMSG", ["TEAM_SWAP", "VOTE_ABORT", "VOTE_PASS", "VOTE_FAIL", "VOTE_DENY_SPECCALL", "VOTE_DENY_ACTIVE", "VOTE_DENY_KICK", "VOTE_DENY_KICKID",
GameMsgIDs = Enum("GAMEMSG", ["TEAM_SWAP", "VOTE_DENY_SPECCALL", "VOTE_DENY_ACTIVE", "VOTE_DENY_KICK", "VOTE_DENY_KICKID",
"VOTE_DENY_KICKSELF", "VOTE_DENY_KICKADMIN", "VOTE_DENY_SPEC", "VOTE_DENY_SPECID", "VOTE_DENY_SPECSELF", "SPEC_INVALIDID", "TEAM_SHUFFLE",
"TEAM_LOCK", "TEAM_UNLOCK", "TEAM_BALANCE", "TEAM_DENY_LOCK", "TEAM_DENY_BALANCE", "CTF_DROP", "CTF_RETURN",
@ -19,11 +20,8 @@ GameMsgIDs = Enum("GAMEMSG", ["TEAM_SWAP", "VOTE_ABORT", "VOTE_PASS", "VOTE_FAIL
"CTF_CAPTURE",
"VOTE_DENY_INVALIDOP", "VOTE_KICKYOU", "VOTE_FORCE",
"VOTE_FORCEOP", "VOTE_FORCESPEC",
"VOTE_CALLOP", "VOTE_CALLKICK", "VOTE_CALLSPEC"])
"VOTE_DENY_INVALIDOP", "VOTE_KICKYOU"])
RawHeader = '''
@ -58,6 +56,7 @@ Enums = [
Pickups,
Emotes,
Emoticons,
Votes,
GameMsgIDs,
]
@ -296,6 +295,8 @@ Messages = [
]),
NetMessage("Sv_VoteSet", [
NetIntRange("m_ClientID", -1, 'MAX_CLIENTS-1'),
NetEnum("m_Type", Votes),
NetIntRange("m_Timeout", 0, 60),
NetStringStrict("m_pDescription"),
NetStringStrict("m_pReason"),

View file

@ -1,12 +1,16 @@
/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
/* If you are missing that file, acquire a complete release at teeworlds.com. */
#include <base/vmath.h>
#include <engine/shared/config.h>
#include <game/generated/protocol.h>
#include <base/vmath.h>
#include <game/client/render.h>
#include <game/generated/protocol.h>
#include "chat.h"
#include "voting.h"
void CVoting::ConCallvote(IConsole::IResult *pResult, void *pUserData)
{
CVoting *pSelf = (CVoting*)pUserData;
@ -190,15 +194,62 @@ void CVoting::OnMessage(int MsgType, void *pRawMsg)
if(MsgType == NETMSGTYPE_SV_VOTESET)
{
CNetMsg_Sv_VoteSet *pMsg = (CNetMsg_Sv_VoteSet *)pRawMsg;
OnReset();
char aBuf[128];
if(pMsg->m_Timeout)
{
OnReset();
str_copy(m_aDescription, pMsg->m_pDescription, sizeof(m_aDescription));
str_copy(m_aReason, pMsg->m_pReason, sizeof(m_aReason));
m_Closetime = time_get() + time_freq() * pMsg->m_Timeout;
if(pMsg->m_ClientID != -1)
{
switch(pMsg->m_Type)
{
case VOTE_START_OP:
str_format(aBuf, sizeof(aBuf), Localize("'%s' called vote to change server option '%s' (%s)"), m_pClient->m_aClients[pMsg->m_ClientID].m_aName,
pMsg->m_pDescription, pMsg->m_pReason);
m_pClient->m_pChat->AddLine(-1, 0, aBuf);
break;
case VOTE_START_KICK:
str_format(aBuf, sizeof(aBuf), Localize("'%s' called for vote to kick '%s' (%s)"), m_pClient->m_aClients[pMsg->m_ClientID].m_aName,
pMsg->m_pDescription, pMsg->m_pReason);
m_pClient->m_pChat->AddLine(-1, 0, aBuf);
break;
case VOTE_START_SPEC:
str_format(aBuf, sizeof(aBuf), Localize("'%s' called for vote to move '%s' to spectators (%s)"), m_pClient->m_aClients[pMsg->m_ClientID].m_aName,
pMsg->m_pDescription, pMsg->m_pReason);
m_pClient->m_pChat->AddLine(-1, 0, aBuf);
}
}
}
else
OnReset();
{
switch(pMsg->m_Type)
{
case VOTE_START_OP:
str_format(aBuf, sizeof(aBuf), Localize("Admin forced server option '%s' (%s)"), pMsg->m_pDescription, pMsg->m_pReason);
m_pClient->m_pChat->AddLine(-1, 0, aBuf);
break;
case VOTE_START_SPEC:
str_format(aBuf, sizeof(aBuf), Localize("Admin moved '%s' to spectator (%s)"), pMsg->m_pDescription, pMsg->m_pReason);
m_pClient->m_pChat->AddLine(-1, 0, aBuf);
break;
case VOTE_END_ABORT:
m_pClient->m_pChat->AddLine(-1, 0, Localize("Vote aborted"));
break;
case VOTE_END_PASS:
if(pMsg->m_ClientID == -1)
m_pClient->m_pChat->AddLine(-1, 0, Localize("Admin forced vote yes"));
else
m_pClient->m_pChat->AddLine(-1, 0, Localize("Vote passed"));
break;
case VOTE_END_FAIL:
if(pMsg->m_ClientID == -1)
m_pClient->m_pChat->AddLine(-1, 0, Localize("Admin forced vote no"));
else
m_pClient->m_pChat->AddLine(-1, 0, Localize("Vote failed"));
}
}
}
else if(MsgType == NETMSGTYPE_SV_VOTESTATUS)
{

View file

@ -117,8 +117,6 @@ enum
PARA_II,
PARA_III,
PARA_S,
PARA_SS,
PARA_SSS,
};
struct CGameMsg
@ -130,9 +128,6 @@ struct CGameMsg
static CGameMsg gs_GameMsgList[NUM_GAMEMSGS] = {
{/*GAMEMSG_TEAM_SWAP*/ DO_CHAT, PARA_NONE, "Teams were swapped"},
{/*GAMEMSG_VOTE_ABORT*/ DO_CHAT, PARA_NONE, "Vote aborted"},
{/*GAMEMSG_VOTE_PASS*/ DO_CHAT, PARA_NONE, "Vote passed"},
{/*GAMEMSG_VOTE_FAIL*/ DO_CHAT, PARA_NONE, "Vote failed"},
{/*GAMEMSG_VOTE_DENY_SPECCALL*/ DO_CHAT, PARA_NONE, "Spectators aren't allowed to start a vote."},
{/*GAMEMSG_VOTE_DENY_ACTIVE*/ DO_CHAT, PARA_NONE, "Wait for current vote to end before calling a new one."},
{/*GAMEMSG_VOTE_DENY_KICK*/ DO_CHAT, PARA_NONE, "Server does not allow voting to kick players"},
@ -164,15 +159,7 @@ static CGameMsg gs_GameMsgList[NUM_GAMEMSGS] = {
{/*GAMEMSG_CTF_CAPTURE*/ DO_SPECIAL, PARA_III, ""}, // special - play ctf capture sound + capture chat message
{/*GAMEMSG_VOTE_DENY_INVALIDOP*/ DO_CHAT, PARA_S, "'%s' isn't an option on this server"},
{/*GAMEMSG_VOTE_KICKYOU*/ DO_CHAT, PARA_S, "'%s' called for vote to kick you"},
{/*GAMEMSG_VOTE_FORCE*/ DO_CHAT, PARA_S, "admin forced vote %s"},
{/*GAMEMSG_VOTE_FORCEOP*/ DO_CHAT, PARA_SS, "admin forced server option '%s' (%s)"},
{/*GAMEMSG_S2_VOTE_FORCESPEC*/ DO_CHAT, PARA_SS, "admin moved '%s' to spectator (%s)"},
{/*GAMEMSG_VOTE_CALLOP*/ DO_CHAT, PARA_SSS, "'%s' called vote to change server option '%s' (%s)"},
{/*GAMEMSG_VOTE_CALLKICK*/ DO_CHAT, PARA_SSS, "'%s' called for vote to kick '%s' (%s)"},
{/*GAMEMSG_VOTE_CALLSPEC*/ DO_CHAT, PARA_SSS, "'%s' called for vote to move '%s' to spectators (%s)"}
{/*GAMEMSG_VOTE_KICKYOU*/ DO_CHAT, PARA_S, "'%s' called for vote to kick you"}
};
void CGameClient::OnConsoleInit()
@ -562,8 +549,7 @@ void CGameClient::OnMessage(int MsgId, CUnpacker *pUnpacker)
int aParaI[3];
int NumParaI = 0;
const char *apParaS[3];
int NumParaS = 0;
const char *pParaS = 0;
// get paras
switch(gs_GameMsgList[GameMsgID].m_ParaType)
@ -575,12 +561,8 @@ void CGameClient::OnMessage(int MsgId, CUnpacker *pUnpacker)
case PARA_I:
aParaI[NumParaI++] = pUnpacker->GetInt();
break;
case PARA_SSS:
apParaS[NumParaS++] = pUnpacker->GetString();
case PARA_SS:
apParaS[NumParaS++] = pUnpacker->GetString();
case PARA_S:
apParaS[NumParaS++] = pUnpacker->GetString();
pParaS = pUnpacker->GetString();
break;
}
@ -620,9 +602,9 @@ void CGameClient::OnMessage(int MsgId, CUnpacker *pUnpacker)
case GAMEMSG_CTF_CAPTURE:
m_pSounds->Enqueue(CSounds::CHN_GLOBAL, SOUND_CTF_CAPTURE);
if(aParaI[2] <= 60*Client()->GameTickSpeed())
str_format(aBuf, sizeof(aBuf), "The %s flag was captured by '%s' (%.2f seconds)", aParaI[0] ? "blue" : "red", m_aClients[clamp(aParaI[1], 0, MAX_CLIENTS-1)].m_aName, aParaI[2]/(float)Client()->GameTickSpeed());
str_format(aBuf, sizeof(aBuf), "The %s flag was captured by '%s' (%.2f seconds)", aParaI[0] ? Localize("blue") : Localize("red"), m_aClients[clamp(aParaI[1], 0, MAX_CLIENTS-1)].m_aName, aParaI[2]/(float)Client()->GameTickSpeed());
else
str_format(aBuf, sizeof(aBuf), "The %s flag was captured by '%s'", aParaI[0] ? "blue" : "red", m_aClients[clamp(aParaI[1], 0, MAX_CLIENTS-1)].m_aName);
str_format(aBuf, sizeof(aBuf), "The %s flag was captured by '%s'", aParaI[0] ? Localize("blue") : Localize("red"), m_aClients[clamp(aParaI[1], 0, MAX_CLIENTS-1)].m_aName);
m_pChat->AddLine(-1, 0, aBuf);
}
return;
@ -630,7 +612,7 @@ void CGameClient::OnMessage(int MsgId, CUnpacker *pUnpacker)
// build message
const char *pText = "";
if(NumParaI == 0 && NumParaS == 0)
if(NumParaI == 0 && pParaS == 0)
pText = Localize(gs_GameMsgList[GameMsgID].m_pText);
else
{
@ -640,12 +622,8 @@ void CGameClient::OnMessage(int MsgId, CUnpacker *pUnpacker)
str_format(aBuf, sizeof(aBuf), Localize(gs_GameMsgList[GameMsgID].m_pText), aParaI[0], aParaI[1]);
else if(NumParaI == 3)
str_format(aBuf, sizeof(aBuf), Localize(gs_GameMsgList[GameMsgID].m_pText), aParaI[0], aParaI[1], aParaI[2]);
else if(NumParaS == 1)
str_format(aBuf, sizeof(aBuf), Localize(gs_GameMsgList[GameMsgID].m_pText), apParaS[0]);
else if(NumParaS == 2)
str_format(aBuf, sizeof(aBuf), Localize(gs_GameMsgList[GameMsgID].m_pText), apParaS[0], apParaS[1]);
else if(NumParaS == 3)
str_format(aBuf, sizeof(aBuf), Localize(gs_GameMsgList[GameMsgID].m_pText), apParaS[0], apParaS[1], apParaS[2]);
else if(pParaS != 0)
str_format(aBuf, sizeof(aBuf), Localize(gs_GameMsgList[GameMsgID].m_pText), pParaS);
pText = aBuf;
}

View file

@ -297,27 +297,8 @@ void CGameContext::SendGameMsg(int GameMsgID, const char *pParaS1, int ClientID)
Server()->SendMsg(&Msg, MSGFLAG_VITAL, ClientID);
}
void CGameContext::SendGameMsg(int GameMsgID, const char *pParaS1, const char *pParaS2, int ClientID)
{
CMsgPacker Msg(NETMSGTYPE_SV_GAMEMSG);
Msg.AddInt(GameMsgID);
Msg.AddString(pParaS1, -1);
Msg.AddString(pParaS2, -1);
Server()->SendMsg(&Msg, MSGFLAG_VITAL, ClientID);
}
void CGameContext::SendGameMsg(int GameMsgID, const char *pParaS1, const char *pParaS2, const char *pParaS3, int ClientID)
{
CMsgPacker Msg(NETMSGTYPE_SV_GAMEMSG);
Msg.AddInt(GameMsgID);
Msg.AddString(pParaS1, -1);
Msg.AddString(pParaS2, -1);
Msg.AddString(pParaS3, -1);
Server()->SendMsg(&Msg, MSGFLAG_VITAL, ClientID);
}
//
void CGameContext::StartVote(const char *pDesc, const char *pCommand, const char *pReason)
void CGameContext::StartVote(int Type, const char *pDesc, const char *pCommand, const char *pReason)
{
// check if a vote is already running
if(m_VoteCloseTime)
@ -335,37 +316,51 @@ void CGameContext::StartVote(const char *pDesc, const char *pCommand, const char
}
// start vote
m_VoteCloseTime = time_get() + time_freq()*25;
m_VoteCloseTime = time_get() + time_freq()*VOTE_TIME;
str_copy(m_aVoteDescription, pDesc, sizeof(m_aVoteDescription));
str_copy(m_aVoteCommand, pCommand, sizeof(m_aVoteCommand));
str_copy(m_aVoteReason, pReason, sizeof(m_aVoteReason));
SendVoteSet(-1);
SendVoteSet(Type, -1);
m_VoteUpdate = true;
}
void CGameContext::EndVote()
void CGameContext::EndVote(int Type, bool Force)
{
m_VoteCloseTime = 0;
SendVoteSet(-1);
if(Force)
m_VoteCreator = -1;
SendVoteSet(Type, -1);
}
void CGameContext::SendVoteSet(int ClientID)
void CGameContext::SendVoteSet(int Type, int ToClientID)
{
CNetMsg_Sv_VoteSet Msg;
if(m_VoteCloseTime)
{
Msg.m_ClientID = m_VoteCreator;
Msg.m_Type = Type;
Msg.m_Timeout = (m_VoteCloseTime-time_get())/time_freq();
Msg.m_pDescription = m_aVoteDescription;
Msg.m_pReason = m_aVoteReason;
}
else
{
Msg.m_ClientID = m_VoteCreator;
Msg.m_Type = Type;
Msg.m_Timeout = 0;
Msg.m_pDescription = "";
Msg.m_pReason = "";
if(m_VoteCreator == -1)
{
Msg.m_pDescription = m_aVoteDescription;
Msg.m_pReason = m_aVoteReason;
}
else
{
Msg.m_pDescription = "";
Msg.m_pReason = "";
}
}
Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, ClientID);
Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, ToClientID);
}
void CGameContext::SendVoteStatus(int ClientID, int Total, int Yes, int No)
@ -466,10 +461,7 @@ void CGameContext::OnTick()
{
// abort the kick-vote on player-leave
if(m_VoteCloseTime == -1)
{
SendGameMsg(GAMEMSG_VOTE_ABORT, -1);
EndVote();
}
EndVote(VOTE_END_ABORT, false);
else
{
int Total = 0, Yes = 0, No = 0;
@ -509,29 +501,20 @@ void CGameContext::OnTick()
else if(ActVote < 0)
No++;
}
if(Yes >= Total/2+1)
m_VoteEnforce = VOTE_ENFORCE_YES;
else if(No >= (Total+1)/2)
m_VoteEnforce = VOTE_ENFORCE_NO;
}
if(m_VoteEnforce == VOTE_ENFORCE_YES)
if(m_VoteEnforce == VOTE_ENFORCE_YES || Yes >= Total/2+1)
{
Server()->SetRconCID(IServer::RCON_CID_VOTE);
Console()->ExecuteLine(m_aVoteCommand);
Server()->SetRconCID(IServer::RCON_CID_SERV);
EndVote();
SendGameMsg(GAMEMSG_VOTE_PASS, -1);
EndVote(VOTE_END_PASS, m_VoteEnforce==VOTE_ENFORCE_YES);
if(m_apPlayers[m_VoteCreator])
m_apPlayers[m_VoteCreator]->m_LastVoteCall = 0;
}
else if(m_VoteEnforce == VOTE_ENFORCE_NO || time_get() > m_VoteCloseTime)
{
EndVote();
SendGameMsg(GAMEMSG_VOTE_FAIL, -1);
}
else if(m_VoteEnforce == VOTE_ENFORCE_NO || No >= (Total+1)/2 || time_get() > m_VoteCloseTime)
EndVote(VOTE_END_FAIL, m_VoteEnforce==VOTE_ENFORCE_NO);
else if(m_VoteUpdate)
{
m_VoteUpdate = false;
@ -658,7 +641,7 @@ void CGameContext::OnClientConnected(int ClientID, bool Dummy)
// send active vote
if(m_VoteCloseTime)
SendVoteSet(ClientID);
SendVoteSet(VOTE_UNKNOWN, ClientID);
// send motd
CNetMsg_Sv_Motd Msg;
@ -763,8 +746,7 @@ void CGameContext::OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID)
return;
}
int GMsgID = -1;
const char *pGMsgS2;
int Type = VOTE_UNKNOWN;
char aDesc[VOTE_DESC_LENGTH] = {0};
char aCmd[VOTE_CMD_LENGTH] = {0};
CNetMsg_Cl_CallVote *pMsg = (CNetMsg_Cl_CallVote *)pRawMsg;
@ -777,8 +759,7 @@ void CGameContext::OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID)
{
if(str_comp_nocase(pMsg->m_Value, pOption->m_aDescription) == 0)
{
GMsgID = GAMEMSG_VOTE_CALLOP;
pGMsgS2 = pOption->m_aDescription;
Type = VOTE_START_OP;
str_format(aDesc, sizeof(aDesc), "%s", pOption->m_aDescription);
str_format(aCmd, sizeof(aCmd), "%s", pOption->m_aCommand);
break;
@ -833,8 +814,7 @@ void CGameContext::OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID)
return;
}
GMsgID = GAMEMSG_VOTE_CALLKICK;
pGMsgS2 = Server()->ClientName(KickID);
Type = VOTE_START_KICK;
str_format(aDesc, sizeof(aDesc), "Kick '%s'", Server()->ClientName(KickID));
if (!g_Config.m_SvVoteKickBantime)
str_format(aCmd, sizeof(aCmd), "kick %d Kicked by vote", KickID);
@ -866,20 +846,18 @@ void CGameContext::OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID)
return;
}
GMsgID = GAMEMSG_VOTE_CALLSPEC;
pGMsgS2 = Server()->ClientName(SpectateID);
Type = VOTE_START_SPEC;
str_format(aDesc, sizeof(aDesc), "move '%s' to spectators", Server()->ClientName(SpectateID));
str_format(aCmd, sizeof(aCmd), "set_team %d -1 %d", SpectateID, g_Config.m_SvVoteSpectateRejoindelay);
m_VoteClientID = SpectateID;
}
if(GMsgID != -1)
if(Type != VOTE_UNKNOWN)
{
SendGameMsg(GMsgID, Server()->ClientName(ClientID), pGMsgS2, pReason, -1);
StartVote(aDesc, aCmd, pReason);
m_VoteCreator = ClientID;
StartVote(Type, aDesc, aCmd, pReason);
pPlayer->m_Vote = 1;
pPlayer->m_VotePos = m_VotePos = 1;
m_VoteCreator = ClientID;
pPlayer->m_LastVoteCall = Now;
}
}
@ -1381,7 +1359,9 @@ void CGameContext::ConForceVote(IConsole::IResult *pResult, void *pUserData)
{
if(str_comp_nocase(pValue, pOption->m_aDescription) == 0)
{
pSelf->SendGameMsg(GAMEMSG_VOTE_FORCEOP, pValue, pReason, -1);
str_copy(pSelf->m_aVoteDescription, pValue, sizeof(pSelf->m_aVoteDescription));
str_copy(pSelf->m_aVoteReason, pReason, sizeof(pSelf->m_aVoteReason));
pSelf->EndVote(VOTE_START_OP, true);
pSelf->Console()->ExecuteLine(pOption->m_aCommand);
break;
}
@ -1427,7 +1407,9 @@ void CGameContext::ConForceVote(IConsole::IResult *pResult, void *pUserData)
return;
}
pSelf->SendGameMsg(GAMEMSG_VOTE_FORCESPEC, pSelf->Server()->ClientName(SpectateID), pReason, -1);
str_copy(pSelf->m_aVoteDescription, pSelf->Server()->ClientName(SpectateID), sizeof(pSelf->m_aVoteDescription));
str_copy(pSelf->m_aVoteReason, pReason, sizeof(pSelf->m_aVoteReason));
pSelf->EndVote(VOTE_START_SPEC, true);
str_format(aBuf, sizeof(aBuf), "set_team %d -1 %d", SpectateID, g_Config.m_SvVoteSpectateRejoindelay);
pSelf->Console()->ExecuteLine(aBuf);
}
@ -1458,7 +1440,6 @@ void CGameContext::ConVote(IConsole::IResult *pResult, void *pUserData)
pSelf->m_VoteEnforce = CGameContext::VOTE_ENFORCE_YES;
else if(str_comp_nocase(pResult->GetString(0), "no") == 0)
pSelf->m_VoteEnforce = CGameContext::VOTE_ENFORCE_NO;
pSelf->SendGameMsg(GAMEMSG_VOTE_FORCE, pResult->GetString(0), -1);
char aBuf[256];
str_format(aBuf, sizeof(aBuf), "forcing vote %s", pResult->GetString(0));
pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf);

View file

@ -90,9 +90,9 @@ public:
int m_LockTeams;
// voting
void StartVote(const char *pDesc, const char *pCommand, const char *pReason);
void EndVote();
void SendVoteSet(int ClientID);
void StartVote(int Type, const char *pDesc, const char *pCommand, const char *pReason);
void EndVote(int Type, bool Force);
void SendVoteSet(int Type, int ToClientID);
void SendVoteStatus(int ClientID, int Total, int Yes, int No);
void AbortVoteOnDisconnect(int ClientID);
void AbortVoteOnTeamChange(int ClientID);
@ -112,6 +112,8 @@ public:
VOTE_ENFORCE_UNKNOWN=0,
VOTE_ENFORCE_NO,
VOTE_ENFORCE_YES,
VOTE_TIME=25,
};
class CHeap *m_pVoteOptionHeap;
CVoteOptionServer *m_pVoteOptionFirst;
@ -145,8 +147,6 @@ public:
void SendGameMsg(int GameMsgID, int ParaI1, int ParaI2, int ClientID);
void SendGameMsg(int GameMsgID, int ParaI1, int ParaI2, int ParaI3, int ClientID);
void SendGameMsg(int GameMsgID, const char *pParaS1, int ClientID);
void SendGameMsg(int GameMsgID, const char *pParaS1, const char *pParaS2, int ClientID);
void SendGameMsg(int GameMsgID, const char *pParaS1, const char *pParaS2, const char *pParaS3, int ClientID);
//
void CheckPureTuning();