Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Повторения в голосовании Super Mapchooser

Статус пользователя danya236
сообщение 23.6.2012, 13:39
Сообщение #1
Стаж: 13 лет

Сообщений: 1
Благодарностей: 1
Полезность: 0

Как убрать повторения в голосовании, к примеру в 1 голосовании за следующую карту может быть 3 или 2 даста (de_dust2)
Super Mapchooser.sma
Код
#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",      "40.0")//Максимальное количество минут. Когда несколько раз продлевается карта - это значение будет максимальным в timelimit'е
        register_cvar("amx_extendmap_step",     "15.0")//На сколько минут продлевать карту, если проголосовали за ее продление.
       
        register_cvar(NUM_SM_LANG,              "0")//0-Русский, 1-English
        register_cvar(NUM_SM_TIME,              "15")//Сколько времени в секундах должно идти голосование
        register_cvar(NUM_SM_VOTEMAPS,          "8")//Сколько карт выводить на голосование не считая карты, которую продливают в голосовании
       
        // Каким цветом показывать результаты голосования. Формат RGB
        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] = false
               
                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:
                                {
                                        //Голосование завершено. Эта карта продлена на %.0f мин
                                        colorChat(pid, CHATCOLOR_GREEN, "Голосование завершено. Эта карта продлена на %.0f минут", steptime)
                                       
                                        //Эта карта продлена на %.0f мин
                                        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:
                        {
                                //Голосование завершено.^x01 Следующая карта:^x04 %s
                                colorChat(pid, CHATCOLOR_GREEN, "Голосование завершено.^x01 Следующая карта:^x04 %s", smap)
                               
                                //Следующая карта %s
                                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))
                        {
                                //%s^x01 проголосовал за^x04 продление карты
                                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))
                        {
                                //%s проголосовал за %s
                                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)
                                //Всего проголосовало: %d из %d
                                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
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
  Тема закрытаНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: