plugins/basevotes.sp
author David Anderson <dvander@alliedmods.net>
Sat Dec 22 08:57:08 2007 +0000 (2007-12-22)
changeset 1813 372939c88bc7
parent 1740 e5f6bd502cb7
child 1947 e73a1e51833b
permissions -rw-r--r--
fixed amb1305 by making OnClientPostAdminCheck() always occur after OnClientPutInServer(). this is now GUARANTEED. it was undefined before, however the usual case was opposite. if plugins were relying on this, they were written poorly and shouldn't have worked in the first place, especially with the threaded SQL plugin.
ferret99gt@1281
     1
/**
ds@1330
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
ds@1330
     4
 * SourceMod Basic Votes Plugin
ferret99gt@1281
     5
 * Implements basic vote commands.
ds@1330
     6
 *
ds@1330
     7
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
ds@1330
     8
 * =============================================================================
ferret99gt@1281
     9
 *
ds@1330
    10
 * This program is free software; you can redistribute it and/or modify it under
ds@1330
    11
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330
    12
 * Free Software Foundation.
ds@1330
    13
 * 
ds@1330
    14
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330
    15
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330
    16
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1330
    17
 * details.
ferret99gt@1281
    18
 *
ds@1330
    19
 * You should have received a copy of the GNU General Public License along with
ds@1330
    20
 * this program.  If not, see <http://www.gnu.org/licenses/>.
ferret99gt@1281
    21
 *
ds@1330
    22
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330
    23
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330
    24
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330
    25
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1330
    26
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1330
    27
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1330
    28
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330
    29
 * or <http://www.sourcemod.net/license.php>.
ferret99gt@1281
    30
 *
ferret99gt@1281
    31
 * Version: $Id$
ferret99gt@1281
    32
 */
ferret99gt@1281
    33
ds@1330
    34
#pragma semicolon 1
ferret99gt@1281
    35
ds@1330
    36
#include <sourcemod>
pred@1536
    37
#undef REQUIRE_PLUGIN
pred@1536
    38
#include <adminmenu>
ferret99gt@1281
    39
ferret99gt@1281
    40
public Plugin:myinfo =
ferret99gt@1281
    41
{
ferret99gt@1281
    42
	name = "Basic Votes",
ferret99gt@1281
    43
	author = "AlliedModders LLC",
ferret99gt@1281
    44
	description = "Basic Vote Commands",
ferret99gt@1281
    45
	version = SOURCEMOD_VERSION,
ferret99gt@1281
    46
	url = "http://www.sourcemod.net/"
ferret99gt@1281
    47
};
ferret99gt@1281
    48
ferret99gt@1295
    49
#define VOTE_NO "###no###"
ferret99gt@1295
    50
#define VOTE_YES "###yes###"
ferret99gt@1295
    51
ferret99gt@1281
    52
new Handle:g_hVoteMenu = INVALID_HANDLE;
ferret99gt@1281
    53
ferret99gt@1295
    54
new Handle:g_Cvar_Limits[3] = {INVALID_HANDLE, ...};
ferret99gt@1281
    55
//new Handle:g_Cvar_VoteSay = INVALID_HANDLE;
ferret99gt@1281
    56
ferret99gt@1281
    57
enum voteType
ferret99gt@1281
    58
{
ferret99gt@1281
    59
	map,
ferret99gt@1281
    60
	kick,
ferret99gt@1295
    61
	ban,
ferret99gt@1295
    62
	question
ferret99gt@1281
    63
}
ferret99gt@1281
    64
ferret99gt@1281
    65
new voteType:g_voteType = voteType:question;
ferret99gt@1281
    66
ferret99gt@1281
    67
// Menu API does not provide us with a way to pass multiple peices of data with a single
ferret99gt@1281
    68
// choice, so some globals are used to hold stuff.
ferret99gt@1281
    69
//
ferret99gt@1281
    70
#define VOTE_CLIENTID	0
ferret99gt@1281
    71
#define VOTE_USERID	1
ferret99gt@1281
    72
new g_voteClient[2];		/* Holds the target's client id and user id */
ferret99gt@1281
    73
ferret99gt@1281
    74
#define VOTE_NAME	0
ferret99gt@1281
    75
#define VOTE_AUTHID	1
ferret99gt@1281
    76
#define	VOTE_IP		2
ferret99gt@1281
    77
new String:g_voteInfo[3][65];	/* Holds the target's name, authid, and IP */
ferret99gt@1281
    78
ferret99gt@1281
    79
new String:g_voteArg[256];	/* Used to hold ban/kick reasons or vote questions */
ferret99gt@1281
    80
ferret99gt@1281
    81
pred@1536
    82
new Handle:hTopMenu = INVALID_HANDLE;
pred@1536
    83
pred@1536
    84
#include "basevotes/votekick.sp"
pred@1536
    85
#include "basevotes/voteban.sp"
pred@1536
    86
#include "basevotes/votemap.sp"
pred@1536
    87
ferret99gt@1281
    88
public OnPluginStart()
ferret99gt@1281
    89
{
ferret99gt@1281
    90
	LoadTranslations("common.phrases");
ferret99gt@1285
    91
	LoadTranslations("basevotes.phrases");
dvander@1625
    92
	LoadTranslations("plugin.basecommands");
dvander@1625
    93
	LoadTranslations("basebans.phrases");
ferret99gt@1281
    94
	
ferret99gt@1281
    95
	RegAdminCmd("sm_votemap", Command_Votemap, ADMFLAG_VOTE|ADMFLAG_CHANGEMAP, "sm_votemap <mapname> [mapname2] ... [mapname5] ");
ferret99gt@1281
    96
	RegAdminCmd("sm_votekick", Command_Votekick, ADMFLAG_VOTE|ADMFLAG_KICK, "sm_votekick <player> [reason]");
ferret99gt@1281
    97
	RegAdminCmd("sm_voteban", Command_Voteban, ADMFLAG_VOTE|ADMFLAG_BAN, "sm_voteban <player> [reason]");
ferret99gt@1281
    98
	RegAdminCmd("sm_vote", Command_Vote, ADMFLAG_VOTE, "sm_vote <question> [Answer1] [Answer2] ... [Answer5]");
ferret99gt@1281
    99
ferret99gt@1295
   100
	/*
ferret99gt@1295
   101
	g_Cvar_Show = FindConVar("sm_vote_show");
ferret99gt@1295
   102
	if (g_Cvar_Show == INVALID_HANDLE)
ferret99gt@1295
   103
	{
ferret99gt@1295
   104
		g_Cvar_Show = CreateConVar("sm_vote_show", "1", "Show player's votes? Default on.", 0, true, 0.0, true, 1.0);
ferret99gt@1295
   105
	}
ferret99gt@1295
   106
	*/
ferret99gt@1281
   107
ferret99gt@1295
   108
	g_Cvar_Limits[0] = CreateConVar("sm_vote_map", "0.60", "percent required for successful map vote.", 0, true, 0.05, true, 1.0);
ferret99gt@1295
   109
	g_Cvar_Limits[1] = CreateConVar("sm_vote_kick", "0.60", "percent required for successful kick vote.", 0, true, 0.05, true, 1.0);	
ferret99gt@1295
   110
	g_Cvar_Limits[2] = CreateConVar("sm_vote_ban", "0.60", "percent required for successful ban vote.", 0, true, 0.05, true, 1.0);		
ferret99gt@1281
   111
	
pred@1536
   112
	/* Account for late loading */
pred@1536
   113
	new Handle:topmenu;
pred@1536
   114
	if (LibraryExists("adminmenu") && ((topmenu = GetAdminTopMenu()) != INVALID_HANDLE))
ferret99gt@1281
   115
	{
pred@1536
   116
		OnAdminMenuReady(topmenu);
ferret99gt@1281
   117
	}
ferret99gt@1281
   118
	
pred@1536
   119
	g_SelectedMaps = CreateArray(33);
pred@1536
   120
	
dvander@1661
   121
	g_MapList = CreateMenu(MenuHandler_Map, MenuAction_DrawItem);
pred@1536
   122
	SetMenuTitle(g_MapList, "Please select a map");
pred@1536
   123
	SetMenuExitBackButton(g_MapList, true);
pred@1740
   124
	
pred@1740
   125
	decl String:mapListPath[PLATFORM_MAX_PATH];
pred@1740
   126
	BuildPath(Path_SM, mapListPath, sizeof(mapListPath), "configs/adminmenu_maplist.ini");
pred@1740
   127
	SetMapListCompatBind("sm_votemap menu", mapListPath);
pred@1536
   128
}
pred@1536
   129
