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

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

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

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

> Информационная доска

Данный раздел предназначен для обсуждения, а также решения технических проблем связанных с серверной частью. Обсуждения касательно игровых клиентов ведутся здесь.

1. Во время создания новой темы аккуратно оформляйте её, не допускайте грамматических ошибок.
2. Описывая проблему старайтесь, как можно больше рассказать о ней, а так же о действиях с сервером после которых она возникла, по возможности подкрепите информацию логами.
3. Если вопрос касается проблемы в работе сервера, то обязательно прикрепляйте список плагинов (введите в консоли сервера: meta list и amxx plugins), настройки server.cfg, логи. Так же указывайте операционную систему, версию HLDS (введите к консоли сервера: version) и где хостится сервер.

Длинную информацию скрывайте под спойлер.

Помогите изменить файл

gosha777
сообщение 20.7.2014, 13:01
Сообщение #1
Стаж: 12 лет

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

Всем привет!Помогите сделать так чтобы карты брались из mapcycle.txt
Сам код
Код
]#include <amxmodx>
#include <fakemeta> // Закомментируйте или удалите, если не хотите использовать модуль fakemeta. [Для АМХХ 1.8.3 лучше оставить как есть]

#if (AMXX_VERSION_NUM < 183) || defined NO_NATIVE_COLORCHAT
    #include <colorchat>
#else
    #define DontChange print_team_default
    #define Blue print_team_blue
    #define Red print_team_red
    #define Grey print_team_grey
#endif

#define PLUGIN "Map Manager"
#define AUTHOR "Mistrick | neygomon"

#pragma semicolon 1

#define SELECT_MAPS 6            // Число карт в голосовании. Максимум 8
#define VOTE_TIME 12            // Время голосования
#define NOMINATE_MAX 3            // Максимальное число номинаций
#define NOMINATE_PLAYER_MAX 1        // Максимальное число карт для номиначии одним игроком
#define MAP_BLOCK 10             // Количество последниъх сыгранных карт, которые не будут предлагаться для голосования
#define HUD_RESULT_COLOR 0, 55, 255     // Цвет результатов голосования
// #define MAPSMENU             // Включить или выключить say /maps (По дефолту выключен)
// #define DEBUG             // Сообщения для отладки. Файл mapmanager_debug.log
// #define CSDM             // Включать на серверах с бесконечными раундами... CSDM/GG/Soccer Jam
// #define MINIMAPS             // Включить поддержку второго списка карт (По дефолту выключен)
                    // [Если включаете, то создайте minimaps.ini в amxmodx/configs] [аля night mode]
#if defined MINIMAPS
    #define MINIMAPS_START 1     // Время начала подгрузки карт minimaps [аля night mode]
    #define MINIMAPS_END 11     // Время окончания подгрузки карт minimaps [аля night mode]
#endif
#if defined CSDM
    #define VERSION "0.5.7 CSDM"
#else
    #define VERSION "0.5.7 RND"
#endif    

#define TASK_TIMER 978462
#define TASK_VOTEMENU 978162

enum _:BLOCKED_DATA { MAP[33], COUNT }    
enum _:NOMINATE_DATA { MAP[33], PLAYER, ID }

new const FILE_BLOCKEDMAPS[] = "addons/amxmodx/data/blockedmaps.ini";

new const PREFIX[] = "^1[^4MapManager^1]";
    
new Array:g_iMapsArray, Array:g_iNominateArray;

new g_pLoadMapsType, g_pShowSelects, g_pShowResultAfterVote, g_pShowResultType;
new g_pTimeLimit, g_pExendedMax;
new g_pExendedTime, g_pRockEnable, g_pRockPercent, g_pRockDelay, g_pRockShow, g_pNextMap, g_pFriendlyFire, g_pBlockPlayers, g_pAdminVoteWeight, g_pAdminRTVWeight;

new bool:g_bBeInVote, bool:g_bVoteFinished, bool:g_bRockVote, bool:g_bHasVoted[33], bool:g_bRockVoted[33];

new g_iExtendedMax, g_iStartPlugin, g_iLoadMaps;
new g_iInMenu[SELECT_MAPS], g_iVoteItem[SELECT_MAPS + 1], g_iTotal, g_iVoteTime, g_iRockVote;
new g_iNominatedMaps[33];
#if defined MAPSMENU
    new g_iPage[33];
#endif

#if !defined CSDM
    new pcv_mp_buytime, g_buytime, pcv_mp_roundtime, Float:flt_roundtime, g_pShowHUDLastRound;
    new bool:g_buytimeRepare = false;
#endif    
    
new g_msgScreenFade, fade, pcv_mp_freezetime, g_freezetime, g_timelimit;
new bool:g_freezetimeRepare = false, bool:g_timelimitRepare = false, bool:g_Work = false;

new g_szInMenuMapName[SELECT_MAPS][33], g_BlockedMaps[MAP_BLOCK][BLOCKED_DATA], g_szCurrentMap[32];

new const g_szPrefixes[][] = {"cs_", "as_", "de_"};
new const g_szSound[][] = { "",    "fvox/one",    "fvox/two",    "fvox/three" };

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);
    
    g_pLoadMapsType = register_cvar("mm_loadmapstype", "1");//0 - load all maps from maps folder, 1 - load maps from file
    g_pShowSelects = register_cvar("mm_showselects", "0");//0 - disable, 1 - all, 2 - self
    g_pShowResultAfterVote = register_cvar("mm_show_result_aftervote", "1");//0 - disable, 1 - enable
    g_pShowResultType = register_cvar("mm_showresulttype", "0");//0 - menu, 1 - hud
    g_pBlockPlayers = register_cvar("mm_block_players", "0"); // 1 - yes, 0 - off
    g_pExendedTime = register_cvar("mm_extendedtime", "15"); //minutes
    g_pExendedMax = register_cvar("mm_extendedmap_max", "3"); // количество продлений
    g_pAdminVoteWeight = register_cvar("mm_adminvote_weight", "2"); // вес голоса админа при голосовании [флаг ADMIN_MENU]
    g_pAdminRTVWeight = register_cvar("mm_adminrtv_weight", "2"); // вес голоса админа в RTV [флаг ADMIN_MENU]
    #if !defined CSDM
        g_pShowHUDLastRound = register_cvar("mm_show_lastround", "1"); // показывать HUD последнего раунда или нет
    #endif    
    
    g_pNextMap = register_cvar("amx_nextmap", "");
    
    g_pRockEnable = register_cvar("mm_rtv_enable", "1");//0 - disable, 1 - enable
    g_pRockPercent = register_cvar("mm_rtv_percent", "60");
    g_pRockDelay = register_cvar("mm_rtv_delay", "15");//minutes
    g_pRockShow = register_cvar("mm_rtv_show", "0");//0 - all, 1 - self

    register_concmd("amx_rtv", "Command_StartVote", ADMIN_MAP);
    register_clcmd("say ff", "Command_FriendlyFire");
#if defined MAPSMENU    
    register_clcmd("say maps", "Command_MapsList");
    register_clcmd("say /maps", "Command_MapsList");
#endif    
    register_clcmd("say rtv", "Command_RTV");
    register_clcmd("say /rtv", "Command_RTV");
    register_clcmd("say nextmap", "Command_Nextmap");
    register_clcmd("say timeleft", "Command_Timeleft");
    register_clcmd("say thetime", "Command_TheTime");
    register_clcmd("say currentmap", "Command_CurrentMap");
    register_clcmd("say", "Command_Say");
    register_clcmd("say_team", "Command_Say");
    #if !defined CSDM
        register_event("HLTV", "Event_RoundStart", "a", "1=0", "2=0");
    #endif    
    register_event("TextMsg", "Event_GameRestart", "a", "2=#Game_Commencing", "2=#Game_will_restart_in");
    
    register_cvar ("nmm_version", VERSION, FCVAR_SERVER | FCVAR_SPONLY);
    
    register_menucmd(register_menuid("Vote_Menu"), 1023, "VoteMenu_Handler");
#if defined MAPSMENU    
    register_menucmd(register_menuid("MapsList_Menu"), 1023, "MapsListMenu_Handler");
#endif    
    g_iNominateArray = ArrayCreate(NOMINATE_DATA);
    g_iStartPlugin = get_systime();
    
    g_msgScreenFade = get_user_msgid ("ScreenFade");
    pcv_mp_freezetime = get_cvar_pointer ("mp_freezetime");
    #if !defined CSDM
        pcv_mp_buytime = get_cvar_pointer ("mp_buytime");
        pcv_mp_roundtime = get_cvar_pointer ("mp_roundtime");
    #endif    
    g_pTimeLimit = get_cvar_pointer("mp_timelimit");
    g_pFriendlyFire = get_cvar_pointer("mp_friendlyfire");
        
    Load_BlockedMaps();
    Load_MapList();
    
    set_task(15.0, "CheckTime", .flags = "b");
    
    // set_cvar_string("mapcyclefile", FILE_MAPS);
#if defined DEBUG
    log_to_file("mapmanager_debug.log", "PLUGIN_INIT: %s", g_szCurrentMap);
#endif    
}

public plugin_cfg()
{    
    #if !defined CSDM
        flt_roundtime = get_pcvar_float(pcv_mp_roundtime);
    #endif    
    set_cvar_float("sv_restart", 1.0);
#if defined DEBUG
    log_to_file("mapmanager_debug.log", "[plugin_cfg] g_pTimeLimit: %d", get_pcvar_num(g_pTimeLimit));
#endif    
}
    
public plugin_end()
{
    if(g_freezetimeRepare)
        set_pcvar_num(pcv_mp_freezetime, g_freezetime);
    #if !defined CSDM    
        if(g_buytimeRepare)
            set_pcvar_num(pcv_mp_buytime, g_buytime);
    #endif    
    if(g_timelimitRepare)
        set_pcvar_num(g_pTimeLimit, g_timelimit);
#if defined DEBUG    
    log_to_file("mapmanager_debug.log", "[plugin_end] g_timelimitRepare: %d | g_pTimeLimit: %d", g_timelimitRepare, get_pcvar_num(g_pTimeLimit));
#endif        
    new const TEMP_FILE[] = "addons/amxmodx/data/temp.ini";
    new iTemp = fopen(TEMP_FILE, "wt");
    
    for(new i = 0; i < MAP_BLOCK; i++)
    {
        if(g_BlockedMaps[i][COUNT])
            fprintf(iTemp, "^"%s^" ^"%d^"^n", g_BlockedMaps[i][MAP], g_BlockedMaps[i][COUNT]);
    }    
    
    fprintf(iTemp, "^"%s^" ^"%d^"^n", g_szCurrentMap, MAP_BLOCK);    
    fclose(iTemp);
    
    delete_file(FILE_BLOCKEDMAPS);
#if defined DEBUG    
    new iRename = rename_file(TEMP_FILE, FILE_BLOCKEDMAPS, 1);
    log_to_file("mapmanager_debug.log", "PLUGIN_END: File Renamed? %d", iRename);
    log_to_file("mapmanager_debug.log", "- - - - - - - - - - - - - - -");
#else
    rename_file(TEMP_FILE, FILE_BLOCKEDMAPS, 1);
#endif    
}

public client_disconnect(id)
{
    if(task_exists(id + TASK_VOTEMENU)) remove_task(id + TASK_VOTEMENU);
    if(g_bRockVoted[id])
    {
        g_bRockVoted[id] = false;
        if(get_user_flags(id) & ADMIN_MENU && get_pcvar_num(g_pAdminRTVWeight) != 0)
            g_iRockVote -= get_pcvar_num(g_pAdminRTVWeight);
        else
            g_iRockVote--;
    }
    if(g_iNominatedMaps[id])
        clear_nominated_maps(id);
}

