2018-11-14 18:39:28 +01:00
# include <sourcemod>
# include <mapchooser>
# include <basecomm>
# include <mapchooser_extended>
# pragma semicolon 1
# pragma newdecls required
char g_configPath [ PLATFORM_MAX_PATH ] ;
Menu g_mapMenu ;
int g_Player_NominationDelay [ MAXPLAYERS + 1 ] ;
ConVar g_Cvar_NominateDelay = null ;
public Plugin myinfo = {
name = " Top 12 Nomination " ,
author = " Nicklas Vedsted " ,
description = " Allows very special people to nominate particular maps. " ,
version = " 1.0.0 " ,
url = " https://gflclan.com/ "
} ;
public void OnPluginStart ( ) {
BuildPath ( Path_SM , g_configPath , PLATFORM_MAX_PATH , " configs/specialfriday.cfg " ) ;
buildMenu ( ) ;
RegAdminCmd ( " sm_top12_nominate " , Cmd_Nominate , ADMFLAG_RESERVATION | ADMFLAG_CUSTOM1 | ADMFLAG_CUSTOM3 | ADMFLAG_CUSTOM4 | ADMFLAG_CUSTOM5 | ADMFLAG_CUSTOM6 , " Opens Top 12 Nominations. " ) ;
}
public void OnAllPluginsLoaded ( ) {
g_Cvar_NominateDelay = FindConVar ( " sm_nominate_delay " ) ;
}
public Action Cmd_Nominate ( int client , int args ) {
if ( ! IsNominateAllowed ( client ) ) return Plugin_Handled ;
if ( g_mapMenu . ItemCount = = 0 ) {
ReplyToCommand ( client , " [Top12] There are no maps that can be special nominated. " ) ;
return Plugin_Handled ;
}
g_mapMenu . Display ( client , MENU_TIME_FOREVER ) ;
return Plugin_Handled ;
}
public int Handler_MapSelectMenu ( Menu menu , MenuAction action , int client , int position ) {
switch ( action ) {
case MenuAction_Select : {
if ( g_Player_NominationDelay [ client ] > GetTime ( ) ) {
PrintToChat ( client , " [Top12] Please wait %d seconds before you can nominate again " , g_Player_NominationDelay [ client ] - GetTime ( ) ) ;
menu . DisplayAt ( client , menu . Selection , MENU_TIME_FOREVER ) ;
return 0 ;
}
char map [ PLATFORM_MAX_PATH ] ;
menu . GetItem ( position , map , PLATFORM_MAX_PATH ) ;
NominateResult result = NominateMap ( map , false , client ) ;
switch ( result ) {
case Nominate_AlreadyInVote : {
PrintToChat ( client , " [Top12] Map is already nominated. " ) ;
return 0 ;
}
case Nominate_VoteFull : {
PrintToChat ( client , " [Top12] There is not room for more nominations. " ) ;
return 0 ;
}
case Nominate_InvalidMap : {
PrintToChat ( client , " [Top12] %s is not a valid map. Please contact the server manager in order to fix this. " , map ) ;
return 0 ;
}
case Nominate_Added : {
PrintToChatAll ( " [Top12] %N (special) nominated %s! " , client , map ) ;
}
case Nominate_Replaced : {
PrintToChatAll ( " [Top12] %N changed their nomination to %s. " , client , map ) ;
}
}
g_Player_NominationDelay [ client ] = GetTime ( ) + getNominationDelay ( ) ;
LogMessage ( " %N (special) nominated %s " , client , map ) ;
}
case MenuAction_DrawItem : {
char map [ PLATFORM_MAX_PATH ] ;
menu . GetItem ( position , map , PLATFORM_MAX_PATH ) ;
if ( GetMapCooldown ( map ) | | GetMapTimeRestriction ( map ) | | GetMapPlayerRestriction ( map ) | | GetMapGroupRestriction ( map , client ) > = 0 ) {
return ITEMDRAW_DISABLED ;
}
return ITEMDRAW_DEFAULT ;
}
case MenuAction_DisplayItem : {
char map [ PLATFORM_MAX_PATH ] ;
menu . GetItem ( position , map , sizeof ( map ) ) ;
char display [ 150 ] ;
int Cooldown = GetMapCooldown ( map ) ;
if ( Cooldown ) {
Format ( display , sizeof ( display ) , " %s (Recently Played %d) " , map , Cooldown ) ;
return RedrawMenuItem ( display ) ;
}
int TimeRestriction = GetMapTimeRestriction ( map ) ;
if ( TimeRestriction ) {
Format ( display , sizeof ( display ) , " %s (Time+%dH%dM) " , map , RoundToFloor ( float ( TimeRestriction / 60 ) ) , TimeRestriction % 60 ) ;
return RedrawMenuItem ( display ) ;
}
int PlayerRestriction = GetMapPlayerRestriction ( map ) ;
if ( PlayerRestriction ! = 0 ) {
if ( PlayerRestriction < 0 ) {
Format ( display , sizeof ( display ) , " %s (Players+%d) " , map , PlayerRestriction * - 1 ) ;
} else {
Format ( display , sizeof ( display ) , " %s (Players-%d) " , map , PlayerRestriction ) ;
}
return RedrawMenuItem ( display ) ;
}
int GroupRestriction = GetMapGroupRestriction ( map , client ) ;
if ( GroupRestriction > = 0 ) {
Format ( display , sizeof ( display ) , " %s (Group max: %d) " , map , GroupRestriction ) ;
return RedrawMenuItem ( display ) ;
}
}
}
return 0 ;
}
stock void buildMenu ( ) {
g_mapMenu = new Menu ( Handler_MapSelectMenu , MENU_ACTIONS_DEFAULT | MenuAction_DrawItem | MenuAction_DisplayItem ) ;
g_mapMenu . SetTitle ( " Special Nominate A Map! " ) ;
SetMenuExitButton ( g_mapMenu , true ) ;
ArrayList maps = new ArrayList ( ByteCountToCells ( PLATFORM_MAX_PATH ) ) ;
if ( ! FileExists ( g_configPath ) ) {
PrintToServer ( " [Top12] specialfriday.cfg does not exists. No nominations has been added. " ) ;
return ;
}
File configFile = OpenFile ( g_configPath , " r " ) ;
char map [ PLATFORM_MAX_PATH ] ;
while ( configFile . ReadLine ( map , PLATFORM_MAX_PATH ) ) {
TrimString ( map ) ;
if ( strlen ( map ) = = 0 | | map [ 0 ] = = '#' | | map [ 0 ] = = '/' ) continue ;
maps . PushString ( map ) ;
}
configFile . Close ( ) ;
SortADTArray ( maps , Sort_Ascending , Sort_String ) ;
for ( int i = 0 ; i < maps . Length ; + + i ) {
maps . GetString ( i , map , PLATFORM_MAX_PATH ) ;
g_mapMenu . AddItem ( map , map ) ;
}
}
stock bool IsNominateAllowed ( int client ) {
if ( BaseComm_IsClientGagged ( client ) )
return false ;
CanNominateResult result = CanNominate ( ) ;
switch ( result )
{
case CanNominate_No_VoteInProgress :
{
ReplyToCommand ( client , " [Top12] Vote is already in progress. " ) ;
return false ;
}
case CanNominate_No_VoteComplete :
{
char map [ PLATFORM_MAX_PATH ] ;
GetNextMap ( map , sizeof ( map ) ) ;
ReplyToCommand ( client , " [Top12] The next map is %s. " , map ) ;
return false ;
}
}
return true ;
}
stock int getNominationDelay ( ) {
if ( g_Cvar_NominateDelay = = null ) {
return 3 ;
}
return g_Cvar_NominateDelay . IntValue ;
2018-11-28 21:26:13 +01:00
}