2008-03-30 09:00:22 +02:00
/ * *
* vim : set ts = 4 :
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* SourceMod Rock The Vote Plugin
* Creates a map vote when the required number of players have requested one .
*
* SourceMod ( C ) 2004 - 2008 AlliedModders LLC . All rights reserved .
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*
* This program is free software ; you can redistribute it and / or modify it under
* the terms of the GNU General Public License , version 3.0 , as published by the
* Free Software Foundation .
*
* This program is distributed in the hope that it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE . See the GNU General Public License for more
* details .
*
* You should have received a copy of the GNU General Public License along with
* this program . If not , see < http : //www.gnu.org/licenses/>.
*
* As a special exception , AlliedModders LLC gives you permission to link the
* code of this program ( as well as its derivative works ) to " Half-Life 2, " the
* " Source Engine, " the " SourcePawn JIT, " and any Game MODs that run on software
* by the Valve Corporation . You must obey the GNU General Public License in
* all respects for all other code used . Additionally , AlliedModders LLC grants
* this exception to all derivative works . AlliedModders LLC defines further
* exceptions , found in LICENSE . txt ( as of this writing , version JULY - 31 - 2007 ) ,
* or < http : //www.sourcemod.net/license.php>.
*
* Version : $ Id $
* /
# include <sourcemod>
2008-07-01 03:18:52 +02:00
# include <mapchooser>
# include <nextmap>
2008-03-30 09:00:22 +02:00
# pragma semicolon 1
2014-12-16 20:16:06 +01:00
# pragma newdecls required
2008-03-30 09:00:22 +02:00
2014-12-16 20:16:06 +01:00
public Plugin myinfo =
2008-03-30 09:00:22 +02:00
{
name = " Rock The Vote " ,
author = " AlliedModders LLC " ,
description = " Provides RTV Map Voting " ,
version = SOURCEMOD_VERSION ,
url = " http://www.sourcemod.net/ "
} ;
2014-11-10 01:10:25 +01:00
ConVar g_Cvar_Needed ;
ConVar g_Cvar_MinPlayers ;
ConVar g_Cvar_InitialDelay ;
ConVar g_Cvar_Interval ;
ConVar g_Cvar_ChangeTime ;
ConVar g_Cvar_RTVPostVoteAction ;
2008-03-30 09:00:22 +02:00
2014-12-16 20:16:06 +01:00
bool g_CanRTV = false ; // True if RTV loaded maps and is active.
bool g_RTVAllowed = false ; // True if RTV is available to players. Used to delay rtv votes.
int g_Voters = 0 ; // Total voters connected. Doesn't include fake clients.
int g_Votes = 0 ; // Total number of "say rtv" votes
int g_VotesNeeded = 0 ; // Necessary votes before map vote begins. (voters * percent_needed)
bool g_Voted [ MAXPLAYERS + 1 ] = { false , . . . } ;
2008-07-01 03:18:52 +02:00
2014-12-16 20:16:06 +01:00
bool g_InChange = false ;
2008-03-30 09:00:22 +02:00
2014-12-16 20:16:06 +01:00
public void OnPluginStart ( )
2008-03-30 09:00:22 +02:00
{
LoadTranslations ( " common.phrases " ) ;
LoadTranslations ( " rockthevote.phrases " ) ;
g_Cvar_Needed = CreateConVar ( " sm_rtv_needed " , " 0.60 " , " Percentage of players needed to rockthevote (Def 60%) " , 0 , true , 0.05 , true , 1.0 ) ;
g_Cvar_MinPlayers = CreateConVar ( " sm_rtv_minplayers " , " 0 " , " Number of players required before RTV will be enabled. " , 0 , true , 0.0 , true , float ( MAXPLAYERS ) ) ;
2008-07-17 09:47:11 +02:00
g_Cvar_InitialDelay = CreateConVar ( " sm_rtv_initialdelay " , " 30.0 " , " Time (in seconds) before first RTV can be held " , 0 , true , 0.00 ) ;
g_Cvar_Interval = CreateConVar ( " sm_rtv_interval " , " 240.0 " , " Time (in seconds) after a failed RTV before another can be held " , 0 , true , 0.00 ) ;
2008-07-01 03:18:52 +02:00
g_Cvar_ChangeTime = CreateConVar ( " sm_rtv_changetime " , " 0 " , " When to change the map after a succesful RTV: 0 - Instant, 1 - RoundEnd, 2 - MapEnd " , _ , true , 0.0 , true , 2.0 ) ;
g_Cvar_RTVPostVoteAction = CreateConVar ( " sm_rtv_postvoteaction " , " 0 " , " What to do with RTV's after a mapvote has completed. 0 - Allow, success = instant change, 1 - Deny " , _ , true , 0.0 , true , 1.0 ) ;
2008-03-30 09:00:22 +02:00
2008-07-01 03:18:52 +02:00
RegConsoleCmd ( " sm_rtv " , Command_RTV ) ;
2008-03-30 09:00:22 +02:00
AutoExecConfig ( true , " rtv " ) ;
}
2014-12-16 20:16:06 +01:00
public void OnMapStart ( )
2008-03-30 09:00:22 +02:00
{
g_Voters = 0 ;
g_Votes = 0 ;
g_VotesNeeded = 0 ;
2008-07-01 03:18:52 +02:00
g_InChange = false ;
/* Handle late load */
2014-12-16 20:16:06 +01:00
for ( int i = 1 ; i < = MaxClients ; i + + )
2008-07-01 03:18:52 +02:00
{
if ( IsClientConnected ( i ) )
{
2008-10-19 06:44:19 +02:00
OnClientConnected ( i ) ;
2008-07-01 03:18:52 +02:00
}
}
2008-03-30 09:00:22 +02:00
}
2014-12-16 20:16:06 +01:00
public void OnMapEnd ( )
2008-03-30 09:00:22 +02:00
{
g_CanRTV = false ;
g_RTVAllowed = false ;
}
2014-12-16 20:16:06 +01:00
public void OnConfigsExecuted ( )
2008-07-01 03:18:52 +02:00
{
2008-03-30 09:00:22 +02:00
g_CanRTV = true ;
2008-07-01 03:18:52 +02:00
g_RTVAllowed = false ;
2014-11-10 01:10:25 +01:00
CreateTimer ( g_Cvar_InitialDelay . FloatValue , Timer_DelayRTV , _ , TIMER_FLAG_NO_MAPCHANGE ) ;
2008-03-30 09:00:22 +02:00
}
2014-12-16 20:16:06 +01:00
public void OnClientConnected ( int client )
2008-03-30 09:00:22 +02:00
{
2008-07-01 03:18:52 +02:00
if ( IsFakeClient ( client ) )
2008-10-19 05:18:22 +02:00
return ;
2008-03-30 09:00:22 +02:00
g_Voted [ client ] = false ;
g_Voters + + ;
2014-11-10 01:10:25 +01:00
g_VotesNeeded = RoundToFloor ( float ( g_Voters ) * g_Cvar_Needed . FloatValue ) ;
2008-03-30 09:00:22 +02:00
2008-10-19 05:18:22 +02:00
return ;
2008-03-30 09:00:22 +02:00
}
2014-12-16 20:16:06 +01:00
public void OnClientDisconnect ( int client )
2008-03-30 09:00:22 +02:00
{
2008-10-19 05:18:22 +02:00
if ( IsFakeClient ( client ) )
2008-03-30 09:00:22 +02:00
return ;
if ( g_Voted [ client ] )
{
g_Votes - - ;
}
g_Voters - - ;
2014-11-10 01:10:25 +01:00
g_VotesNeeded = RoundToFloor ( float ( g_Voters ) * g_Cvar_Needed . FloatValue ) ;
2008-03-30 09:00:22 +02:00
2008-10-19 05:18:22 +02:00
if ( ! g_CanRTV )
{
return ;
}
2008-07-01 03:18:52 +02:00
if ( g_Votes & &
g_Voters & &
g_Votes > = g_VotesNeeded & &
g_RTVAllowed )
2008-03-30 09:00:22 +02:00
{
2014-11-10 01:10:25 +01:00
if ( g_Cvar_RTVPostVoteAction . IntValue = = 1 & & HasEndOfMapVoteFinished ( ) )
2008-07-01 03:18:52 +02:00
{
return ;
}
StartRTV ( ) ;
2008-03-30 09:00:22 +02:00
}
}
2014-12-16 20:16:06 +01:00
public void OnClientSayCommand_Post ( int client , const char [ ] command , const char [ ] sArgs )
2008-03-30 09:00:22 +02:00
{
2008-07-01 03:18:52 +02:00
if ( ! g_CanRTV | | ! client )
2008-03-30 09:00:22 +02:00
{
2014-03-25 16:57:00 +01:00
return ;
2008-03-30 09:00:22 +02:00
}
2014-03-25 16:57:00 +01:00
if ( strcmp ( sArgs , " rtv " , false ) = = 0 | | strcmp ( sArgs , " rockthevote " , false ) = = 0 )
{
2014-12-16 20:16:06 +01:00
ReplySource old = SetCmdReplySource ( SM_REPLY_TO_CHAT ) ;
2014-03-25 16:57:00 +01:00
AttemptRTV ( client ) ;
SetCmdReplySource ( old ) ;
}
2008-03-30 09:00:22 +02:00
}
2014-12-16 20:16:06 +01:00
public Action Command_RTV ( int client , int args )
2008-03-30 09:00:22 +02:00
{
if ( ! g_CanRTV | | ! client )
{
2014-03-25 16:57:00 +01:00
return Plugin_Handled ;
2008-03-30 09:00:22 +02:00
}
2014-03-25 16:57:00 +01:00
AttemptRTV ( client ) ;
2008-07-01 03:18:52 +02:00
2014-03-25 16:57:00 +01:00
return Plugin_Handled ;
2008-03-30 09:00:22 +02:00
}
2014-12-16 20:16:06 +01:00
void AttemptRTV ( int client )
2008-03-30 09:00:22 +02:00
{
2014-11-10 01:10:25 +01:00
if ( ! g_RTVAllowed | | ( g_Cvar_RTVPostVoteAction . IntValue = = 1 & & HasEndOfMapVoteFinished ( ) ) )
2008-03-30 09:00:22 +02:00
{
2008-07-01 03:18:52 +02:00
ReplyToCommand ( client , " [SM] %t " , " RTV Not Allowed " ) ;
2008-03-30 09:00:22 +02:00
return ;
}
2008-07-01 03:18:52 +02:00
if ( ! CanMapChooserStartVote ( ) )
2008-03-30 09:00:22 +02:00
{
2008-07-01 03:18:52 +02:00
ReplyToCommand ( client , " [SM] %t " , " RTV Started " ) ;
return ;
2008-03-30 09:00:22 +02:00
}
2014-11-10 01:10:25 +01:00
if ( GetClientCount ( true ) < g_Cvar_MinPlayers . IntValue )
2008-03-30 09:00:22 +02:00
{
2008-07-01 03:18:52 +02:00
ReplyToCommand ( client , " [SM] %t " , " Minimal Players Not Met " ) ;
return ;
2008-03-30 09:00:22 +02:00
}
2008-07-01 03:18:52 +02:00
if ( g_Voted [ client ] )
2008-03-30 09:00:22 +02:00
{
2009-09-17 08:55:40 +02:00
ReplyToCommand ( client , " [SM] %t " , " Already Voted " , g_Votes , g_VotesNeeded ) ;
2008-07-01 03:18:52 +02:00
return ;
2008-03-30 09:00:22 +02:00
}
2015-06-05 03:42:25 +02:00
char name [ MAX_NAME_LENGTH ] ;
2008-07-01 03:18:52 +02:00
GetClientName ( client , name , sizeof ( name ) ) ;
2008-03-30 09:00:22 +02:00
2008-07-01 03:18:52 +02:00
g_Votes + + ;
g_Voted [ client ] = true ;
PrintToChatAll ( " [SM] %t " , " RTV Requested " , name , g_Votes , g_VotesNeeded ) ;
if ( g_Votes > = g_VotesNeeded )
{
StartRTV ( ) ;
}
2008-03-30 09:00:22 +02:00
}
2014-12-16 20:16:06 +01:00
public Action Timer_DelayRTV ( Handle timer )
2008-03-30 09:00:22 +02:00
{
2008-07-01 03:18:52 +02:00
g_RTVAllowed = true ;
2008-03-30 09:00:22 +02:00
}
2014-12-16 20:16:06 +01:00
void StartRTV ( )
2008-03-30 09:00:22 +02:00
{
2008-07-01 03:18:52 +02:00
if ( g_InChange )
2008-03-30 09:00:22 +02:00
{
2008-07-01 03:18:52 +02:00
return ;
}
2008-08-08 02:06:14 +02:00
if ( EndOfMapVoteEnabled ( ) & & HasEndOfMapVoteFinished ( ) )
2008-07-01 03:18:52 +02:00
{
/* Change right now then */
2014-12-16 20:16:06 +01:00
char map [ PLATFORM_MAX_PATH ] ;
2008-07-01 03:18:52 +02:00
if ( GetNextMap ( map , sizeof ( map ) ) )
2008-03-30 09:00:22 +02:00
{
2015-09-14 17:21:26 +02:00
GetMapDisplayName ( map , map , sizeof ( map ) ) ;
2008-07-01 03:18:52 +02:00
PrintToChatAll ( " [SM] %t " , " Changing Maps " , map ) ;
CreateTimer ( 5.0 , Timer_ChangeMap , _ , TIMER_FLAG_NO_MAPCHANGE ) ;
g_InChange = true ;
2008-03-30 09:00:22 +02:00
2008-07-01 03:18:52 +02:00
ResetRTV ( ) ;
2008-03-30 09:00:22 +02:00
2008-07-01 03:18:52 +02:00
g_RTVAllowed = false ;
2008-03-30 09:00:22 +02:00
}
2008-07-01 03:18:52 +02:00
return ;
2008-03-30 09:00:22 +02:00
}
2008-07-01 03:18:52 +02:00
if ( CanMapChooserStartVote ( ) )
{
2014-12-16 20:16:06 +01:00
MapChange when = view_as < MapChange > ( g_Cvar_ChangeTime . IntValue ) ;
2008-07-01 03:18:52 +02:00
InitiateMapChooserVote ( when ) ;
ResetRTV ( ) ;
g_RTVAllowed = false ;
2014-11-10 01:10:25 +01:00
CreateTimer ( g_Cvar_Interval . FloatValue , Timer_DelayRTV , _ , TIMER_FLAG_NO_MAPCHANGE ) ;
2008-07-01 03:18:52 +02:00
}
2008-03-30 09:00:22 +02:00
}
2014-12-16 20:16:06 +01:00
void ResetRTV ( )
2008-03-30 09:00:22 +02:00
{
2008-07-01 03:18:52 +02:00
g_Votes = 0 ;
2008-03-30 09:00:22 +02:00
2014-12-16 20:16:06 +01:00
for ( int i = 1 ; i < = MAXPLAYERS ; i + + )
2008-07-01 03:18:52 +02:00
{
g_Voted [ i ] = false ;
2008-03-30 09:00:22 +02:00
}
}
2014-12-16 20:16:06 +01:00
public Action Timer_ChangeMap ( Handle hTimer )
2008-03-30 09:00:22 +02:00
{
2008-07-01 03:18:52 +02:00
g_InChange = false ;
2008-03-30 09:00:22 +02:00
2008-07-01 03:18:52 +02:00
LogMessage ( " RTV changing map manually " ) ;
2014-12-16 20:16:06 +01:00
char map [ PLATFORM_MAX_PATH ] ;
2008-07-01 03:18:52 +02:00
if ( GetNextMap ( map , sizeof ( map ) ) )
{
2008-07-13 07:13:37 +02:00
ForceChangeLevel ( map , " RTV after mapvote " ) ;
2008-03-30 09:00:22 +02:00
}
2008-07-01 03:18:52 +02:00
return Plugin_Stop ;
2014-11-10 01:10:25 +01:00
}