//***** Commands *****//
public Command_StartVote(id, flag)
{
    if(~get_user_flags(id) & flag) return PLUGIN_HANDLED;
    
    if(g_Work)
    {
        if(id == 0)
            console_print(0, "[MapManager] VoteMap has already started");
        else
            console_print(id, "[MapManager] Голосование УЖЕ запущено! Ожидайте.");
    }
    else
    {
        if(id == 0)
            console_print(0, "[MapManager] VoteMap started");
        else
            console_print(id, "[MapManager] Голосование за досрочную смену карты запущено");
        #if !defined CSDM    
            g_Work = true;
        #else    
            StartVote(0);
        #endif
        client_print_color(0, DontChange, "%s^1 Администратор запустил досрочное голосование!", PREFIX);
        
        new name[32];
        get_user_name(id, name, charsmax(name));
        log_amx("Администратор %s запустил досрочное голосование", name);
        #if !defined CSDM
            if(get_pcvar_num(g_pShowHUDLastRound))
                hud_lastround();
        #endif    
    }        
    

    return PLUGIN_HANDLED;
}

public Command_FriendlyFire(id)
    client_print_color(0, DontChange, "%s^1 На сервере^3 %s^1 огонь по своим.", PREFIX, get_pcvar_num(g_pFriendlyFire) ? "разрешен" : "запрещен");
    
public Command_TheTime(id)
{
    new time[64];
    get_time ("%Y/%m/%d - %H:%M:%S", time, sizeof (time) - 1);
    client_print_color(id, DontChange, "%s^1 Текущее время: ^3 %s^1", PREFIX, time);
}

#if defined MAPSMENU
public Command_MapsList(id)
    Show_MapsListMenu(id, g_iPage[id] = 0);
    
public Show_MapsListMenu(id, iPage)
{
#if defined _fakemeta_included
    set_pdata_int( id, 205, 0 );
#endif    
    if(iPage < 0) return PLUGIN_HANDLED;
    
    new iMax = ArraySize(g_iMapsArray);
    new i = min(iPage * 8, iMax);
    new iStart = i - (i % 8);
    new iEnd = min(iStart + 8, iMax);
    
    iPage = iStart / 8;
    g_iPage[id] = iPage;
    
    new szMenu[512], iLen = 0, iLen_Max = charsmax(szMenu), szMapName[32];
    
    iLen = formatex(szMenu, iLen_Max, "\yСписок карт \w[%d/%d]:^n", iPage + 1, ((iMax - 1) / 8) + 1);
    
    new Keys, Item, iBlock, iNominator;
    
    for (i = iStart; i < iEnd; i++)
    {
        ArrayGetString(g_iMapsArray, i, szMapName, charsmax(szMapName));
        iBlock = get_blocked_map_count(szMapName);
        iNominator = is_map_nominated(szMapName);
        if(iBlock)
            iLen += formatex(szMenu[iLen], iLen_Max - iLen, "^n\r%d.\d %s[\r%d\d]", ++Item, szMapName, iBlock);
        else if(iNominator)
        {
            if(iNominator == id)
            {
                Keys |= (1 << Item);
                iLen += formatex(szMenu[iLen], iLen_Max - iLen, "^n\r%d.\w %s[\y*\w]", ++Item, szMapName);
                
            }
            else
                iLen += formatex(szMenu[iLen], iLen_Max - iLen, "^n\r%d.\d %s[\y*\d]", ++Item, szMapName);
        }
        else
        {
            Keys |= (1 << Item);
            iLen += formatex(szMenu[iLen], iLen_Max - iLen, "^n\r%d.\w %s", ++Item, szMapName);
        }
    }
    while(Item <= 8)
    {
        Item++;
        iLen += formatex(szMenu[iLen], iLen_Max - iLen, "^n");
    }
    if (iEnd < iMax)
    {
        Keys |= (1 << 8)|(1 << 9);        
        formatex(szMenu[iLen], iLen_Max - iLen, "^n\r9.\w %Вперед^n\r0.\w %s", iPage ? "Назад" : "Выход");
    }
    else
    {
        Keys |= (1 << 9);
        formatex(szMenu[iLen], iLen_Max - iLen, "^n^n\r0.\w %s", iPage ? "Назад" : "Выход");
    }
    show_menu(id, Keys, szMenu, -1, "MapsList_Menu");
    return PLUGIN_HANDLED;
}

public MapsListMenu_Handler(id, key)
{
    switch (key)
    {
        case 8: Show_MapsListMenu(id, ++g_iPage[id]);
        case 9: Show_MapsListMenu(id, --g_iPage[id]);
        default:
        {            
            new szMapName[33]; ArrayGetString(g_iMapsArray, key + g_iPage[id] * 8, szMapName, charsmax(szMapName));
            if(g_iNominatedMaps[id] && is_map_nominated(szMapName))
                remove_nominated_map(id, szMapName);
            else
                NominateMap(id, szMapName);
        }
    }
    return PLUGIN_HANDLED;
}
#endif

