PHP Code:
public pug_votemap_menu;
public pug_cvar_vote_time;
public pug_cvar_votemap
public pug_cvar_votemap_e
new votemap_noswitch
public pug_voting = 0;
public plugin_init()
{
pug_cvar_vote_time = register_cvar("pug_vote_delay","20")
pug_cvar_votemap = register_cvar("pug_votemap","1")
pug_cvar_votemap_e = register_cvar("pug_votemap_enabled","1")
register_pug_admincmd("votemap","cmd_votemap",PUG_CMD_LVL,"MAPS")
pug_votemap_menu = menu_create("ESVE Pug Map:","votemap_handle");
menu_setprop(pug_votemap_menu,MPROP_EXIT,MEXIT_NEVER)
}
public plugin_cfg() try_load_votemap_menu()
CREATE_GEN_FORW_ID(firsthalf_forward)
public pug_firsthalf(GEN_FORW_ID(forward_id))
{
firsthalf_forward = forward_id
if( get_pcvar_num(pug_cvar_votemap_e) && get_pcvar_num(pug_cvar_votemap) ) votemap_start();
else voteteam_start();
return PLUGIN_HANDLED;
}
public pug_finished()
{
if(!votemap_noswitch) set_pcvar_num(pug_cvar_votemap_e,1)
}
#define MAX_MAPS 20
new pug_votemap_votes[MAX_MAPS]
new pug_votemap_name[MAX_MAPS][32]
new pug_votemap_count;
public try_load_votemap_menu()
{
// Rukia: Get our maps.ini
static filename[64]
get_configsdir( filename, 63 )
format( filename, 63, "%s/maps.ini", filename )
// Rukia: Otherwise, just use mapcycle
if(file_exists(filename))
{
load_votemap_menu(filename)
if(pug_votemap_count != 0) return;
}
copy(filename,63,"mapcycle.txt")
load_votemap_menu(filename)
}
public load_votemap_menu(filename[])
{
new file = fopen(filename,"rb")
static text[256], szDesc[48], num[10]
while( (pug_votemap_count < MAX_MAPS) && !feof(file) && fgets(file,text,255) )
{
// Rukia: Take out common comment conventions
if(text[0]==';') continue
if( (text[0]=='/') && (text[1]=='/') ) continue
// Rukia: Remove the newline character
text[strlen(text)] = '^0'
// Rukia: Get the map name and description out of what we read
strbreak(text,pug_votemap_name[pug_votemap_count],31,szDesc,47)
// Rukia: If the map is invalid, skip it
if( !is_map_valid( pug_votemap_name[pug_votemap_count] ) ) continue;
// Rukia: If there is no description (such as if we use mapcycle) then just use the first part of the map name
if(szDesc[0] == '^0') strtok(pug_votemap_name[pug_votemap_count],szDesc,47,"",0,'.',1)
// Rukia: The map number will be our index
formatex(num,9,"%i",pug_votemap_count)
// Rukia: Add the item into the menu and move on
menu_additem(pug_votemap_menu, pug_votemap_name[pug_votemap_count],num )
pug_votemap_count++;
}
fclose(file)
}
public cmd_votemap(id,level,cid)
{
if (!cmd_access(id, level, cid, 1) ) return pug_msg_tmp_empty(id,"PUG_CMD_NOTALLOWED")
votemap_start()
return PLUGIN_HANDLED;
}
public votemap_start()
{
if(pug_voting) { set_task(get_pcvar_float(pug_cvar_vote_time),"votemap_start",100 + pug_votemap_menu); return; }
pug_voting = 1;
arrayset(pug_voted,0,33)
arrayset(pug_votemap_votes,0,pug_votemap_count)
pug_display_menu_all(pug_votemap_menu)
client_print(0,print_chat,"",pug_header, LANG_PLAYER, "PUG_VOTE_START", "PUG map");
console_print(0,"%s %L",pug_header, LANG_PLAYER, "PUG_VOTE_START", "PUG map");
set_task(get_pcvar_float(pug_cvar_vote_time),"votemap_end",100 + pug_votemap_menu)
}
public votemap_end()
{
pug_cancel_menu()
pug_voting = 0;
remove_task ( 100 + pug_votemap_menu )
if(votemap_count()) voteteam_start();
}
public votemap_handle(id, menu, item)
{
if( item < 0 ) return PLUGIN_CONTINUE;
static access, callback
static cmd[3], name[32], cmdname[32]
menu_item_getinfo(menu, item, access, cmd,2,cmdname,31, callback);
pug_votemap_votes[str_to_num(cmd)]++;
get_user_name(id,name,31)
client_print(0,print_chat,"",pug_header, LANG_PLAYER, "PUG_VOTED_FOR", name, cmdname);
console_print(0,"%s %L",pug_header, LANG_PLAYER, "PUG_VOTED_FOR", name, cmdname);
pug_voted[id] = 1;
if(pug_should_stopvote() ) votemap_end()
return PLUGIN_HANDLED;
}
public votemap_count()
{
new winner, winner_votes, votes
for(new i = 0; i < pug_votemap_count; ++i)
{
votes = pug_votemap_votes[i]
if(votes > winner_votes) { winner = i; winner_votes = votes; }
else if(votes == winner_votes) if(random_num(0,1)) { winner = i; winner_votes = votes; }
}
if(pug_votemap_votes[winner] == 0)
{
message_begin(MSG_ALL, SVC_INTERMISSION)
message_end()
new iMap = random(pug_votemap_count)
set_task(3.0,"pug_votemap_change2", iMap);
client_print( 0 , print_chat , "[ESVE Pug] %s has been chosen randomly." , pug_votemap_name[ iMap ] );
return PLUGIN_CONTINUE
}
client_print(0,print_chat,"%s %L",pug_header, LANG_PLAYER, "PUG_VOTE_WIN", pug_votemap_name[winner]);
console_print(0,"%s %L",pug_header, LANG_PLAYER, "PUG_VOTE_WIN", pug_votemap_name[winner]);
pug_voting = 0;
votemap_noswitch = 1;
set_pcvar_num(pug_cvar_votemap_e,0)
message_begin(MSG_ALL, SVC_INTERMISSION)
message_end()
set_task(3.0,"pug_votemap_change",winner)
return PLUGIN_CONTINUE
}
public pug_votemap_change2( iMap )
{
server_cmd( "changelevel %s" , pug_votemap_name[ iMap ] );
}
public pug_votemap_change(winner)
{
server_cmd("changelevel %s",pug_votemap_name[winner]);
}