2016-01-19 23:57:32 +01:00
/ * *
* vim : set ts = 4 :
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Nominations Extended
* Allows players to nominate maps for Mapchooser
*
* Nominations Extended ( C ) 2012 - 2013 Powerlord ( Ross Bemrose )
* SourceMod ( C ) 2004 - 2007 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>
# include <mapchooser>
# include "include/mapchooser_extended"
# include <colors>
# pragma semicolon 1
2016-04-26 12:36:03 +02:00
# define MCE_VERSION "1.11.0"
2016-01-19 23:57:32 +01:00
public Plugin : myinfo =
{
name = " Map Nominations Extended " ,
author = " Powerlord and AlliedModders LLC " ,
description = " Provides Map Nominations " ,
version = MCE_VERSION ,
url = " https://forums.alliedmods.net/showthread.php?t=156974 "
} ;
new Handle : g_Cvar_ExcludeOld = INVALID_HANDLE ;
new Handle : g_Cvar_ExcludeCurrent = INVALID_HANDLE ;
new Handle : g_MapList = INVALID_HANDLE ;
new Handle : g_AdminMapList = INVALID_HANDLE ;
new Handle : g_MapMenu = INVALID_HANDLE ;
new Handle : g_AdminMapMenu = INVALID_HANDLE ;
new g_mapFileSerial = - 1 ;
new g_AdminMapFileSerial = - 1 ;
# define MAPSTATUS_ENABLED (1<<0)
# define MAPSTATUS_DISABLED (1<<1)
# define MAPSTATUS_EXCLUDE_CURRENT (1<<2)
# define MAPSTATUS_EXCLUDE_PREVIOUS (1<<3)
# define MAPSTATUS_EXCLUDE_NOMINATED (1<<4)
new Handle : g_mapTrie ;
// Nominations Extended Convars
new Handle : g_Cvar_MarkCustomMaps = INVALID_HANDLE ;
new Handle : g_Cvar_NominateDelay = INVALID_HANDLE ;
new Handle : g_Cvar_InitialDelay = INVALID_HANDLE ;
new g_Player_NominationDelay [ MAXPLAYERS + 1 ] ;
new g_NominationDelay ;
public OnPluginStart ( )
{
LoadTranslations ( " common.phrases " ) ;
LoadTranslations ( " nominations.phrases " ) ;
LoadTranslations ( " basetriggers.phrases " ) ; // for Next Map phrase
LoadTranslations ( " mapchooser_extended.phrases " ) ;
new arraySize = ByteCountToCells ( PLATFORM_MAX_PATH ) ;
g_MapList = CreateArray ( arraySize ) ;
g_AdminMapList = CreateArray ( arraySize ) ;
g_Cvar_ExcludeOld = CreateConVar ( " sm_nominate_excludeold " , " 1 " , " Specifies if the current map should be excluded from the Nominations list " , 0 , true , 0.00 , true , 1.0 ) ;
g_Cvar_ExcludeCurrent = CreateConVar ( " sm_nominate_excludecurrent " , " 1 " , " Specifies if the MapChooser excluded maps should also be excluded from Nominations " , 0 , true , 0.00 , true , 1.0 ) ;
g_Cvar_InitialDelay = CreateConVar ( " sm_nominate_initialdelay " , " 60.0 " , " Time in seconds before first Nomination can be made " , 0 , true , 0.00 ) ;
g_Cvar_NominateDelay = CreateConVar ( " sm_nominate_delay " , " 3.0 " , " Delay between nominations " , 0 , true , 0.00 , true , 60.00 ) ;
RegConsoleCmd ( " say " , Command_Say ) ;
RegConsoleCmd ( " say_team " , Command_Say ) ;
RegConsoleCmd ( " sm_nominate " , Command_Nominate ) ;
RegConsoleCmd ( " sm_nomlist " , Command_NominateList ) ;
RegAdminCmd ( " sm_nominate_addmap " , Command_Addmap , ADMFLAG_CHANGEMAP , " sm_nominate_addmap <mapname> - Forces a map to be on the next mapvote. " ) ;
2016-04-26 12:36:03 +02:00
RegAdminCmd ( " sm_nominate_removemap " , Command_Removemap , ADMFLAG_CHANGEMAP , " sm_nominate_removemap <mapname> - Removes a map from Nominations. " ) ;
2016-01-19 23:57:32 +01:00
// BotoX
RegAdminCmd ( " sm_nominate_exclude " , Command_AddExclude , ADMFLAG_CHANGEMAP , " sm_nominate_exclude <mapname> - Forces a map to be inserted into the recently played maps. Effectively blocking the map from being nominated. " ) ;
// Nominations Extended cvars
CreateConVar ( " ne_version " , MCE_VERSION , " Nominations Extended Version " , FCVAR_SPONLY | FCVAR_NOTIFY | FCVAR_DONTRECORD ) ;
g_mapTrie = CreateTrie ( ) ;
}
public OnAllPluginsLoaded ( )
{
// This is an MCE cvar... this plugin requires MCE to be loaded. Granted, this plugin SHOULD have an MCE dependency.
g_Cvar_MarkCustomMaps = FindConVar ( " mce_markcustommaps " ) ;
}
public OnConfigsExecuted ( )
{
if ( ReadMapList ( g_MapList ,
g_mapFileSerial ,
" nominations " ,
MAPLIST_FLAG_CLEARARRAY | MAPLIST_FLAG_MAPSFOLDER )
= = INVALID_HANDLE )
{
if ( g_mapFileSerial = = - 1 )
{
SetFailState ( " Unable to create a valid map list. " ) ;
}
}
if ( ReadMapList ( g_AdminMapList ,
g_AdminMapFileSerial ,
" sm_nominate_addmap menu " ,
MAPLIST_FLAG_CLEARARRAY | MAPLIST_FLAG_NO_DEFAULT | MAPLIST_FLAG_MAPSFOLDER )
= = INVALID_HANDLE )
{
if ( g_AdminMapFileSerial = = - 1 )
{
SetFailState ( " Unable to create a valid admin map list. " ) ;
}
}
else
{
for ( new i = 0 ; i < GetArraySize ( g_MapList ) ; i + + )
{
decl String : map [ PLATFORM_MAX_PATH ] ;
GetArrayString ( g_MapList , i , map , sizeof ( map ) ) ;
new Index = FindStringInArray ( g_AdminMapList , map ) ;
if ( Index ! = - 1 )
RemoveFromArray ( g_AdminMapList , Index ) ;
}
}
g_NominationDelay = GetTime ( ) + GetConVarInt ( g_Cvar_InitialDelay ) ;
BuildMapMenu ( ) ;
BuildAdminMapMenu ( ) ;
}
public OnNominationRemoved ( const String : map [ ] , owner )
{
new status ;
/* Is the map in our list? */
if ( ! GetTrieValue ( g_mapTrie , map , status ) )
{
return ;
}
/* Was the map disabled due to being nominated */
if ( ( status & MAPSTATUS_EXCLUDE_NOMINATED ) ! = MAPSTATUS_EXCLUDE_NOMINATED )
{
return ;
}
SetTrieValue ( g_mapTrie , map , MAPSTATUS_ENABLED ) ;
}
public Action : Command_Addmap ( client , args )
{
if ( args = = 0 )
{
AttemptAdminNominate ( client ) ;
return Plugin_Handled ;
}
if ( args ! = 1 )
{
CReplyToCommand ( client , " [NE] Usage: sm_nominate_addmap <mapname> " ) ;
return Plugin_Handled ;
}
decl String : mapname [ PLATFORM_MAX_PATH ] ;
GetCmdArg ( 1 , mapname , sizeof ( mapname ) ) ;
// new status;
if ( /*!GetTrieValue(g_mapTrie, mapname, status)*/ ! IsMapValid ( mapname ) )
{
CReplyToCommand ( client , " %t " , " Map was not found " , mapname ) ;
return Plugin_Handled ;
}
new NominateResult : result = NominateMap ( mapname , true , 0 ) ;
if ( result > Nominate_Replaced )
{
/* We assume already in vote is the casue because the maplist does a Map Validity check and we forced, so it can't be full */
CReplyToCommand ( client , " %t " , " Map Already In Vote " , mapname ) ;
return Plugin_Handled ;
}
SetTrieValue ( g_mapTrie , mapname , MAPSTATUS_DISABLED | MAPSTATUS_EXCLUDE_NOMINATED ) ;
CReplyToCommand ( client , " %t " , " Map Inserted " , mapname ) ;
LogAction ( client , - 1 , " \" %L \" inserted map \" %s \" . " , client , mapname ) ;
PrintToChatAll ( " [NE] %N has inserted %s into nominations " , client , mapname ) ;
return Plugin_Handled ;
}
2016-04-26 12:36:03 +02:00
public Action : Command_Removemap ( client , args )
{
if ( args ! = 1 )
{
CReplyToCommand ( client , " [NE] Usage: sm_nominate_removemap <mapname> " ) ;
return Plugin_Handled ;
}
decl String : mapname [ PLATFORM_MAX_PATH ] ;
GetCmdArg ( 1 , mapname , sizeof ( mapname ) ) ;
// new status;
if ( /*!GetTrieValue(g_mapTrie, mapname, status)*/ ! IsMapValid ( mapname ) )
{
CReplyToCommand ( client , " %t " , " Map was not found " , mapname ) ;
return Plugin_Handled ;
}
if ( ! RemoveNominationByMap ( mapname ) )
{
CReplyToCommand ( client , " This map isn't nominated. " , mapname ) ;
return Plugin_Handled ;
}
CReplyToCommand ( client , " Map '%s' removed from the nominations list. " , mapname ) ;
LogAction ( client , - 1 , " \" %L \" removed map \" %s \" from nominations. " , client , mapname ) ;
PrintToChatAll ( " [NE] %N has removed %s from nominations " , client , mapname ) ;
return Plugin_Handled ;
}
2016-01-19 23:57:32 +01:00
public Action : Command_AddExclude ( client , args )
{
if ( args < 1 )
{
CReplyToCommand ( client , " [NE] Usage: sm_nominate_exclude <mapname> " ) ;
return Plugin_Handled ;
}
decl String : mapname [ PLATFORM_MAX_PATH ] ;
GetCmdArg ( 1 , mapname , sizeof ( mapname ) ) ;
new status ;
if ( ! GetTrieValue ( g_mapTrie , mapname , status ) )
{
ReplyToCommand ( client , " [NE] %t " , " Map was not found " , mapname ) ;
return Plugin_Handled ;
}
ShowActivity ( client , " Excluded map \" %s \" from nomination " , mapname ) ;
LogAction ( client , - 1 , " \" %L \" excluded map \" %s \" from nomination " , client , mapname ) ;
SetTrieValue ( g_mapTrie , mapname , MAPSTATUS_DISABLED | MAPSTATUS_EXCLUDE_PREVIOUS ) ;
// native call to mapchooser_extended
ExcludeMap ( mapname ) ;
return Plugin_Handled ;
}
public Action : Command_Say ( client , args )
{
if ( ! client )
{
return Plugin_Continue ;
}
decl String : text [ 192 ] ;
if ( ! GetCmdArgString ( text , sizeof ( text ) ) )
{
return Plugin_Continue ;
}
new startidx = 0 ;
if ( text [ strlen ( text ) - 1 ] = = '"' )
{
text [ strlen ( text ) - 1 ] = '\0' ;
startidx = 1 ;
}
new ReplySource : old = SetCmdReplySource ( SM_REPLY_TO_CHAT ) ;
if ( strcmp ( text [ startidx ] , " nominate " , false ) = = 0 )
{
if ( IsNominateAllowed ( client ) )
{
if ( g_NominationDelay > GetTime ( ) )
ReplyToCommand ( client , " [NE] Nominations will be unlocked in %d seconds " , g_NominationDelay - GetTime ( ) ) ;
else
AttemptNominate ( client ) ;
}
}
SetCmdReplySource ( old ) ;
return Plugin_Continue ;
}
public Action : Command_Nominate ( client , args )
{
if ( ! client | | ! IsNominateAllowed ( client ) )
{
return Plugin_Handled ;
}
if ( g_NominationDelay > GetTime ( ) )
{
2016-04-26 12:36:03 +02:00
PrintToChat ( client , " [NE] Nominations will be unlocked in %d seconds " , g_NominationDelay - GetTime ( ) ) ;
2016-01-19 23:57:32 +01:00
return Plugin_Handled ;
}
if ( args = = 0 )
{
AttemptNominate ( client ) ;
return Plugin_Handled ;
}
if ( g_Player_NominationDelay [ client ] > GetTime ( ) )
{
2016-04-26 12:36:03 +02:00
PrintToChat ( client , " [NE] Please wait %d seconds before you can nominate again " , g_Player_NominationDelay [ client ] - GetTime ( ) ) ;
2016-01-19 23:57:32 +01:00
return Plugin_Handled ;
}
decl String : mapname [ PLATFORM_MAX_PATH ] ;
GetCmdArg ( 1 , mapname , sizeof ( mapname ) ) ;
new status ;
if ( ! GetTrieValue ( g_mapTrie , mapname , status ) )
{
2016-04-26 12:36:03 +02:00
CPrintToChat ( client , " %t " , " Map was not found " , mapname ) ;
2016-01-19 23:57:32 +01:00
return Plugin_Handled ;
}
if ( ( status & MAPSTATUS_DISABLED ) = = MAPSTATUS_DISABLED )
{
if ( ( status & MAPSTATUS_EXCLUDE_CURRENT ) = = MAPSTATUS_EXCLUDE_CURRENT )
{
2016-04-26 12:36:03 +02:00
CPrintToChat ( client , " [NE] %t " , " Can't Nominate Current Map " ) ;
2016-01-19 23:57:32 +01:00
}
if ( ( status & MAPSTATUS_EXCLUDE_PREVIOUS ) = = MAPSTATUS_EXCLUDE_PREVIOUS )
{
2016-04-26 12:36:03 +02:00
CPrintToChat ( client , " [NE] %t " , " Map in Exclude List " ) ;
2016-01-19 23:57:32 +01:00
}
if ( ( status & MAPSTATUS_EXCLUDE_NOMINATED ) = = MAPSTATUS_EXCLUDE_NOMINATED )
{
2016-04-26 12:36:03 +02:00
CPrintToChat ( client , " [NE] %t " , " Map Already Nominated " ) ;
2016-01-19 23:57:32 +01:00
}
return Plugin_Handled ;
}
new NominateResult : result = NominateMap ( mapname , false , client ) ;
if ( result > Nominate_Replaced )
{
if ( result = = Nominate_AlreadyInVote )
{
2016-04-26 12:36:03 +02:00
CPrintToChat ( client , " [NE] %t " , " Map Already In Vote " , mapname ) ;
2016-01-19 23:57:32 +01:00
}
else if ( result = = Nominate_VoteFull )
{
2016-04-26 12:36:03 +02:00
CPrintToChat ( client , " [ME] %t " , " Max Nominations " ) ;
2016-01-19 23:57:32 +01:00
}
return Plugin_Handled ;
}
/* Map was nominated! - Disable the menu item and update the trie */
SetTrieValue ( g_mapTrie , mapname , MAPSTATUS_DISABLED | MAPSTATUS_EXCLUDE_NOMINATED ) ;
decl String : name [ MAX_NAME_LENGTH ] ;
GetClientName ( client , name , sizeof ( name ) ) ;
if ( result = = Nominate_Added )
PrintToChatAll ( " [NE] %t " , " Map Nominated " , name , mapname ) ;
else if ( result = = Nominate_Replaced )
PrintToChatAll ( " [NE] %t " , " Map Nomination Changed " , name , mapname ) ;
LogMessage ( " %s nominated %s " , name , mapname ) ;
g_Player_NominationDelay [ client ] = GetTime ( ) + GetConVarInt ( g_Cvar_NominateDelay ) ;
return Plugin_Continue ;
}
public Action : Command_NominateList ( client , args )
{
new arraySize = ByteCountToCells ( PLATFORM_MAX_PATH ) ;
new Handle : MapList = CreateArray ( arraySize ) ;
GetNominatedMapList ( MapList ) ;
if ( ! GetArraySize ( MapList ) )
{
2016-04-26 12:36:03 +02:00
CPrintToChat ( client , " [NE] No maps have been nominated. " ) ;
2016-01-19 23:57:32 +01:00
return Plugin_Handled ;
}
new Handle : NominateListMenu = CreateMenu ( Handler_NominateListMenu , MENU_ACTIONS_DEFAULT | MenuAction_DisplayItem ) ;
decl String : map [ PLATFORM_MAX_PATH ] ;
for ( new i = 0 ; i < GetArraySize ( MapList ) ; i + + )
{
GetArrayString ( MapList , i , map , sizeof ( map ) ) ;
AddMenuItem ( NominateListMenu , map , map ) ;
}
SetMenuTitle ( NominateListMenu , " Nominated Maps " , client ) ;
DisplayMenu ( NominateListMenu , client , MENU_TIME_FOREVER ) ;
return Plugin_Handled ;
}
public Handler_NominateListMenu ( Handle : menu , MenuAction : action , param1 , param2 )
{
return 0 ;
}
AttemptNominate ( client )
{
SetMenuTitle ( g_MapMenu , " %T " , " Nominate Title " , client ) ;
DisplayMenu ( g_MapMenu , client , MENU_TIME_FOREVER ) ;
return ;
}
AttemptAdminNominate ( client )
{
SetMenuTitle ( g_AdminMapMenu , " %T " , " Nominate Title " , client ) ;
DisplayMenu ( g_AdminMapMenu , client , MENU_TIME_FOREVER ) ;
return ;
}
BuildMapMenu ( )
{
if ( g_MapMenu ! = INVALID_HANDLE )
{
CloseHandle ( g_MapMenu ) ;
g_MapMenu = INVALID_HANDLE ;
}
ClearTrie ( g_mapTrie ) ;
g_MapMenu = CreateMenu ( Handler_MapSelectMenu , MENU_ACTIONS_DEFAULT | MenuAction_DrawItem | MenuAction_DisplayItem ) ;
decl String : map [ PLATFORM_MAX_PATH ] ;
new Handle : excludeMaps = INVALID_HANDLE ;
decl String : currentMap [ 32 ] ;
if ( GetConVarBool ( g_Cvar_ExcludeOld ) )
{
excludeMaps = CreateArray ( ByteCountToCells ( PLATFORM_MAX_PATH ) ) ;
GetExcludeMapList ( excludeMaps ) ;
}
if ( GetConVarBool ( g_Cvar_ExcludeCurrent ) )
{
GetCurrentMap ( currentMap , sizeof ( currentMap ) ) ;
}
for ( new i = 0 ; i < GetArraySize ( g_MapList ) ; i + + )
{
new status = MAPSTATUS_ENABLED ;
GetArrayString ( g_MapList , i , map , sizeof ( map ) ) ;
if ( GetConVarBool ( g_Cvar_ExcludeCurrent ) )
{
if ( StrEqual ( map , currentMap ) )
{
status = MAPSTATUS_DISABLED | MAPSTATUS_EXCLUDE_CURRENT ;
}
}
/* Dont bother with this check if the current map check passed */
if ( GetConVarBool ( g_Cvar_ExcludeOld ) & & status = = MAPSTATUS_ENABLED )
{
if ( FindStringInArray ( excludeMaps , map ) ! = - 1 )
{
status = MAPSTATUS_DISABLED | MAPSTATUS_EXCLUDE_PREVIOUS ;
}
}
AddMenuItem ( g_MapMenu , map , map ) ;
SetTrieValue ( g_mapTrie , map , status ) ;
}
SetMenuExitButton ( g_MapMenu , true ) ;
if ( excludeMaps ! = INVALID_HANDLE )
{
CloseHandle ( excludeMaps ) ;
}
}
BuildAdminMapMenu ( )
{
if ( g_AdminMapMenu ! = INVALID_HANDLE )
{
CloseHandle ( g_AdminMapMenu ) ;
g_AdminMapMenu = INVALID_HANDLE ;
}
g_AdminMapMenu = CreateMenu ( Handler_AdminMapSelectMenu , MENU_ACTIONS_DEFAULT | MenuAction_DrawItem | MenuAction_DisplayItem ) ;
decl String : map [ PLATFORM_MAX_PATH ] ;
for ( new i = 0 ; i < GetArraySize ( g_AdminMapList ) ; i + + )
{
GetArrayString ( g_AdminMapList , i , map , sizeof ( map ) ) ;
AddMenuItem ( g_AdminMapMenu , map , map ) ;
}
SetMenuExitButton ( g_AdminMapMenu , true ) ;
}
public Handler_MapSelectMenu ( Handle : menu , MenuAction : action , param1 , param2 )
{
switch ( action )
{
case MenuAction_Select :
{
2016-04-26 12:36:03 +02:00
if ( g_Player_NominationDelay [ param1 ] > GetTime ( ) )
{
PrintToChat ( param1 , " [NE] Please wait %d seconds before you can nominate again " , g_Player_NominationDelay [ param1 ] - GetTime ( ) ) ;
DisplayMenuAtItem ( menu , param1 , GetMenuSelectionPosition ( ) , MENU_TIME_FOREVER ) ;
return 0 ;
}
2016-01-19 23:57:32 +01:00
decl String : map [ PLATFORM_MAX_PATH ] , String : name [ MAX_NAME_LENGTH ] ;
GetMenuItem ( menu , param2 , map , sizeof ( map ) ) ;
GetClientName ( param1 , name , MAX_NAME_LENGTH ) ;
new NominateResult : result = NominateMap ( map , false , param1 ) ;
/* Don't need to check for InvalidMap because the menu did that already */
if ( result = = Nominate_AlreadyInVote )
{
PrintToChat ( param1 , " [NE] %t " , " Map Already Nominated " ) ;
return 0 ;
}
else if ( result = = Nominate_VoteFull )
{
PrintToChat ( param1 , " [NE] %t " , " Max Nominations " ) ;
return 0 ;
}
SetTrieValue ( g_mapTrie , map , MAPSTATUS_DISABLED | MAPSTATUS_EXCLUDE_NOMINATED ) ;
if ( result = = Nominate_Added )
PrintToChatAll ( " [NE] %t " , " Map Nominated " , name , map ) ;
else if ( result = = Nominate_Replaced )
PrintToChatAll ( " [NE] %t " , " Map Nomination Changed " , name , map ) ;
LogMessage ( " %s nominated %s " , name , map ) ;
2016-04-26 12:36:03 +02:00
g_Player_NominationDelay [ param1 ] = GetTime ( ) + GetConVarInt ( g_Cvar_NominateDelay ) ;
2016-01-19 23:57:32 +01:00
}
case MenuAction_DrawItem :
{
decl String : map [ PLATFORM_MAX_PATH ] ;
GetMenuItem ( menu , param2 , map , sizeof ( map ) ) ;
new status ;
if ( ! GetTrieValue ( g_mapTrie , map , status ) )
{
LogError ( " Menu selection of item not in trie. Major logic problem somewhere. " ) ;
return ITEMDRAW_DEFAULT ;
}
if ( ( status & MAPSTATUS_DISABLED ) = = MAPSTATUS_DISABLED )
{
return ITEMDRAW_DISABLED ;
}
return ITEMDRAW_DEFAULT ;
}
case MenuAction_DisplayItem :
{
decl String : map [ PLATFORM_MAX_PATH ] ;
GetMenuItem ( menu , param2 , map , sizeof ( map ) ) ;
new mark = GetConVarInt ( g_Cvar_MarkCustomMaps ) ;
new bool : official ;
new status ;
if ( ! GetTrieValue ( g_mapTrie , map , status ) )
{
LogError ( " Menu selection of item not in trie. Major logic problem somewhere. " ) ;
return 0 ;
}
decl String : buffer [ 100 ] ;
decl String : display [ 150 ] ;
if ( mark )
{
official = IsMapOfficial ( map ) ;
}
if ( mark & & ! official )
{
switch ( mark )
{
case 1 :
{
Format ( buffer , sizeof ( buffer ) , " %T " , " Custom Marked " , param1 , map ) ;
}
case 2 :
{
Format ( buffer , sizeof ( buffer ) , " %T " , " Custom " , param1 , map ) ;
}
}
}
else
{
strcopy ( buffer , sizeof ( buffer ) , map ) ;
}
if ( ( status & MAPSTATUS_DISABLED ) = = MAPSTATUS_DISABLED )
{
if ( ( status & MAPSTATUS_EXCLUDE_CURRENT ) = = MAPSTATUS_EXCLUDE_CURRENT )
{
Format ( display , sizeof ( display ) , " %s (%T) " , buffer , " Current Map " , param1 ) ;
return RedrawMenuItem ( display ) ;
}
if ( ( status & MAPSTATUS_EXCLUDE_PREVIOUS ) = = MAPSTATUS_EXCLUDE_PREVIOUS )
{
Format ( display , sizeof ( display ) , " %s (%T) " , buffer , " Recently Played " , param1 ) ;
return RedrawMenuItem ( display ) ;
}
if ( ( status & MAPSTATUS_EXCLUDE_NOMINATED ) = = MAPSTATUS_EXCLUDE_NOMINATED )
{
Format ( display , sizeof ( display ) , " %s (%T) " , buffer , " Nominated " , param1 ) ;
return RedrawMenuItem ( display ) ;
}
}
if ( mark & & ! official )
return RedrawMenuItem ( buffer ) ;
return 0 ;
}
}
return 0 ;
}
stock bool : IsNominateAllowed ( client )
{
new CanNominateResult : result = CanNominate ( ) ;
switch ( result )
{
case CanNominate_No_VoteInProgress :
{
CReplyToCommand ( client , " [ME] %t " , " Nextmap Voting Started " ) ;
return false ;
}
case CanNominate_No_VoteComplete :
{
new String : map [ PLATFORM_MAX_PATH ] ;
GetNextMap ( map , sizeof ( map ) ) ;
CReplyToCommand ( client , " [NE] %t " , " Next Map " , map ) ;
return false ;
}
/ *
case CanNominate_No_VoteFull :
{
CReplyToCommand ( client , " [ME] %t " , " Max Nominations " ) ;
return false ;
}
* /
}
return true ;
}
public Handler_AdminMapSelectMenu ( Handle : menu , MenuAction : action , param1 , param2 )
{
switch ( action )
{
case MenuAction_Select :
{
2016-01-28 01:18:10 +01:00
decl String : map [ PLATFORM_MAX_PATH ] ;
2016-01-19 23:57:32 +01:00
GetMenuItem ( menu , param2 , map , sizeof ( map ) ) ;
2016-01-28 01:18:10 +01:00
new NominateResult : result = NominateMap ( map , true , 0 ) ;
2016-01-19 23:57:32 +01:00
2016-01-28 01:18:10 +01:00
if ( result > Nominate_Replaced )
2016-01-19 23:57:32 +01:00
{
2016-01-28 01:18:10 +01:00
/* We assume already in vote is the casue because the maplist does a Map Validity check and we forced, so it can't be full */
2016-01-19 23:57:32 +01:00
PrintToChat ( param1 , " [NE] %t " , " Map Already In Vote " , map ) ;
return 0 ;
}
SetTrieValue ( g_mapTrie , map , MAPSTATUS_DISABLED | MAPSTATUS_EXCLUDE_NOMINATED ) ;
PrintToChat ( param1 , " [NE] %t " , " Map Inserted " , map ) ;
LogAction ( param1 , - 1 , " \" %L \" inserted map \" %s \" . " , param1 , map ) ;
2016-01-28 01:18:10 +01:00
PrintToChatAll ( " [NE] %N has inserted %s into nominations " , param1 , map ) ;
2016-01-19 23:57:32 +01:00
}
}
return 0 ;
}