public Command_RTV(id)
{
    if(g_bVoteFinished || g_bBeInVote) return PLUGIN_HANDLED;
    
    if(!get_pcvar_num(g_pRockEnable)) return PLUGIN_CONTINUE;
    
    if(get_systime() - g_iStartPlugin < get_pcvar_num(g_pRockDelay) * 60)
    {
        new iMin = 1 + (get_pcvar_num(g_pRockDelay) * 60 - (get_systime() - g_iStartPlugin)) / 60;
        new szMin[16]; get_ending(iMin, "минут", "минута", "минуты", szMin, charsmax(szMin));
                
        client_print_color(id, DontChange, "%s^1 Вы не можете голосовать за досрочную смену карты. Осталось: %d %s.", PREFIX, iMin, szMin);
        return PLUGIN_HANDLED;
    }
    
    if(!g_bRockVoted[id])
    {
        g_bRockVoted[id] = true;
        if(get_user_flags(id) & ADMIN_MENU && get_pcvar_num(g_pAdminRTVWeight) != 0)
            g_iRockVote += get_pcvar_num(g_pAdminRTVWeight);
        else
            g_iRockVote++;
        
        new iVote = floatround(get_players_num() * get_pcvar_num(g_pRockPercent) / 100.0, floatround_ceil) - g_iRockVote;
        
        if(iVote > 0)
        {
            new szVote[16];    get_ending(iVote, "голосов", "голос", "голоса", szVote, charsmax(szVote));
            
            switch(get_pcvar_num(g_pRockShow))
            {
                case 0:
                {
                    new szName[33];
                    get_user_name(id, szName, charsmax(szName));
                    client_print_color(0, DontChange, "%s^3 %s^1 проголосовал за смену карты. Осталось: %d %s.", PREFIX, szName, iVote, szVote);
#if defined DEBUG
                    log_to_file("mapmanager_debug.log", "%s проголосовал за смену карты. Осталось: %d %s.", szName, iVote, szVote);
#else
                    log_amx("%s проголосовал за смену карты. Осталось: %d %s.", szName, iVote, szVote);
#endif                    
                }
                case 1: client_print_color(id, DontChange, "%s^1 Ваш голос учтен. Осталось: %d %s.", PREFIX, iVote, szVote);
            }
        }
        else
        {
            #if !defined CSDM    
            g_bRockVote = true;
            g_Work = true;
            client_print_color(0, DontChange, "%s^1 Голосование за смену карты будет в новом раунде.", PREFIX);
#if defined DEBUG
            log_to_file("mapmanager_debug.log", "Голосование за смену карты будет в новом раунде.");
#endif
            #else    
            StartVote(0);
            #endif
                
        }
    }
    else
    {
        new iVote = floatround(get_players_num() * get_pcvar_num(g_pRockPercent) / 100.0, floatround_ceil) - g_iRockVote;
        new szVote[16];    get_ending(iVote, "голосов", "голос", "голоса", szVote, charsmax(szVote));
        client_print_color(id, DontChange, "%s^1 Вы уже голосовали. Осталось: %d %s.", PREFIX, iVote, szVote);
    }
    
    return PLUGIN_HANDLED;
}

public Command_Nextmap(id)
{
    new szMap[33]; get_pcvar_string(g_pNextMap, szMap, charsmax(szMap));
    client_print_color(0, Blue, "%s^1 Следующая карта: ^3%s^1.", PREFIX, szMap);
}

public Command_Timeleft(id)
{
    new a = get_timeleft();
    if(a == 0)
        client_print_color(0, DontChange, "%s^1 Карта не ограничена по времени.", PREFIX);
    else    
        client_print_color(0, Blue, "%s^1 До конца карты осталось:^3 %d:%02d", PREFIX, (a / 60), (a % 60));    
}

public Command_CurrentMap(id)
    client_print_color(0, Blue, "%s^1 Текущая карта:^3 %s^1.", PREFIX, g_szCurrentMap);
    
public Command_Say(id)
{
    if(g_bVoteFinished || g_bBeInVote) return;
    
    new szText[33];    read_args(szText, charsmax(szText));
    remove_quotes(szText);
    trim(szText);
    if(in_maps_array(szText))
    {
        if(g_iNominatedMaps[id] && is_map_nominated(szText))
            remove_nominated_map(id, szText);
        else
            NominateMap(id, szText);
    }
    else
    {
        for(new i = 0; i < sizeof(g_szPrefixes); i++)
        {
            static szFormat[33];
            formatex(szFormat, charsmax(szFormat), "%s%s", g_szPrefixes[i], szText);
            if(in_maps_array(szFormat))
            {
                if(g_iNominatedMaps[id] && is_map_nominated(szFormat))
                    remove_nominated_map(id, szFormat);
                else
                    NominateMap(id, szFormat);
                break;
            }
        }
    }
}

NominateMap(id, map[33])
{    
    if(g_iNominatedMaps[id] == NOMINATE_PLAYER_MAX)
    {
        client_print_color(id, DontChange, "%s^1 Вы не можете больше номинировать карты.", PREFIX);
        return PLUGIN_HANDLED;
    }
    if(get_blocked_map_count(map))
    {
        client_print_color(id, DontChange, "%s^1 Эта карта недоступна для номинации.", PREFIX);
        return PLUGIN_HANDLED;
    }
    if(is_map_nominated(map))
    {
        client_print_color(id, DontChange, "%s^1 Эта карта уже номинирована.", PREFIX);
        return PLUGIN_HANDLED;
    }
    
    new szMap[33], i;
    for(i = 0; i < g_iLoadMaps; i++)
    {
        ArrayGetString(g_iMapsArray, i, szMap, charsmax(szMap));
        if(equal(map, szMap)) break;
    }
        
    new Data[NOMINATE_DATA];
    Data[MAP] = map;
    Data[PLAYER] = id;
    Data[ID] = i;
    ArrayPushArray(g_iNominateArray, Data);
    
    g_iNominatedMaps[id]++;
    new szName[33];    get_user_name(id, szName, charsmax(szName));
    client_print_color(0, id, "%s^3 %s^1 номинировал на голосование^3 %s^1.", PREFIX, szName, map);

    return PLUGIN_HANDLED;
}

//***** Events *****//
#if !defined CSDM
public Event_RoundStart()
{
    if(g_Work)
        StartVote(0);
}
#endif
public Event_GameRestart()
    g_iStartPlugin = get_systime();    
    
//*****  *****//
Load_BlockedMaps()
{
    get_mapname(g_szCurrentMap, charsmax(g_szCurrentMap));
    
    if(!file_exists(FILE_BLOCKEDMAPS) || !MAP_BLOCK) return PLUGIN_CONTINUE;
    
    new const TEMP_FILE[] = "addons/amxmodx/data/temp.ini";
    
    new iFile = fopen(FILE_BLOCKEDMAPS, "rt");
    new iTemp = fopen(TEMP_FILE, "wt");
    
    new szBuffer[128], szMap[33], szCount[8], iCount, i = 0;
    
    while(!feof(iFile))
    {
        fgets(iFile, szBuffer, charsmax(szBuffer));
        parse(szBuffer, szMap, charsmax(szMap), szCount, charsmax(szCount));
        
        if(get_blocked_map_count(szMap) || !is_map_valid(szMap) || equal(szMap, g_szCurrentMap)) continue;
        
        iCount = str_to_num(szCount) - 1;
        
        if(!iCount) continue;
        
        if(iCount > MAP_BLOCK)
        {
            fprintf(iTemp, "^"%s^" ^"%d^"^n", szMap, MAP_BLOCK);
            iCount = MAP_BLOCK;
        }
        else
            fprintf(iTemp, "^"%s^" ^"%d^"^n", szMap, iCount);
        
        formatex(g_BlockedMaps[i][MAP], charsmax(g_BlockedMaps[][MAP]), szMap);
        g_BlockedMaps[i++][COUNT] = iCount;
        
        if(i >= MAP_BLOCK) break;
    }
    
    fclose(iFile);
    fclose(iTemp);
    
    delete_file(FILE_BLOCKEDMAPS);
#if defined DEBUG    
    new iRename = rename_file(TEMP_FILE, FILE_BLOCKEDMAPS, 1);
    log_to_file("mapmanager_debug.log", "LOAD_BLOCKEDMAPS: File Renamed? %d; Blocked ? %d", iRename, i);
#else
    rename_file(TEMP_FILE, FILE_BLOCKEDMAPS, 1);
#endif    
    
    return PLUGIN_CONTINUE;
}