pred@1740
   130
public OnConfigsExecuted()
pred@1536
   131
{
ferret99gt@1606
   132
	g_mapCount = LoadMapList(g_MapList);
pred@1536
   133
}
pred@1536
   134
pred@1536
   135
public OnAdminMenuReady(Handle:topmenu)
pred@1536
   136
{
pred@1536
   137
	/* Block us from being called twice */
pred@1536
   138
	if (topmenu == hTopMenu)
ferret99gt@1281
   139
	{
pred@1536
   140
		return;
ferret99gt@1295
   141
	}
ferret99gt@1281
   142
	
pred@1536
   143
	/* Save the Handle */
pred@1536
   144
	hTopMenu = topmenu;
ferret99gt@1281
   145
	
pred@1536
   146
	/* Build the "Voting Commands" category */
pred@1536
   147
	new TopMenuObject:voting_commands = FindTopMenuCategory(hTopMenu, ADMINMENU_VOTINGCOMMANDS);
pred@1536
   148
pred@1536
   149
	if (voting_commands != INVALID_TOPMENUOBJECT)
ferret99gt@1281
   150
	{
pred@1536
   151
		AddToTopMenu(hTopMenu,
dvander@1600
   152
			"sm_votekick",
pred@1536
   153
			TopMenuObject_Item,
pred@1536
   154
			AdminMenu_VoteKick,
pred@1536
   155
			voting_commands,
pred@1536
   156
			"sm_votekick",
pred@1536
   157
			ADMFLAG_VOTE|ADMFLAG_KICK);
pred@1536
   158
			
pred@1536
   159
		AddToTopMenu(hTopMenu,
dvander@1600
   160
			"sm_voteban",
pred@1536
   161
			TopMenuObject_Item,
pred@1536
   162
			AdminMenu_VoteBan,
pred@1536
   163
			voting_commands,
pred@1536
   164
			"sm_voteban",
pred@1536
   165
			ADMFLAG_VOTE|ADMFLAG_BAN);
pred@1536
   166
			
pred@1536
   167
		AddToTopMenu(hTopMenu,
dvander@1600
   168
			"sm_votemap",
pred@1536
   169
			TopMenuObject_Item,
pred@1536
   170
			AdminMenu_VoteMap,
pred@1536
   171
			voting_commands,
pred@1536
   172
			"sm_votemap",
pred@1536
   173
			ADMFLAG_VOTE|ADMFLAG_CHANGEMAP);
ferret99gt@1281
   174
	}
ferret99gt@1281
   175
}
ferret99gt@1281
   176
ferret99gt@1281
   177
