[pawn]
- #include <amxmodx>
- new const PLUGIN[] = "Super Mapchooser"
- new const VERSION[] = "2.0"
- new const AUTHOR[] = "Prayer"
- #define FLOAT_TIMELIMIT "mp_timelimit"
- #define STRING_NEXTMAP "amx_nextmap"
- #define NUM_MAXROUNDS "mp_maxrounds"
- #define NUM_WINLIMIT "mp_winlimit"
- #define NUM_SM_VOTEMAPS "mapchooser_votemaps"
- #define NUM_SM_LANG "mapchooser_lang"
- #define NUM_SM_TIME "mapchooser_votetime"
- #define NUM_SM_RED "mapchooser_result_red"
- #define NUM_SM_GREEN "mapchooser_result_green"
- #define NUM_SM_BLUE "mapchooser_result_blue"
- #define TASK_PLUGIN_ID 44747477 // +=:D
- #define TASK_SCREEN_ID 979699 // +=:D:=+
- #define TASK_RESULT_ID 12111 // :o
- const HudLen = 512
- new Array:g_mapName
- new g_mapNums
- new g_saveids[10]
- new g_voteCount[10]
- new g_nextName[10]
- new g_lastMap[32]
- new g_currentMap[32]
- new g_mapVoteNum
- new g_votemaps
- new g_maxspeed = 320
- new bool:hasBlocked = false
- new bool:forceBlock = true
- new bool:voteStarted = true
- new bool:hasExtend = false
- new timeleft
- new bool:hasBlind[33] = { false, ... }
- new g_msgScreenFade
- new PlayersVoted = 0
- new PlayersNum = 0
- new
- g_result_red,
- g_result_green,
- g_result_blue
- new MenuName[96]
- enum ChatColor
- {
- CHATCOLOR_NORMAL = 1, // Normal
- CHATCOLOR_GREEN, // Green Color
- CHATCOLOR_TEAM_COLOR, // Red, grey, blue
- CHATCOLOR_GREY, // grey
- CHATCOLOR_RED, // Red
- CHATCOLOR_BLUE, // Blue
- }
- new g_TeamName[][] =
- {
- "",
- "TERRORIST",
- "CT",
- "SPECTATOR"
- }
- new g_msgSayText
- new g_msgTeamInfo
- public plugin_init()
- {
- register_plugin(PLUGIN, VERSION, AUTHOR)
- register_cvar("amx_extendmap_max", "90.0")
- register_cvar("amx_extendmap_step", "15.0")
- register_cvar(NUM_SM_LANG, "0")
- register_cvar(NUM_SM_TIME, "15")
- register_cvar(NUM_SM_VOTEMAPS, "5")
- register_cvar(NUM_SM_RED, "255")
- register_cvar(NUM_SM_GREEN, "255")
- register_cvar(NUM_SM_BLUE, "255")
- register_event("ScreenFade", "EVENT_ScreenFade", "be")
- register_event("TextMsg", "EVENT_RestartRound", "a", "2&#Game_C","2&#Game_w")
- g_msgSayText = get_user_msgid("SayText")
- g_msgTeamInfo = get_user_msgid("TeamInfo")
- g_msgScreenFade = get_user_msgid("ScreenFade")
- }
- public plugin_cfg()
- {
- g_votemaps = get_cvar_num(NUM_SM_VOTEMAPS)
- if(g_votemaps > 8)
- set_cvar_num(NUM_SM_VOTEMAPS, 8)
- else if(g_votemaps < 1)
- set_cvar_num(NUM_SM_VOTEMAPS, 1)
- g_votemaps = get_cvar_num(NUM_SM_VOTEMAPS)
- register_menucmd(register_menuid("superMapChooserMenu"), (-1^(-1<<(g_votemaps + 1))), "countVote")
- g_mapName = ArrayCreate(32)
- get_localinfo("lastMap", g_lastMap, sizeof g_lastMap -1)
- set_localinfo("lastMap", "")
- new maps_ini_file[64]
- get_localinfo("amxx_configsdir", maps_ini_file, sizeof maps_ini_file -1)
- format(maps_ini_file, sizeof maps_ini_file -1, "%s/maps.ini", maps_ini_file)
- if(!file_exists(maps_ini_file))
- get_cvar_string("mapcyclefile", maps_ini_file, sizeof maps_ini_file -1)
- if(loadSettings(maps_ini_file))
- cmdReloadTimer()
- g_maxspeed = get_cvar_num("sv_maxspeed")
- // bugfix: need for timeleft (cs time == amxx time): !(!(remaining == left)) || !(remaining != left) :o
- server_cmd("sv_restart 1")
- get_mapname(g_currentMap, sizeof g_currentMap -1)
- }
- public client_disconnect(id)
- {
- remove_task(id+TASK_SCREEN_ID)
- remove_task(id+TASK_RESULT_ID)
- hasBlind[id] = false
- }
- public EVENT_RestartRound()
- cmdReloadTimer()
- public cmdReloadTimer()
- {
- if(voteStarted)
- {
- PlayersVoted = 0
- PlayersNum = 0
- forceBlock = true
- hasBlocked = false
- voteStarted = false
- new players[32], num, pid
- get_players(players, num)
- for(new i=0;i<num;i++)
- {
- pid = players[i]
- hasBlind[pid] = false
- remove_task(pid+TASK_SCREEN_ID)
- remove_task(pid+TASK_RESULT_ID)
- message_begin(MSG_ONE, g_msgScreenFade, _, pid)
- write_short(1<<0)
- write_short(1<<0)
- write_short(1<<0)
- write_byte(0)
- write_byte(0)
- write_byte(0)
- write_byte(0)
- message_end()
- }
- if(!hasExtend)
- {
- switch(get_cvar_num(NUM_SM_LANG))
- {
- case 0: colorChat(0, CHATCOLOR_RED, "Голосование прервано !")
- case 1: colorChat(0, CHATCOLOR_RED, "Voting is interrupted!")
- }
- }
- set_cvar_num("sv_maxspeed", g_maxspeed)
- remove_task(TASK_PLUGIN_ID)
- set_task(8.0, "taskListening", TASK_PLUGIN_ID, "", 0, "b")
- taskListening()
- }
- }
- public taskListening()
- {
- timeleft = get_timeleft()
- if(!hasBlocked && (timeleft <= (get_cvar_num(NUM_SM_TIME) + 14)))
- {
- change_task(TASK_PLUGIN_ID, 1.0)
- hasBlocked = true
- }
- else if(timeleft <= (5 + get_cvar_num(NUM_SM_TIME)))//5 sekynd - skoka ostaetsia do smeni karti posle okon4ania golosovania
- {
- remove_task(TASK_PLUGIN_ID)
- forceBlock = false
- hasBlocked = false
- hasExtend = false
- g_result_red = get_cvar_num(NUM_SM_RED)
- g_result_green = get_cvar_num(NUM_SM_GREEN)
- g_result_blue = get_cvar_num(NUM_SM_BLUE)
- set_cvar_num("sv_maxspeed", 0)
- switch(get_cvar_num(NUM_SM_LANG))
- {
- case 0: format(MenuName, sizeof MenuName -1, "Проголосуйте за следующую карту")
- case 1: format(MenuName, sizeof MenuName -1, "Vote for the next map")
- }
- cmdVoteNextmap()
- }
- }
- public cmdVoteNextmap()
- {
- new
- winlimit,
- maxrounds
- winlimit = get_cvar_num(NUM_WINLIMIT)
- maxrounds = get_cvar_num(NUM_MAXROUNDS)
- new
- mkeys = ((1<<g_votemaps) + 1),
- menu[HudLen],
- a
- new pos = format(menu, HudLen -1, " \r%s:^n^n", MenuName)
- new dmax = (g_mapNums > g_votemaps) ? g_votemaps : g_mapNums
- new unki = 0
- for(g_mapVoteNum = 0; g_mapVoteNum < dmax; g_mapVoteNum++)
- {
- a = random_num(0, g_mapNums -1)
- while(isInMenu(a))
- {
- if(++a >= g_mapNums)
- {
- a = 0
- }
- }
- g_nextName[g_mapVoteNum] = a
- pos += format(menu[pos], HudLen -1, " \y%d.\w %a^n", g_mapVoteNum + 1, ArrayGetStringHandle(g_mapName, a))
- g_saveids[unki] = a
- unki++
- mkeys |= (1<<g_mapVoteNum)
- g_voteCount[g_mapVoteNum] = 0
- }
- g_voteCount[g_votemaps] = 0
- g_voteCount[g_votemaps + 1] = 0
- new language = get_cvar_num(NUM_SM_LANG)
- if(((winlimit + maxrounds) == 0) && (get_cvar_float(FLOAT_TIMELIMIT) < get_cvar_float("amx_extendmap_max")))
- {
- switch(language)
- {
- case 0: pos += format(menu[pos], HudLen -1, " \y%d.\w %s \y[продлить]", g_votemaps + 1, g_currentMap)
- case 1: pos += format(menu[pos], HudLen -1, " \y%d.\w %s \y[prolong]", g_votemaps + 1, g_currentMap)
- }
- mkeys |= (1<<g_votemaps)
- }
- set_task(get_cvar_float(NUM_SM_TIME), "checkVotes", TASK_PLUGIN_ID)
- new players[32], pid
- get_players(players, PlayersNum)
- for(new i=0;i<PlayersNum;i++)
- {
- pid = players[i]
- hasBlind[pid] = true
- show_menu(pid, mkeys, menu, get_cvar_num(NUM_SM_TIME), "superMapChooserMenu")
- switch(language)
- {
- case 0: colorChat(pid, CHATCOLOR_GREEN, "Голосование начато !")
- case 1: colorChat(pid, CHATCOLOR_GREEN, "Voting started")
- }
- client_cmd(pid, "spk gman/gman_choose1")
- message_begin(MSG_ONE, g_msgScreenFade, _, pid)
- write_short(1<<12) // Duration
- write_short(1<<9) // Hold time
- write_short(1<<0) // Fade type
- write_byte(0) // Red
- write_byte(0) // Green
- write_byte(0) // Blue
- write_byte(255) // Alpha
- message_end()
- set_task(1.0, "cmdFadeScreen", pid+TASK_SCREEN_ID, "", 0, "b")
- }
- voteStarted = true
- log_amx("Super Vote: Voting for the nextmap started")
- }
- public checkVotes()
- {
- new bolt = 0
- for(new a = 0; a < g_mapVoteNum; a++)
- {
- if(g_voteCount[bolt] < g_voteCount[a])
- {
- bolt = a
- }
- }
- //clear removed channel #2 :/
- set_hudmessage(_,_,_,_,_,_,_,_,_,_,2)
- show_hudmessage(0, " ")
- new players[32], num, pid
- get_players(players, num)
- if((g_voteCount[g_votemaps] > g_voteCount[bolt]) && (g_voteCount[g_votemaps] > g_voteCount[g_votemaps + 1]))
- {
- new Float:steptime = get_cvar_float("amx_extendmap_step")
- set_cvar_float(FLOAT_TIMELIMIT, get_cvar_float(FLOAT_TIMELIMIT) + steptime)
- set_hudmessage(255, 127, 0, -1.0, 0.25, 2, 0.1, 10.0, 0.05, 1.0, 1)
- for(new i=0;i<num;i++)
- {
- pid = players[i]
- switch(get_cvar_num(NUM_SM_LANG))
- {
- case 0:
- {
- colorChat(pid, CHATCOLOR_GREEN, "Голосование завершено.^x01 Эта карта продлена на %.0f мин", steptime)
- show_hudmessage(pid, "Эта карта продлена на %.0f мин", steptime)
- }
- case 1:
- {
- colorChat(pid, CHATCOLOR_GREEN, "Voting is finished. This map is prolonged on %.0f minutes", steptime)
- show_hudmessage(pid, "This map is prolonged on %.0f minutes", steptime)
- }
- }
- }
- log_amx("Super Vote: Voting for the nextmap finished. Map %s will be extended to next %.0f minutes", g_currentMap, steptime)
- hasExtend = true
- cmdReloadTimer()
- return
- }
- new smap[32]
- if(g_voteCount[bolt] && (g_voteCount[g_votemaps + 1] <= g_voteCount[bolt]))
- {
- ArrayGetString(g_mapName, g_nextName[bolt], smap, sizeof smap -1)
- set_cvar_string(STRING_NEXTMAP, smap)
- }
- get_cvar_string(STRING_NEXTMAP, smap, sizeof smap -1)
- set_hudmessage(255, 127, 0, -1.0, 0.42, 2, 0.1, 10.0, 0.05, 1.0, 1)
- for(new i=0;i<num;i++)
- {
- pid = players[i]
- remove_task(pid+TASK_RESULT_ID)
- switch(get_cvar_num(NUM_SM_LANG))
- {
- case 0:
- {
- colorChat(pid, CHATCOLOR_GREEN, "Голосование завершено.^x01 Следующая карта:^x04 %s", smap)
- show_hudmessage(pid, "Следующая карта %s", smap)
- }
- case 1:
- {
- colorChat(pid, CHATCOLOR_GREEN, "Voting is finished.^x01 Nextmap:^x04 %s", smap)
- show_hudmessage(pid, "Nextmap will be %s", smap)
- }
- }
- }
- log_amx("Super Vote: Voting for the nextmap finished. The nextmap will be %s", smap)
- }
- public countVote(id, key)
- {
- if(!voteStarted && forceBlock)
- return PLUGIN_HANDLED
- if(get_cvar_float("amx_vote_answers"))
- {
- new name[32]
- get_user_name(id, name, sizeof name -1)
- if(key == g_votemaps)
- {
- switch(get_cvar_num(NUM_SM_LANG))
- {
- case 0: colorChat(0, CHATCOLOR_GREEN, "%s^x01 проголосовал за^x04 продление карты", name)
- case 1: colorChat(0, CHATCOLOR_GREEN, "%s^x01 chose^x04 map extending", name)
- }
- }
- else if(key < g_votemaps)
- {
- new map[32]
- ArrayGetString(g_mapName, g_nextName[key], map, sizeof map -1)
- switch(get_cvar_num(NUM_SM_LANG))
- {
- case 0: colorChat(0, CHATCOLOR_GREEN, "%s^x01 проголосовал за^x04 %s", name, map)
- case 1: colorChat(0, CHATCOLOR_GREEN, "%s^x01 chose^x04 %s", name, map)
- }
- }
- cmdShowResults(id+TASK_RESULT_ID)
- set_task(0.8, "cmdShowResults", id+TASK_RESULT_ID, "", 0, "b")
- }
- client_cmd(id, "spk UI/buttonclickrelease")
- g_voteCount[key]++
- PlayersVoted++
- return PLUGIN_HANDLED
- }
- public cmdShowResults(pid)
- {
- static id
- id = pid-TASK_RESULT_ID
- if(is_user_connected(id))
- {
- static i, len, language, message[HudLen]
- language = get_cvar_num(NUM_SM_LANG)
- switch(language)
- {
- case 0: len = format(message, sizeof message -1, "Результаты голосования^n^n")
- case 1: len = format(message, sizeof message -1, "Results of voting^n^n")
- }
- for(i=0;i<g_votemaps;i++)
- {
- len += format(message[len], HudLen -1, "[%d] | %a^n", g_voteCount[i], ArrayGetStringHandle(g_mapName, g_saveids[i]))
- }
- switch(language)
- {
- case 0:
- {
- len += format(message[len], HudLen -1, "[%d] | %s [продливаемая]^n^n", g_voteCount[i], g_currentMap)
- len += format(message[len], HudLen -1, "Всего проголосовало: %d из %d", PlayersVoted, PlayersNum)
- }
- case 1:
- {
- len += format(message[len], HudLen -1, "[%d] | %s [prolonged]^n^n", g_voteCount[i], g_currentMap)
- len += format(message[len], HudLen -1, "In total has voted: %d from %d", PlayersVoted, PlayersNum)
- }
- }
- set_hudmessage(g_result_red, g_result_green, g_result_blue, 0.36, 0.3, 0, 1.0, 4.0, 0.1, 0.2, 2)
- show_hudmessage(id, "%s", message)
- }
- }
- public EVENT_ScreenFade(id)
- {
- if(hasBlind[id])
- {
- set_task(0.6, "cmdFadeScreen", id+TASK_SCREEN_ID)
- }
- }
- public cmdFadeScreen(pid)
- {
- new id = pid-TASK_SCREEN_ID
- if(is_user_connected(id))
- {
- message_begin(MSG_ONE, g_msgScreenFade, _, id)
- write_short(1<<0) // Duration
- write_short(1<<0) // Hold time
- write_short(1<<2) // Fade type
- write_byte(0) // Red
- write_byte(0) // Green
- write_byte(0) // Blue
- write_byte(255) // Alpha
- message_end()
- }
- }
- public plugin_end()
- {
- new current_map[32]
- set_cvar_num("sv_maxspeed", g_maxspeed)
- get_mapname(current_map, sizeof current_map -1)
- set_localinfo("lastMap", current_map)
- }
- stock bool:ValidMap(mapname[])
- {
- if(is_map_valid(mapname))
- {
- return true
- }
- new len = strlen(mapname) -4
- if(len < 0)
- {
- return false
- }
- if(equali(mapname[len], ".bsp"))
- {
- mapname[len] = '^0'
- if(is_map_valid(mapname))
- {
- return true
- }
- }
- return false
- }
- loadSettings(filename[])
- {
- if(!file_exists(filename))
- return 0
- new
- currentMap[32],
- szText[32],
- buff[256]
- get_mapname(currentMap, sizeof currentMap -1)
- new fp = fopen(filename, "r")
- while(!feof(fp))
- {
- buff[0] = '^0'
- fgets(fp, buff, sizeof buff -1)
- parse(buff, szText, sizeof szText -1)
- if((szText[0] != ';') && ValidMap(szText) && !equali(szText, g_lastMap) && !equali(szText, currentMap))
- {
- ArrayPushString(g_mapName, szText)
- g_mapNums++
- }
- }
- fclose(fp)
- return g_mapNums
- }
- bool:isInMenu(id)
- {
- for(new a = 0; a < g_mapVoteNum; a++)
- {
- if(id == g_nextName[a])
- {
- return true
- }
- }
- return false
- }
- colorChat(id, ChatColor:color, const msg[], {Float,Sql,Result,_}:...)
- {
- new team, index, MSG_Type
- new bool:teamChanged = false
- static message[192]
- switch(color)
- {
- case CHATCOLOR_NORMAL: // Normal
- {
- message[0] = 0x01;
- }
- case CHATCOLOR_GREEN: // Green
- {
- message[0] = 0x04;
- }
- default: // Grey, Red, Blue
- {
- message[0] = 0x03;
- }
- }
- vformat(message[1], 190, msg, 4);
- if(id == 0)
- {
- index = findAnyPlayer();
- MSG_Type = MSG_ALL;
- }
- else
- {
- index = id;
- MSG_Type = MSG_ONE;
- }
- if(index != 0)
- {
- team = get_user_team(index);
- if(color == CHATCOLOR_RED && team != 1)
- {
- messageTeamInfo(index, MSG_Type, g_TeamName[1])
- teamChanged = true
- }
- else
- if(color == CHATCOLOR_BLUE && team != 2)
- {
- messageTeamInfo(index, MSG_Type, g_TeamName[2])
- teamChanged = true
- }
- else
- if(color == CHATCOLOR_GREY && team != 0)
- {
- messageTeamInfo(index, MSG_Type, g_TeamName[0])
- teamChanged = true
- }
- messageSayText(index, MSG_Type, message);
- if(teamChanged)
- {
- messageTeamInfo(index, MSG_Type, g_TeamName[team])
- }
- }
- }
- messageSayText(id, type, message[])
- {
- message_begin(type, g_msgSayText, _, id)
- write_byte(id)
- write_string(message)
- message_end()
- }
- messageTeamInfo(id, type, team[])
- {
- message_begin(type, g_msgTeamInfo, _, id)
- write_byte(id)
- write_string(team)
- message_end()
- }
- findAnyPlayer()
- {
- static players[32], inum, pid
- get_players(players, inum, "ch")
- for (new a = 0; a < inum; a++)
- {
- pid = players[a]
- if(is_user_connected(pid))
- return pid
- }
- return 0
- }