Load_MapList()
{
#if defined MINIMAPS    
    new Hours[3];
    get_time("%H", Hours, 2);
    new iHours = str_to_num(Hours);
    
    new filemaps[64];
    if(MINIMAPS_START <= iHours < MINIMAPS_END)
        formatex (filemaps, sizeof(filemaps) - 1, "addons/amxmodx/configs/minimaps.ini");
    else    
        formatex (filemaps, sizeof(filemaps) - 1, "addons/amxmodx/configs/maps.ini");
#else
    new filemaps[64];
    formatex (filemaps, sizeof(filemaps) - 1, "addons/amxmodx/configs/maps.ini");
#endif    
    g_iLoadMaps = 0;
    g_iMapsArray = ArrayCreate(32);
    
    if(file_exists(filemaps) && get_pcvar_num(g_pLoadMapsType))
    {        
        new szMapName[33];
        
        new f = fopen(filemaps, "rt");
        
        while(!feof(f))
        {
            fgets(f, szMapName, charsmax(szMapName));
            trim(szMapName);
            remove_quotes(szMapName);
            
            if(!szMapName[0] || szMapName[0] == ';' || szMapName[0] == '/' && szMapName[1] == '/'
                || !valid_map(szMapName) || in_maps_array(szMapName) || equali(szMapName, g_szCurrentMap))
                continue;
            
            g_iLoadMaps++;
            
            ArrayPushString(g_iMapsArray, szMapName);
        }
        
        fclose(f);
    }
    else
    {
        new iDir, iLen, szFileName[64];
        new DirName[] = "maps";
        iDir = open_dir(DirName, szFileName, charsmax(szFileName));
        
        if(iDir)
        {
            while(next_file(iDir, szFileName, charsmax(szFileName)))
            {
                iLen = strlen(szFileName) - 4;
                
                if(iLen < 0) continue;
                
                if(equali(szFileName[iLen], ".bsp") && !equali(szFileName, g_szCurrentMap))
                {
                    szFileName[iLen] = '^0';
                    
                    g_iLoadMaps++;
                    
                    ArrayPushString(g_iMapsArray, szFileName);
                }
            }
            close_dir(iDir);
        }
    }
    
    if(!g_iLoadMaps)
    {
        set_fail_state("LOAD_MAPS: Nothing loaded");
        return;
    }
    
    if(g_iLoadMaps - get_blocked_maps() <= 0)
        clear_blocked_maps();
    
    new szMap[33];    
    do
        ArrayGetString(g_iMapsArray, random_num(0, g_iLoadMaps - 1), szMap, charsmax(szMap));
    while(get_blocked_map_count(szMap));
    
    set_pcvar_string(g_pNextMap, szMap);
    
#if defined DEBUG
    log_to_file("mapmanager_debug.log", "LOAD_MAPS: Loaded Maps ? %d", g_iLoadMaps);
#endif
}

public CheckTime()
{    
    if(!g_iLoadMaps || g_bVoteFinished || g_bBeInVote || g_Work) return PLUGIN_CONTINUE;

    static iTimeLeft; iTimeLeft = get_timeleft();
    static iTimeLimit; iTimeLimit = get_pcvar_num(g_pTimeLimit);
    
    #if defined CSDM
    if(iTimeLeft < 60 && iTimeLimit != 0)
    {
        StartVote(0);
        if(!g_timelimitRepare)
        {
            g_timelimitRepare = true;
            g_timelimit = iTimeLimit;
        }
        set_pcvar_num(g_pTimeLimit, iTimeLimit + 1);
    }
    #else
    if(iTimeLeft < (flt_roundtime * 60) && iTimeLimit != 0)
    {
        g_Work = true;
        if(!g_timelimitRepare)
        {
            g_timelimitRepare = true;
            g_timelimit = iTimeLimit;
        }
        new iAddTime = floatround(flt_roundtime * 60 * 1.5 / 60.0, floatround_round);
        set_pcvar_num(g_pTimeLimit, iTimeLimit + iAddTime);
        if(get_pcvar_num(g_pShowHUDLastRound))
            hud_lastround();
    }
    #endif
    return PLUGIN_CONTINUE;
}

public StartVote(id)
{
    if(!g_iLoadMaps)
    {
        if(id) client_print_color(id, DontChange, "%s^1 В файле нет валидных карт.", PREFIX);
        return PLUGIN_HANDLED;
    }
    if(g_bBeInVote)
    {
        if(id) client_print_color(id, DontChange, "%s^1 Голосование запущено.", PREFIX);
        return PLUGIN_HANDLED;
    }
    
    g_bBeInVote = true;
    g_iTotal = 0;
    
    arrayset(g_iVoteItem, 0, SELECT_MAPS + 1);
    arrayset(g_iInMenu, -1, SELECT_MAPS);
    arrayset(g_bHasVoted, false, 33);    
    
    new Num,  NomInMenu = 0, Data[NOMINATE_DATA];
    new iMax = 8, Limits[2];
    
    Limits[0] = SELECT_MAPS;
    Limits[1] = g_iLoadMaps - get_blocked_maps();
    
    for(new i = 0; i < sizeof(Limits); i++)
        if(iMax > Limits[i]) iMax = Limits[i];
    
    new iNomMax, iNomNum = ArraySize(g_iNominateArray);
    iNomMax = iNomNum > NOMINATE_MAX ? NOMINATE_MAX : iNomNum;
    
    for(new i = 0; i < iMax; i++)
    {        
        if(NomInMenu < iNomMax)
        {
            Num = random_num(0, ArraySize(g_iNominateArray) - 1);
            
            ArrayGetArray(g_iNominateArray, Num, Data);
            
            formatex(g_szInMenuMapName[i], 32, Data[MAP]);
            g_iInMenu[i] = Data[ID];
            NomInMenu++;
            
            ArrayDeleteItem(g_iNominateArray, Num);
            g_iNominatedMaps[Data[PLAYER]]--;
        }
        else
        {
            do Num = random_num(0, g_iLoadMaps - 1);
            while(in_menu(Num) || is_blocked(Num));            
            
            g_iInMenu[i] = Num;
            ArrayGetString(g_iMapsArray, Num, g_szInMenuMapName[i], 32);
        }        
    }
#if defined DEBUG
            log_to_file("mapmanager_debug.log", "Голосование началось =)");
#endif    
    if(get_pcvar_num(g_pBlockPlayers))
    {
        fade = 1; cmd_screen_fade (fade);

        if ( !g_freezetimeRepare )
        {
            g_freezetime = get_pcvar_num (pcv_mp_freezetime);
            g_freezetimeRepare = true;
        }
        set_pcvar_num ( pcv_mp_freezetime, 15 );
        #if !defined CSDM
            if (!g_buytimeRepare)
            {
                g_buytime  = get_pcvar_num (pcv_mp_buytime);
                g_buytimeRepare = true;
            }    
            set_pcvar_float(pcv_mp_buytime, 0.5);
        #endif
    }        
    set_task(1.0, "Show_Timer", _, _, _, "a", 3);
    set_task(4.0, "Show_Menu");

#if defined DEBUG
    log_to_file("mapmanager_debug.log", "START_VOTE: RTV? %d", g_bRockVote ? 1 : 0);
#endif    
    
    return PLUGIN_HANDLED;
}

public Show_Timer()
{
    static iTimer; if(iTimer == 0) iTimer = 3;
    
    new szSec[16]; get_ending(iTimer, "секунд", "секунда", "секунды", szSec, charsmax(szSec));
    
    for(new i = 1; i <= 32; i++)
    {
        if(!is_user_connected(i)) continue;
        set_hudmessage(50, 255, 50, -1.0, is_user_alive(i) ? 0.9 : 0.3, 0, 0.0, 1.0, 0.0, 0.0, 1);
        show_hudmessage(i, "До голосования осталось %d %s!", iTimer, szSec);
    }
    
    client_cmd(0, "spk %s", g_szSound[iTimer--]);
}

public Show_Menu()
{
    new Players[32], pNum, iPlayer; get_players(Players, pNum, "ch");
    
    g_iVoteTime = VOTE_TIME;
        
    for(new i = 0; i < pNum; i++)
    {
        iPlayer = Players[i];
        VoteMenu(iPlayer + TASK_VOTEMENU);
        set_task(1.0, "VoteMenu", iPlayer + TASK_VOTEMENU, _, _, "a", VOTE_TIME);
    }
    set_task(1.0, "Timer", TASK_TIMER, _, _, "a", VOTE_TIME+1);
    
    client_cmd(0, "spk Gman/Gman_Choose2");    
}

public VoteMenu(id)
{
    id -= TASK_VOTEMENU;

#if defined _fakemeta_included
    set_pdata_int( id, 205, 0 );
#endif    
    
    if(g_iVoteTime == 0)
    {        
        show_menu(0, 0, "^n", 1);
        if(task_exists(id+TASK_VOTEMENU)) remove_task(id+TASK_VOTEMENU);
        return PLUGIN_HANDLED;
    }
    
    new szMenu[512], len = 0;
    
    len = formatex(szMenu[len], charsmax(szMenu) - len, "\y%s:^n^n", g_bHasVoted[id] ? "Результаты голосования" : "Выберите карту");
    
    new Key, iPercent, i, iMax = maps_in_menu();
    
    for(i = 0; i < iMax; i++)
    {        
        iPercent = 0;
        if(g_iTotal)
            iPercent = floatround(g_iVoteItem[i]*100.0/g_iTotal);
        
        if(!g_bHasVoted[id])
        {
            len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%d.\w %s\d[\r%d%%\d]^n", i + 1, g_szInMenuMapName[i], iPercent);    
            Key |= (1 << i);        
        }
        else
            len += formatex(szMenu[len], charsmax(szMenu) - len, "\d%s[\r%d%%\d]^n", g_szInMenuMapName[i], iPercent);        
    }
    
    if(!g_bRockVote && get_pcvar_num(g_pTimeLimit) != 0 && g_iExtendedMax < get_pcvar_num(g_pExendedMax))
    {
        iPercent = 0;
        if(g_iTotal)
            iPercent = floatround(g_iVoteItem[i]*100.0/g_iTotal);
        
        if(!g_bHasVoted[id])
        {
            len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\r%d.\w %s\d[\r%d%%\d]\y[Продлить]^n", i + 1, g_szCurrentMap, iPercent);    
            Key |= (1 << i);        
        }
        else
            len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\d%s[\r%d%%\d]\y[Продлить]^n", g_szCurrentMap, iPercent);
    }
    
    new szSec[16]; get_ending(g_iVoteTime, "секунд", "секунда", "секунды", szSec, charsmax(szSec));
    len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\dОсталось \r%d\d %s", g_iVoteTime, szSec);
    
    if(!Key) Key |= (1 << 9);
    
    if(get_pcvar_num(g_pShowResultType) == 1 && g_bHasVoted[id])
    {
        while(replace(szMenu, charsmax(szMenu), "\r", "")){}
        while(replace(szMenu, charsmax(szMenu), "\d", "")){}
        while(replace(szMenu, charsmax(szMenu), "\w", "")){}
        while(replace(szMenu, charsmax(szMenu), "\y", "")){}
        
        set_hudmessage(HUD_RESULT_COLOR, 0.02, -1.0, 0, 6.0, 1.0, 0.1, 0.2, 4);
        show_hudmessage(id, "%s", szMenu);
    }
    else
        show_menu(id, Key, szMenu, -1, "Vote_Menu");
    
    return PLUGIN_HANDLED;
}