public Action:Command_Vote(client, args)
ferret99gt@1281
   178
{
ferret99gt@1281
   179
	if (args < 1)
ferret99gt@1281
   180
	{
ferret99gt@1281
   181
		ReplyToCommand(client, "[SM] Usage: sm_vote <question> [Answer1] [Answer2] ... [Answer5]");
ferret99gt@1281
   182
		return Plugin_Handled;	
ferret99gt@1281
   183
	}
ferret99gt@1281
   184
	
ferret99gt@1281
   185
	if (IsVoteInProgress())
ferret99gt@1281
   186
	{
ferret99gt@1281
   187
		ReplyToCommand(client, "[SM] %t", "Vote in Progress");
ferret99gt@1281
   188
		return Plugin_Handled;
ferret99gt@1281
   189
	}
ferret99gt@1295
   190
		
ferret99gt@1295
   191
	if (!TestVoteDelay(client))
ferret99gt@1295
   192
	{
ferret99gt@1295
   193
		return Plugin_Handled;
ferret99gt@1295
   194
	}
ferret99gt@1281
   195
	
ferret99gt@1281
   196
	decl String:text[256];
ferret99gt@1281
   197
	GetCmdArgString(text, sizeof(text));
ferret99gt@1281
   198
ferret99gt@1281
   199
	decl String:answers[5][64];
ferret99gt@1281
   200
	new answerCount;	
ferret99gt@1281
   201
	new len = BreakString(text, g_voteArg, sizeof(g_voteArg));
ferret99gt@1281
   202
	new pos = len;
ferret99gt@1281
   203
	
ferret99gt@1285
   204
	while (args > 1 && pos != -1 && answerCount < 5)
ferret99gt@1281
   205
	{	
ferret99gt@1281
   206
		pos = BreakString(text[len], answers[answerCount], sizeof(answers[]));
ferret99gt@1281
   207
		answerCount++;
ferret99gt@1281
   208
		
ferret99gt@1281
   209
		if (pos != -1)
ferret99gt@1281
   210
		{
ferret99gt@1281
   211
			len += pos;
ferret99gt@1281
   212
		}	
ferret99gt@1281
   213
	}
ferret99gt@1281
   214
dvander@1378
   215
	LogAction(client, -1, "\"%L\" initiated a generic vote.", client);
dvander@1625
   216
	ShowActivity2(client, "[SM] ", "%t", "Initiate Vote", g_voteArg);
ferret99gt@1281
   217
	
ferret99gt@1281
   218
	g_voteType = voteType:question;
ferret99gt@1281
   219
	
ferret99gt@1295
   220
	g_hVoteMenu = CreateMenu(Handler_VoteCallback, MenuAction:MENU_ACTIONS_ALL);
ferret99gt@1281
   221
	SetMenuTitle(g_hVoteMenu, "%s?", g_voteArg);
ferret99gt@1281
   222
	
ferret99gt@1285
   223
	if (answerCount < 2)
ferret99gt@1281
   224
	{
ferret99gt@1295
   225
		AddMenuItem(g_hVoteMenu, VOTE_YES, "Yes");
ferret99gt@1295
   226
		AddMenuItem(g_hVoteMenu, VOTE_NO, "No");
ferret99gt@1281
   227
	}
ferret99gt@1281
   228
	else
ferret99gt@1281
   229
	{
ferret99gt@1281
   230
		for (new i = 0; i < answerCount; i++)
ferret99gt@1281
   231
		{
ferret99gt@1281
   232
			AddMenuItem(g_hVoteMenu, answers[i], answers[i]);
ferret99gt@1281
   233
		}	
ferret99gt@1281
   234
	}
ferret99gt@1281
   235
	
ferret99gt@1281
   236
	SetMenuExitButton(g_hVoteMenu, false);
ferret99gt@1281
   237
	VoteMenuToAll(g_hVoteMenu, 20);		
ferret99gt@1281
   238
	
ferret99gt@1281
   239
	return Plugin_Handled;	
ferret99gt@1281
   240
}
ferret99gt@1281
   241
ferret99gt@1281
   242
public Handler_VoteCallback(Handle:menu, MenuAction:action, param1, param2)
ferret99gt@1281
   243
{
ferret99gt@1281
   244
	if (action == MenuAction_End)
ferret99gt@1281
   245
	{
ferret99gt@1281
   246
		VoteMenuClose();
ferret99gt@1281
   247
	}
ferret99gt@1281
   248
	else if (action == MenuAction_Display)
ferret99gt@1281
   249
	{
ferret99gt@1284
   250
	 	if (g_voteType != voteType:question)
ferret99gt@1284
   251
	 	{
ferret99gt@1285
   252
			decl String:title[64];
ferret99gt@1364
   253
			GetMenuTitle(menu, title, sizeof(title));
ferret99gt@1285
   254
			
ferret99gt@1284
   255
	 		decl String:buffer[255];
ferret99gt@1285
   256
			Format(buffer, sizeof(buffer), "%T", title, param1, g_voteInfo[VOTE_NAME]);
ferret99gt@1284
   257
ferret99gt@1364
   258
			new Handle:panel = Handle:param2;
ferret99gt@1364
   259
			SetPanelTitle(panel, buffer);
ferret99gt@1284
   260
		}
ferret99gt@1281
   261
	}
ferret99gt@1281
   262
	else if (action == MenuAction_DisplayItem)
ferret99gt@1281
   263
	{
ferret99gt@1281
   264
		decl String:display[64];
ferret99gt@1281
   265
		GetMenuItem(menu, param2, "", 0, _, display, sizeof(display));
ferret99gt@1281
   266
	 
ferret99gt@1284
   267
	 	if (strcmp(display, "No") == 0 || strcmp(display, "Yes") == 0)
ferret99gt@1281
   268
	 	{
ferret99gt@1281
   269
			decl String:buffer[255];
ferret99gt@1281
   270
			Format(buffer, sizeof(buffer), "%T", display, param1);
ferret99gt@1281
   271
ferret99gt@1281
   272
			return RedrawMenuItem(buffer);
ferret99gt@1281
   273
		}
ferret99gt@1281
   274
	}
ferret99gt@1281
   275
	/* else if (action == MenuAction_Select)
ferret99gt@1281
   276
	{
ferret99gt@1281
   277
		VoteSelect(menu, param1, param2);
ferret99gt@1281
   278
	}*/
ferret99gt@1364
   279
	else if (action == MenuAction_VoteCancel && param1 == VoteCancel_NoVotes)
ferret99gt@1295
   280
	{
ferret99gt@1295
   281
		PrintToChatAll("[SM] %t", "No Votes Cast");
ferret99gt@1295
   282
	}	
ferret99gt@1281
   283
	else if (action == MenuAction_VoteEnd)
ferret99gt@1281
   284
	{
ferret99gt@1281
   285
		decl String:item[64], String:display[64];
ferret99gt@1281
   286
		new Float:percent, Float:limit, votes, totalVotes;
ferret99gt@1295
   287
ferret99gt@1281
   288
		GetMenuVoteInfo(param2, votes, totalVotes);
ferret99gt@1281
   289
		GetMenuItem(menu, param1, item, sizeof(item), _, display, sizeof(display));
ferret99gt@1281
   290
		
ferret99gt@1295
   291
		if (strcmp(item, VOTE_NO) == 0 && param1 == 1)
ferret99gt@1281
   292
		{
ferret99gt@1281
   293
			votes = totalVotes - votes; // Reverse the votes to be in relation to the Yes option.
ferret99gt@1281
   294
		}
ferret99gt@1281
   295
		
ferret99gt@1281
   296
		percent = GetVotePercent(votes, totalVotes);
ferret99gt@1281
   297
		
ferret99gt@1295
   298
		if (g_voteType != voteType:question)
ferret99gt@1281
   299
		{
ferret99gt@1295
   300
			limit = GetConVarFloat(g_Cvar_Limits[g_voteType]);
ferret99gt@1281
   301
		}
dvander@1378
   302
		
dvander@1378
   303
		/* :TODO: g_voteClient[userid] needs to be checked */
ferret99gt@1281
   304
ferret99gt@1281
   305
		// A multi-argument vote is "always successful", but have to check if its a Yes/No vote.
ferret99gt@1295
   306
		if ((strcmp(item, VOTE_YES) == 0 && FloatCompare(percent,limit) < 0 && param1 == 0) || (strcmp(item, VOTE_NO) == 0 && param1 == 1))
ferret99gt@1281
   307
		{
dvander@1378
   308
			/* :TODO: g_voteClient[userid] should be used here and set to -1 if not applicable.
dvander@1378
   309
			 */
dvander@1378
   310
			LogAction(-1, -1, "Vote failed.");
ferret99gt@1281
   311
			PrintToChatAll("[SM] %t", "Vote Failed", RoundToNearest(100.0*limit), RoundToNearest(100.0*percent), totalVotes);
ferret99gt@1281
   312
		}
ferret99gt@1281
   313
		else
ferret99gt@1281
   314
		{
ferret99gt@1281
   315
			PrintToChatAll("[SM] %t", "Vote Successful", RoundToNearest(100.0*percent), totalVotes);
ferret99gt@1281
   316
			
ferret99gt@1284
   317
			switch (g_voteType)
ferret99gt@1281
   318
			{
ferret99gt@1281
   319
				case (voteType:question):
ferret99gt@1281
   320
				{
ferret99gt@1295
   321
					if (strcmp(item, VOTE_NO) == 0 || strcmp(item, VOTE_YES) == 0)
ferret99gt@1295
   322
					{
ferret99gt@1295
   323
						strcopy(item, sizeof(item), display);
ferret99gt@1295
   324
					}
ferret99gt@1295
   325
					
ferret99gt@1285
   326
					PrintToChatAll("[SM] %t", "Vote End", g_voteArg, item);
ferret99gt@1281
   327
				}
ferret99gt@1281
   328
				
ferret99gt@1281
   329
				case (voteType:map):
ferret99gt@1281
   330
				{
dvander@1378
   331
					LogAction(-1, -1, "Changing map to %s due to vote.", item);
ferret99gt@1281
   332
					PrintToChatAll("[SM] %t", "Changing map", item);
ferret99gt@1281
   333
					new Handle:dp;
ferret99gt@1281
   334
					CreateDataTimer(5.0, Timer_ChangeMap, dp);
ferret99gt@1281
   335
					WritePackString(dp, item);		
ferret99gt@1281
   336
				}
ferret99gt@1281
   337
					
ferret99gt@1281
   338
				case (voteType:kick):
ferret99gt@1281
   339
				{
ferret99gt@1281
   340
					if (g_voteArg[0] == '\0')
ferret99gt@1281
   341
					{
ferret99gt@1281
   342
						strcopy(g_voteArg, sizeof(g_voteArg), "Votekicked");
ferret99gt@1281
   343
					}
ferret99gt@1281
   344
					
dvander@1625
   345
					PrintToChatAll("[SM] %t", "Kicked target", "_s", g_voteInfo[VOTE_NAME]);					
dvander@1378
   346
					LogAction(-1, g_voteClient[VOTE_CLIENTID], "Vote kick successful, kicked \"%L\" (reason \"%s\")", g_voteClient[VOTE_CLIENTID], g_voteArg);
ferret99gt@1281
   347
					
ferret99gt@1281
   348
					ServerCommand("kickid %d \"%s\"", g_voteClient[VOTE_USERID], g_voteArg);					
ferret99gt@1281
   349
				}
ferret99gt@1281
   350
					
ferret99gt@1281
   351
				case (voteType:ban):
ferret99gt@1281
   352
				{
ferret99gt@1281
   353
					if (g_voteArg[0] == '\0')
ferret99gt@1281
   354
					{
ferret99gt@1281
   355
						strcopy(g_voteArg, sizeof(g_voteArg), "Votebanned");
ferret99gt@1281
   356
					}
ferret99gt@1281
   357
					
ferret99gt@1281
   358
					PrintToChatAll("[SM] %t", "Banned player", g_voteInfo[VOTE_NAME], 30);
dvander@1378
   359
					LogAction(-1, g_voteClient[VOTE_CLIENTID], "Vote ban successful, banned \"%L\" (minutes \"30\") (reason \"%s\")", g_voteClient[VOTE_CLIENTID], g_voteArg);
dvander@1684
   360
dvander@1684
   361
					BanClient(g_voteClient[VOTE_CLIENTID],
dvander@1684
   362
							  30,
dvander@1684
   363
							  BANFLAG_AUTO,
dvander@1684
   364
							  g_voteArg,
dvander@1684
   365
							  "Banned by vote",
dvander@1684
   366
							  "sm_voteban");
ferret99gt@1281
   367
				}
ferret99gt@1281
   368
			}
ferret99gt@1281
   369
		}
ferret99gt@1281
   370
	}
ferret99gt@1285
   371
	
ferret99gt@1285
   372
	return 0;
ferret99gt@1281
   373
}
ferret99gt@1281
   374
ferret99gt@1281
   375
/*
ferret99gt@1281
   376
VoteSelect(Handle:menu, param1, param2 = 0)
ferret99gt@1281
   377
{
ferret99gt@1281
   378
	if (GetConVarInt(g_Cvar_VoteShow) == 1)
ferret99gt@1281
   379
	{
ferret99gt@1281
   380
		decl String:voter[64], String:junk[64], String:choice[64];
ferret99gt@1281
   381
		GetClientName(param1, voter, sizeof(voter));
ferret99gt@1281
   382
		GetMenuItem(menu, param2, junk, sizeof(junk), _, choice, sizeof(choice));
ferret99gt@1281
   383
		PrintToChatAll("[SM] %T", "Vote Select", LANG_SERVER, voter, choice);
ferret99gt@1281
   384
	}
ferret99gt@1281
   385
}
ferret99gt@1281
   386
*/
ferret99gt@1281
   387
ferret99gt@1281
   388
VoteMenuClose()
ferret99gt@1281
   389
{
ferret99gt@1281
   390
	CloseHandle(g_hVoteMenu);
ferret99gt@1281
   391
	g_hVoteMenu = INVALID_HANDLE;
ferret99gt@1281
   392
}
ferret99gt@1281
   393
ferret99gt@1281
   394
Float:GetVotePercent(votes, totalVotes)
ferret99gt@1281
   395
{
ferret99gt@1281
   396
	return FloatDiv(float(votes),float(totalVotes));
ferret99gt@1281
   397
}
ferret99gt@1281
   398
ferret99gt@1295
   399
bool:TestVoteDelay(client)
ferret99gt@1295
   400
{
ferret99gt@1295
   401
 	new delay = CheckVoteDelay();
ferret99gt@1295
   402
 	
ferret99gt@1295
   403
 	if (delay > 0)
ferret99gt@1295
   404
 	{
ferret99gt@1295
   405
 		if (delay > 60)
ferret99gt@1295
   406
 		{
ferret99gt@1295
   407
 			ReplyToCommand(client, "[SM] %t", "Vote Delay Minutes", delay % 60);
ferret99gt@1295
   408
 		}
ferret99gt@1295
   409
 		else
ferret99gt@1295
   410
 		{
ferret99gt@1295
   411
 			ReplyToCommand(client, "[SM] %t", "Vote Delay Seconds", delay);
ferret99gt@1295
   412
 		}
ferret99gt@1295
   413
 		
ferret99gt@1295
   414
 		return false;
ferret99gt@1295
   415
 	}
ferret99gt@1295
   416
 	
ferret99gt@1295
   417
	return true;
ferret99gt@1295
   418
}
ferret99gt@1295
   419
ferret99gt@1281
   420
public Action:Timer_ChangeMap(Handle:timer, Handle:dp)
ferret99gt@1281
   421
{
ferret99gt@1281
   422
	decl String:mapname[65];
ferret99gt@1281
   423
	
ferret99gt@1281
   424
	ResetPack(dp);
ferret99gt@1281
   425
	ReadPackString(dp, mapname, sizeof(mapname));
ferret99gt@1281
   426
	
ferret99gt@1281
   427
	ServerCommand("changelevel \"%s\"", mapname);
ferret99gt@1281
   428
	
ferret99gt@1281
   429
	return Plugin_Stop;
dvander@1600
   430
}