public VoteMenu_Handler(id, key)
{
    if(g_bHasVoted[id])
    {
        VoteMenu(id + TASK_VOTEMENU);
        return PLUGIN_HANDLED;
    }
    if(get_user_flags(id) & ADMIN_MENU && get_pcvar_num(g_pAdminVoteWeight) != 0)
        g_iVoteItem[key] += get_pcvar_num(g_pAdminVoteWeight);
    else
        g_iVoteItem[key]++;
    g_iTotal++;
    
    g_bHasVoted[id] = true;
    
    new iCvar = get_pcvar_num(g_pShowSelects);
    if(iCvar)
    {
        new szName[32];
        get_user_name(id, szName, charsmax(szName));
        if(key == maps_in_menu())
        {
            switch(iCvar)
            {
#if defined DEBUG
                case 1:    
                {    
                    client_print_color(0, id, "%s^1 ^3%s^1 выбрал продление карты.", PREFIX, szName);
                    log_to_file("mapmanager_debug.log", "%s выбрал продление карты.", szName);
                }
#else
                case 1: client_print_color(0, id, "%s^1 ^3%s^1 выбрал продление карты.", PREFIX, szName);
#endif                    
                case 2: client_print_color(id, DontChange, "%s^1 Вы выбрали продление карты.", PREFIX);
            }
        }
        else
        {
            switch(iCvar)
            {
                case 1:    client_print_color(0, id, "%s^3 %s^1 выбрал^3 %s^1.", PREFIX, szName, g_szInMenuMapName[key]);
                case 2: client_print_color(id, DontChange, "%s^1 Вы выбрали^3 %s^1.", PREFIX, g_szInMenuMapName[key]);
            }
        }
    }

    if(get_pcvar_num(g_pShowResultAfterVote))
        VoteMenu(id + TASK_VOTEMENU);
    else
        if(task_exists(id + TASK_VOTEMENU)) remove_task(id + TASK_VOTEMENU);

    return PLUGIN_HANDLED;
}

public Timer()
{
    if(--g_iVoteTime == 0)
    {
        FinishVote();
        show_menu(0, 0, "^n", 1);
        if(task_exists(TASK_TIMER)) remove_task(TASK_TIMER);
    }
}

FinishVote()
{
    new MaxVote = 0, iInMenu = maps_in_menu(), iRandom;
    new iMax = g_bRockVote ? iInMenu : iInMenu + 1;
    for(new i = 1; i < iMax; i++)
    {
        iRandom = random_num(0, 1);
        switch(iRandom)
        {
            case 0: if(g_iVoteItem[MaxVote] < g_iVoteItem[i]) MaxVote = i;
            case 1: if(g_iVoteItem[MaxVote] <= g_iVoteItem[i]) MaxVote = i;
        }
    }
    
    g_bBeInVote = false;
    g_bVoteFinished = true;
    g_Work = false;
    
    if(!g_iTotal || (MaxVote != iInMenu))
    {
        if(g_iTotal)
        {
            client_print_color(0, Blue, "%s^1 Следующая карта:^3 %s^1.", PREFIX, g_szInMenuMapName[MaxVote]);
#if defined DEBUG
            log_to_file("mapmanager_debug.log", "Следующая карта: %s", g_szInMenuMapName[MaxVote]);
#else        
            log_amx("Следующая карта: %s", g_szInMenuMapName[MaxVote]);            
#endif
        }
        else
        {
            MaxVote = random_num(0, iInMenu - 1);
            client_print_color(0, Blue, "%s^1 Никто не голосовал. Следуйщей будет^3 %s^1.", PREFIX, g_szInMenuMapName[MaxVote]);
        }
    
        set_pcvar_string(g_pNextMap, g_szInMenuMapName[MaxVote]);    
        
        if(g_bRockVote || g_bVoteFinished)
        {
            ChangeLevel();
#if defined DEBUG
            log_to_file("mapmanager_debug.log", "Меняем карту =)");
#endif            
        }
    }
    else
    {
        g_bVoteFinished = false;
        g_iExtendedMax++;
        new iMin = get_pcvar_num(g_pExendedTime);
        new szMin[16]; get_ending(iMin, "минут", "минута", "минуты", szMin, charsmax(szMin));
        
        client_print_color(0, DontChange, "%s^1 Текущая карта продлена на^3 %d^1 %s.", PREFIX, iMin, szMin);
#if defined DEBUG
        log_to_file("mapmanager_debug.log", "Текущая карта продлена на %d %s.", iMin, szMin);
#else        
        log_amx("Текущая карта продлена на %d %s.", iMin, szMin);
#endif
        set_pcvar_num(g_pTimeLimit, get_pcvar_num(g_pTimeLimit) + iMin);
        
        if(get_pcvar_num(g_pBlockPlayers))
        {
            set_pcvar_num ( pcv_mp_freezetime, g_freezetime );
            fade = 0; cmd_screen_fade (fade);
        }            
    }
}

public ChangeLevel()
{
    message_begin(MSG_ALL, SVC_INTERMISSION);
    message_end();
    
    set_task(3.0, "NextMap");
}

public NextMap()
{
    new szMap[32]; get_pcvar_string(g_pNextMap, szMap, charsmax(szMap));
    server_cmd("changelevel %s", szMap);
}

//*****  *****//
bool:valid_map(map[])
{
    if(is_map_valid(map)) return true;
    
    new len = strlen(map) - 4;
    
    if(len < 0) return false;
    
    if(equal(map[len], ".bsp"))
    {
        map[len] = '^0';        
        if(is_map_valid(map)) return true;
    }
    
    return false;
}

bool:in_maps_array(map[])
{
    new szMap[33], iMax = ArraySize(g_iMapsArray);
    for(new i = 0; i < iMax; i++)
    {
        ArrayGetString(g_iMapsArray, i, szMap, charsmax(szMap));
        if(equal(szMap, map))
            return true;
    }
    return false;
}

get_blocked_maps()
{
    new iCount = 0;
    for(new i = 0; i < MAP_BLOCK; i++)
        if(g_BlockedMaps[i][COUNT]) iCount++;
    return iCount;
}

clear_blocked_maps()
{
    for(new i = 0; i < MAP_BLOCK; i++)
    {
        g_BlockedMaps[i][MAP] = "";
        g_BlockedMaps[i][COUNT] = 0;
    }
    delete_file(FILE_BLOCKEDMAPS);
}

get_blocked_map_count(map[])
{
    for(new i = 0; i < MAP_BLOCK; i++)
        if(equal(g_BlockedMaps[i][MAP], map)) return g_BlockedMaps[i][COUNT];
    return 0;
}

clear_nominated_maps(id)
{
    new Data[NOMINATE_DATA];
    for(new i = 0; i < ArraySize(g_iNominateArray); i++)
    {
        ArrayGetArray(g_iNominateArray, i, Data);
        if(Data[PLAYER] == id)
        {
            ArrayDeleteItem(g_iNominateArray, i--);    
            if(!--g_iNominatedMaps[id]) break;
        }
    }
}

remove_nominated_map(id, map[])
{
    new Data[NOMINATE_DATA], iMax = ArraySize(g_iNominateArray);
    for(new i = 0; i < iMax; i++)
    {
        ArrayGetArray(g_iNominateArray, i, Data);
        if(Data[PLAYER] == id && equal(Data[MAP], map))
        {
            new szName[32]; get_user_name(id, szName, charsmax(szName));
            g_iNominatedMaps[id]--;
            ArrayDeleteItem(g_iNominateArray, i);
            client_print_color(0, Blue, "%s^3 %s^1 убрал номинацию с карты^3 %s^1.", PREFIX, szName, map);
            break;
        }
    }    
}

is_map_nominated(map[])
{
    new Data[NOMINATE_DATA], iMax = ArraySize(g_iNominateArray);
    for(new i = 0; i < iMax; i++)
    {
        ArrayGetArray(g_iNominateArray, i, Data);
        if(equal(Data[MAP], map)) return Data[PLAYER];
    }            
    return 0;
}

bool:in_menu(num)
{
    for(new i = 0; i < SELECT_MAPS && i < 8; i++)
        if(num == g_iInMenu[i]) return true;
    return false;
}

bool:is_blocked(num)
{
    new szMap[33]; ArrayGetString(g_iMapsArray, num, szMap, charsmax(szMap));    
    for(new i = 0; i < MAP_BLOCK; i++)
        if(equal(g_BlockedMaps[i][MAP], szMap)) return true;
    return false;
}

maps_in_menu()
{
    new map;
    for(new i = 0; i < SELECT_MAPS; i++)
        if(g_iInMenu[i] != -1) map++;
    return map;
}

stock get_players_num()
{
    new iPlayers = 0, iMax = get_maxplayers();
    for(new id = 1; id < iMax; id++)
        if(is_user_connected(id) && !is_user_bot(id) && !is_user_hltv(id)) iPlayers++;
    return iPlayers;
}

stock get_ending(num, const a[], const b[], const c[], output[], lenght)
{
    new num100 = num % 100, num10 = num % 10;
    if(num100 >=5 && num100 <= 20 || num10 == 0 || num10 >= 5 && num10 <= 9) format(output, lenght, "%s", a);
    else if(num10 == 1) format(output, lenght, "%s", b);
    else if(num10 >= 2 && num10 <= 4) format(output, lenght, "%s", c);
}

stock cmd_screen_fade (fade)
{
    new time, hold, flags;

    switch (fade)
    {
        case 1:
        {
            time = 1;
            hold = 1;
            flags = 4;
        }
    
        default:
        {
            time = 4096;
            hold = 1024;
            flags = 2;
        }
    }

    message_begin     ( MSG_BROADCAST, g_msgScreenFade, {0,0,0}, 0 );
    write_short    ( time );
    write_short    ( hold );
    write_short    ( flags );
    write_byte    ( 0 );
    write_byte    ( 0 );
    write_byte    ( 0 );
    write_byte    ( 255 );
    message_end();

    return PLUGIN_CONTINUE;
}
#if !defined CSDM
stock hud_lastround()
{
    set_hudmessage(127, 127, 127, 0.02, 0.21, 0, 30.0, 15.04, 0.0, 0.5, 3);
    show_hudmessage(0, "Последний раунд");
}
#endif


Отредактировал: gosha777, - 20.7.2014, 13:49
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
XyLiGaN
сообщение 20.7.2014, 13:07
Сообщение #2
Стаж: 13 лет
Город: Югорск

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

Меценат Меценат

gosha777,
mm_loadmapstype 1
И да, там файл так то не mapcycle.txt, который лежит в корне сервера, там где server.cfg, а файл maps.ini, который лежит в папке configs.
ps.gif Спойлер не работает. исправь.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
gosha777
сообщение 20.7.2014, 13:48
Сообщение #3
Стаж: 12 лет

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

XyLiGaN,
а можно сделать так что бы был mapcycle.txt?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
XyLiGaN
сообщение 20.7.2014, 13:54
Сообщение #4
Стаж: 13 лет
Город: Югорск

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

Меценат Меценат

gosha777,
Правильно будет так как есть. т.к. файл maps.ini - файл от куда беруться карты и в котором прописанно, какие карты есть на сервере.
Ты даже представления не знаешь что ты хочешь....
Цитата
mapcycle.txt используется когда на сервере нет AMXModX'a

Когда на сервере есть AMXModX, то он умеет загружать список карт из своего файла (maps.ini).
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
gosha777
сообщение 20.7.2014, 14:14
Сообщение #5
Стаж: 12 лет

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

XyLiGaN,
я как раз знаю.просто maps.ini удалён и карты берутся из mapcycle.txt.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
XyLiGaN
сообщение 20.7.2014, 14:18
Сообщение #6
Стаж: 13 лет
Город: Югорск

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

Меценат Меценат

gosha777,
Тепер. Поменяй их местами и всё. Мапс создай, а этот файл сдали, который сейчас есть. Разницы что использовать нет.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: