Проскакивает показ урона от дамагера

Сообщения
400
Реакции
147
Помог
11 раз(а)
Всем привет. Помогите исправить(пофиксить) недочёты в плагине. когда игрока из противоположный команды, убивает пушка голиафа, то отображает(проскакивает) показ урона владельцу пушки, вот:
C-like:
#include <amxmodx>
#include <reapi>
new g_HudSyncMessage;
new g_HudSyncMessage2;
public plugin_init(){
    RegisterHookChain(RG_CBasePlayer_TakeDamage, "CPlayer_TakeDamage_Post", .post = true);
    g_HudSyncMessage = CreateHudSyncObj();
    g_HudSyncMessage2 = CreateHudSyncObj();
}
public CPlayer_TakeDamage_Post(iVictim, iInflictor, iAttacker, Float:flDamage, iBitsDamageType){
    if(!is_user_connected(iAttacker))return;
    //if(iBitsDamageType & DMG_BLAST)return;
    static team;team = get_member(iVictim,m_iTeam);
    if(team == get_member(iAttacker, m_iTeam)) return;
    static rgb[3];
    if(team==1){
        rgb[0]=255;rgb[1]=0;rgb[2]=0;
    }
    else{
        rgb[0]=0;rgb[1]=0;rgb[2]=255;
    }

    set_hudmessage(rgb[0], rgb[1], rgb[2], 0.45, 0.50, 2, 0.1, 4.0, 0.1, 0.1, -1);
    ShowSyncHudMsg(iVictim, g_HudSyncMessage2, "%.0f", flDamage);

    team = get_member(iAttacker,m_iTeam);
    if(team==2){
        rgb[0]=255;rgb[1]=0;rgb[2]=0;
    }
    else{
        rgb[0]=0;rgb[1]=0;rgb[2]=255;
    }
    set_hudmessage(rgb[0], rgb[1], rgb[2], -1.0, 0.55, 2, 0.1, 4.0, 0.02, 0.02, -1);
    ShowSyncHudMsg(iAttacker, g_HudSyncMessage, "%.0f", flDamage);
}
одну вещь которую нужно добился, но не до конца, хотелось чтобы было вот:
1565037430726.png
но появилось и другая проблема, ставлю данный исходный код плагина, что выше, а на сервере ещё установлен плагин пушка-голиафа от SMaster'a, данный плагин предоставляется автором без исходного кода, только скомпилированный файл плагина: .amxx (с конфигом), в ЛС могу скинуть)), мод сервера csdm с элементами пушек, лазеров и т.д, то местами проскакивает показ урона (показывает), когда
и ещё в видео показывается момент, как будто дропаются (выкидываются) оружие(летают, падают), до этого на сервере был установлен этот
C-like:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta_util>

#define PLUGIN "Advanced Bullet Damage"
#define VERSION "1.0"
#define AUTHOR "Sn!ff3r"

new g_type, g_enabled, g_recieved, bool:g_showrecieved, g_hudmsg1, g_hudmsg2

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)

    register_event("Damage", "on_damage", "b", "2!0", "3=0", "4!0")
    register_event("HLTV", "on_new_round", "a", "1=0", "2=0")

    g_type = register_cvar("amx_bulletdamage","1")
    g_recieved = register_cvar("amx_bulletdamage_recieved","1")

    g_hudmsg1 = CreateHudSyncObj()
    g_hudmsg2 = CreateHudSyncObj()
}

public on_new_round()
{
    g_enabled = get_pcvar_num(g_type)
    if(get_pcvar_num(g_recieved)) g_showrecieved = true
}

public on_damage(id)
{
    if(g_enabled)
    {
        static attacker; attacker = get_user_attacker(id)
        static damage; damage = read_data(2)
        new rgb[3];
        switch(get_user_team(attacker)){
            case 1:{
                rgb[0] = 255
                rgb[1] = 0
                rgb[2] = 0
            }
            case 2:{
                rgb[0] = 0
                rgb[1] = 0
                rgb[2] = 255
            }
        }
        if(g_showrecieved)
        {
            set_hudmessage(255, 0, 0, 0.45, 0.50, 2, 0.1, 4.0, 0.1, 0.1, -1)
            ShowSyncHudMsg(id, g_hudmsg2, "%i^n", damage)
        }
        if(is_user_connected(attacker))
        {
            switch(g_enabled)
            {
                case 1: {
                    set_hudmessage(rgb[0], rgb[1], rgb[2], -1.0, 0.55, 2, 0.1, 4.0, 0.02, 0.02, -1)
                    ShowSyncHudMsg(attacker, g_hudmsg1, "%i^n", damage)
                }
                case 2: {
                    if(fm_is_ent_visible(attacker,id))
                    {
                        set_hudmessage(rgb[0], rgb[1], rgb[2], -1.0, 0.55, 2, 0.1, 4.0, 0.02, 0.02, -1)
                        ShowSyncHudMsg(attacker, g_hudmsg1, "%i^n", damage)
                    }
                }
            }
        }
    }
}
с ним работало всё как надо и проскакивание(показ) урона, когда игрока убивала пушка-голиафа никакого не было, но он переставал работать, если установить на сервер другой мапменеджар карт (на сервере был установлен: Mapmanager 0.5.7 CSDM Mistrick / neygomon), устанавливал на сервер Advanced MapChooser 1.4, устанавливал также Map Manager [Modular] 3.0.4, дамагер переставал работать, отключал amxmodxи другие модули, оставлял для захода на сервер reunion и reauthcheck, дамагер также не работал, стоило отключать выше упомянутые мапменеджеры карт и вернуть какой до этого был установлен:
C-like:
#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 10            // Время голосования
#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", "1");//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", "2"); // количество продлений
    g_pAdminVoteWeight = register_cvar("mm_adminvote_weight", "0"); // вес голоса админа при голосовании [флаг ADMIN_MENU]
    g_pAdminRTVWeight = register_cvar("mm_adminrtv_weight", "0"); // вес голоса админа в 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", "0");//minutes
    g_pRockShow = register_cvar("mm_rtv_show", "1");//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] Голосование уже ^4запущено! ^1Ожидайте.");
    }
    else
    {
        if(id == 0)
            console_print(0, "[MapManager] VoteMap started");
        else
            console_print(id, "[MapManager] Голосование за досрочную смену карты ^4запущено");
        #if !defined CSDM
            g_Work = true;
        #else
            StartVote(0);
        #endif
        client_print_color(0, DontChange, "%s^1 Администратор запустил ^4досрочное голосование!", PREFIX);
   
        new name[32];
        get_user_name(id, name, charsmax(name));
        log_amx("Администратор %s запустил ^4досрочное голосование", 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 Вы не можете голосовать за досрочную ^4смену карты. Осталось: %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 проголосовал за ^4смену карты. Осталось: %d %s.", PREFIX, szName, iVote, szVote);
#if defined DEBUG
                    log_to_file("mapmanager_debug.log", "%s проголосовал за ^4смену карты. Осталось: %d %s.", szName, iVote, szVote);
#else
                    log_amx("%s проголосовал за ^4смену карты. Осталось: %d %s.", szName, iVote, szVote);
#endif              
                }
                case 1: client_print_color(id, DontChange, "%s^1 Ваш голос ^4учтён. Осталось: %d %s.", PREFIX, iVote, szVote);
            }
        }
        else
        {
            #if !defined CSDM
            g_bRockVote = true;
            g_Work = true;
            client_print_color(0, DontChange, "%s^1 Голосование за смену карты будет в ^4новом раунде.", PREFIX);
#if defined DEBUG
            log_to_file("mapmanager_debug.log", "Голосование за смену карты будет в ^4новом раунде.");
#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 Вы уже ^4голосовали. Осталось: %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 Следующая ^4карта: ^3%s^1.", PREFIX, szMap);
}

public Command_Timeleft(id)
{
    new a = get_timeleft();
    if(a == 0)
        client_print_color(0, DontChange, "%s^1 Карта не ограничена по ^4времени.", PREFIX);
    else
        client_print_color(0, Blue, "%s^1 До конца карты ^4осталось:^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 Вы не можете больше ^4номинировать ^1карты.", PREFIX);
        return PLUGIN_HANDLED;
    }
    if(get_blocked_map_count(map))
    {
        client_print_color(id, DontChange, "%s^1 Эта карта недоступна для ^4номинации.", PREFIX);
        return PLUGIN_HANDLED;
    }
    if(is_map_nominated(map))
    {
        client_print_color(id, DontChange, "%s^1 Эта карта уже ^4номинирована.", 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 В файле нет ^4валидных ^1карт.", PREFIX);
        return PLUGIN_HANDLED;
    }
    if(g_bBeInVote)
    {
        if(id) client_print_color(id, DontChange, "%s^1 Голосование ^4запущено.", 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 выбрал ^4продление ^1карты.", PREFIX, szName);
                    log_to_file("mapmanager_debug.log", "%s выбрал ^4продление ^1карты.", szName);
                }
#else
                case 1: client_print_color(0, id, "%s^1 ^3%s^1 выбрал ^4продление ^1карты.", PREFIX, szName);
#endif              
                case 2: client_print_color(id, DontChange, "%s^1 Вы выбрали ^4продление ^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 Следующая ^4карта:^3 %s^1.", PREFIX, g_szInMenuMapName[MaxVote]);
#if defined DEBUG
            log_to_file("mapmanager_debug.log", "Следующая ^4карта: %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 Никто ^4не голосовал. Следующей ^будет^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 Текущая карта ^4продлена ^1на^3 %d^1 %s.", PREFIX, iMin, szMin);
#if defined DEBUG
        log_to_file("mapmanager_debug.log", "Текущая карта ^4продлена ^1на %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 убрал ^4номинацию ^1с ^4карты^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
то дамагер снова работал. Заранее спасибо!)
 
Последнее редактирование:
Сообщения
432
Реакции
409
Помог
14 раз(а)
Ну если исходника нет, то надо чекать, является ли инфликтор гранатой при DMG_BLAST
Если я правильно понял суть проблемы
 
Сообщения
400
Реакции
147
Помог
11 раз(а)
voed, от пушек голиафа нету исходного кода, т.к. автор его не предоставляет, только уже скомпилированный плагин .amxx. могу в ЛС скинуть!)
 
Сообщения
58
Реакции
2
Помог
2 раз(а)
Я так понял автор плагина smaster, если да, то проверь класс iInflictor, какой выводиться если не player, а например sentry или что то вроде, то пробуй над ним поработать
 
Сообщения
400
Реакции
147
Помог
11 раз(а)
pro100iweb, совершенно верно угадал плагин пушек-голиафа от смастера, а для примера что-то подобное есть, посмотреть на это. да плохо что исходного кода нету, а то скомпилированный .amxx.
Код:
; ------------------------------------
; Конфигурационный файл CSSB Goliath Sentry Gun (пушка Голиаф)
; Официальный сайт http://perfect-soft.su
; ------------------------------------

;Основные настройки мода
[Base Options]
;Вкл/выкл отображение предмета в меню
SG_ITEM_MENU_ON_OFF = 1
;Радиус в котором срабатывает обнаружение цели
SG_DIST_TARGET_LVL_1 = 15000.0
SG_DIST_TARGET_LVL_2 = 15000.0
SG_DIST_TARGET_LVL_3 = 15000.0
SG_DIST_TARGET_LVL_4 = 15000.0
SG_DIST_TARGET_LVL_5 = 15000.0
;Здоровье пушки
SG_HP_LVL_1 = 1500.0
SG_HP_LVL_2 = 1700.0
SG_HP_LVL_3 = 2000.0
SG_HP_LVL_4 = 2100.0
SG_HP_LVL_5 = 4100.0
;Дамаг пушки (от пулемета)
SG_DMG_LVL_1 = 1.0
SG_DMG_LVL_2 = 2.0
SG_DMG_LVL_3 = 3.0
SG_DMG_LVL_4 = 4.0
SG_DMG_LVL_5 = 5.0
;Деньги за уничтоженную пушку
SG_MONEY_DESTROY_LVL_1 = 1111
SG_MONEY_DESTROY_LVL_2 = 2222
SG_MONEY_DESTROY_LVL_3 = 3333
SG_MONEY_DESTROY_LVL_4 = 4444
SG_MONEY_DESTROY_LVL_5 = 5555
;Деньги владельцу турели за убийство пушкой (от пулемета)
SG_MONEY_OWNER_KILL_LVL_1 = 111
SG_MONEY_OWNER_KILL_LVL_2 = 222
SG_MONEY_OWNER_KILL_LVL_3 = 333
SG_MONEY_OWNER_KILL_LVL_4 = 444
SG_MONEY_OWNER_KILL_LVL_5 = 555
;Денежные отчисления игроку, который обновлял пушку до 1 уровня и после него обновили пушку снова (в процентах от суммы получаемой владельцем турели)
SG_MONEY_PERCENT_CASH_PAYMENTS_LVL_1 = 10
;Денежные отчисления игроку, который обновлял пушку до 2 уровня и после него обновили пушку снова (в процентах от суммы получаемой владельцем турели)
SG_MONEY_PERCENT_CASH_PAYMENTS_LVL_2 = 15
;Денежные отчисления игроку, который обновлял пушку до 3 уровня и после него обновили пушку снова (в процентах от суммы получаемой владельцем турели)
SG_MONEY_PERCENT_CASH_PAYMENTS_LVL_3 = 20
;Денежные отчисления игроку, который обновлял пушку до 4 уровня и после него обновили пушку снова (в процентах от суммы получаемой владельцем турели)
SG_MONEY_PERCENT_CASH_PAYMENTS_LVL_4 = 20
;Цена создания и обновления пушки
SG_MONEY_CREATE = 1000,2000,3000
SG_MONEY_UPDATE_SG_LVL_2 = 100
SG_MONEY_UPDATE_SG_LVL_3 = 100
;Количество смертей игрока, после которых все пушки принадлежащие игроку удаляются
SG_NUM_KILL_USER = 1
;Время через которое можно снова прикоснуться к пушке (чтобы не спамило в чат сообщениями)
SG_TOUCH_SENTRY_TIME = 0.5
;Максимальное количество устанавливаемых пушек обычным игроком
SG_MAX_BUILD_SENTRY = 2
;Максимальное количество устанавливаемых пушек игроком имеющим доступ по флагу (админ,вип...)
SG_MAX_ACCESS_BUILD_SENTRY = 3
;Флаг доступа дающий возможность обновлять свою пушку и строить количество пушек равное SG_MAX_ACCESS_BUILD_SENTRY
SG_FLAG_ACCESS_BUILD_SENTRY = t
;Расстояние до ближайшей пушки тимейта в котором запрещено ставить свою пушку
SG_DIST_TEAM_SENTRY = 400.0
;Расстояние до своей ближайшей пушки в котором запрещено ставить еще одну свою пушку
SG_DIST_OWNER_SENTRY = 100.0
;Вкл/выкл отображение иконки количества пушек игрока (с левой стороны)
SG_SHOW_ICON_LEFT = 0
;Вкл/выкл отображение иконки количества пушек игрока (с нижней стороны)
SG_SHOW_ICON_DOWN = 1
;Вкл/выкл отображение количества пушек в команде вместо счета побед
SG_SHOW_COUNT_SENTRY_TEAM = 1
;Вкл/выкл. отображение спрайтов на пушке при наделении способностью
SG_SPRITES_ON_OFF = 1
;Процентная скидка на обновление и установку
SG_DISCOUNT_PERCENT = 25.0
;Флаг доступа дающий доступ к скидкам при установке и обновлении
SG_FLAG_ACCESS_DISCOUNT = t
;Режимы убийства пушкой (пулемет):
;(1 - игрок умирает, при этом киллеру не начисляется +300, как за стандартное убийство с оружия. информация выводится о убийстве)
;(2 - игрок умирает, при этом киллеру начисляется +300, как за стандартное убийство с оружия. информация выводится о убийстве)
;(3 - игрок умирает, при этом киллеру начисляется +300, как за стандартное убийство с оружия. информация не выводится о убийстве)
SG_HIDE_KILL = 2
;Расстояние до пушки при котором игрок может ремонтировать пушку
SG_DIST_HEALING_SENTRY = 75.0
;Расстояние до пушки при котором игрок может обновлять пушку до 4 уровня (касается меню навыков когда оно открыто)
SG_DIST_UPDATE_IN_MENU_SENTRY = 135.0
;Стоимость лечения пушки за каждое (N hp) пополнение здоровья
SG_MONEY_HEALING_SENTRY = 30
;По сколько лечит пушку
SG_HEALING_SENTRY = 10.0
;Значение здоровья ниже которого появляется дым
SG_HEALTH_SMOKE_EFFECT_SENTRY = 1000.0
;Задержка стрельбы при обнаружении цели (в секундах)
SG_DELAY_SHOOTING_TIME = 0.0
;Денежный бонус за обновление чужой пушки
SG_MONEY_BONUS_UPDATE_LVL_2 = 100
SG_MONEY_BONUS_UPDATE_LVL_3 = 100
SG_MONEY_BONUS_UPDATE_LVL_4 = 100
SG_MONEY_BONUS_UPDATE_LVL_5 = 100
;Вкл/выкл вывод информации обозначения пушки в алфавитном порядке
SG_CHAT_ALFAVIT_ON_OFF = 0
;Процент от дамага, который превращается в деньги (при нуле ничего даваться не будет)
SG_MONEY_PERCENT_DAMAGE = 10
;Сколько максимально можно набить денег нанося урон по пушке
SG_MONEY_MAX_DAMAGE = 16000
;Время через сколько автоматически закроется меню скилов для обновления пушки до 4 уровня
SG_CLOSE_MENU_SKILLS_4 = 2.3
;Время через сколько автоматически закроется меню скилов для обновления пушки до 5 уровня
SG_CLOSE_MENU_SKILLS_5 = 2.3
;Включить/выключить возможность прокачки до 5 уровня VIP (0 - все; 1 - ключ флага SG_FLAG_ACCESS_LVL_5)
SG_FLAG_ACCESS_LVL_5_ON_OFF = 0
;Флаг доступа дающий доступ к прокачке 5 уровня
SG_FLAG_ACCESS_LVL_5 = t
;Включить/выключить вывод сообщения, что нельзя прокачать пушку до 5 уровня
SG_CHAT_ACCESS_LVL_5_ON_OFF = 1
;Параметр отвечает, как хорошо пушка видит противника (отсчет идет от ценра пушки по Z)
SG_USER_VISIBLE_SENTRY = 22.0

;Настройки способности "Ураганный выстрел"
[Skill Hurricane shot]
;Включить/выключить возможность наделения пушки способностью "Ураганный выстрел"
SG_SKILL_HURRICANE_SHOT_ON_OFF = 1
;Время через сколько срабатывает выстрел заряда
SG_UPDATE_CHARGE_TIME = 1.0
;Радиус поражения при соприкосновении с полом, стеной..
SG_HURRICANE_SHOT_RADIUS = 350.0
;Дамаг
SG_HURRICANE_SHOT_DMG = 50.0
;Деньги за убийство
SG_HURRICANE_SHOT_MONEY = 300
;Цена наделения способностью "Ураганный выстрел"
SG_HURRICANE_SHOT_MONEY_CREATE = 300

;Настройки способности "Аура лечения"
[Skill Aura treatment]
;Включить/выключить возможность наделения пушки способностью "Аура лечения"
SG_SKILL_AURA_TREATMENT_ON_OFF = 1
;Расстояние в котором лечится игрок
SG_HP_DIST_DETECTION_TARGET = 200.0
;Максимальное здоровье до которого лечит
SG_HP_MAX_DETECTION_TARGET = 150.0
;Сколько прибавляет здоровья
SG_HP_BONUS_DETECTION_TARGET = 1.0
;Цена наделения способностью "Аура лечения"
SG_AURA_TREATMENT_MONEY_CREATE = 100

;Настройки способности "Аура света"
[Skill Aura light]
;Включить/выключить возможность наделения пушки способностью "Аура света"
SG_SKILL_AURA_LIGHT_ON_OFF = 1
;Цена наделения способностью "Аура света"
SG_AURA_LIGHT_MONEY_CREATE = 1000

;Настройки способности Ракеты "Сатана"
[Skill Rockets]
;Включить/выключить возможность наделения пушки способностью Ракеты "Сатана"
SG_SKILL_ROCKETS_ON_OFF = 1
;Время через сколько срабатывает выстрел заряда
SG_UPDATE_ROCKET_TIME = 1.0
;Радиус поражения при соприкосновении с полом, стеной..
SG_ROCKET_SHOT_RADIUS = 200.0
;Дамаг
SG_ROCKET_SHOT_DMG = 50.0
;Деньги за убийство
SG_ROCKET_SHOT_MONEY = 300
;Цена наделения способностью Ракеты "Сатана"
SG_ROCKET_MONEY_CREATE = 200

;Настройки способности "Заморозка"
[Skill freezing]
;Включить/выключить возможность наделения пушки способностью "Заморозка"
SG_SKILL_FREEZING_SHOT_ON_OFF = 1
;Время через сколько срабатывает выстрел заряда
SG_UPDATE_FREEZING_CHARGE_TIME = 3.0
;Время через сколько заморозка прекращает действовать
SG_TIME_FREEZING_REMOVE = 5.0
;Радиус поражения при соприкосновении с полом, стеной..
SG_FREEZING_SHOT_RADIUS = 500.0
;Дамаг
SG_FREEZING_SHOT_DMG = 1.0
;Деньги за убийство
SG_FREEZING_SHOT_MONEY = 300
;Цена наделения способностью "Заморозка"
SG_FREEZING_SHOT_MONEY_CREATE = 100
;Модель куба заморозки
SG_MODEL_CUBE = models/CSSB/sentry_v5/ice_cube.mdl
;Вкл/выкл создание куба
SG_CUBE_ON_OFF = 1
;Включить/выключить возможность доступа к прокачке скила "Заморозка" (0 - все; 1 - ключ флага SG_FLAG_ACCESS_FREEZING)
SG_FLAG_ACCESS_FREEZING_ON_OFF = 0
;Флаг доступа дающий доступ к прокачке скила "Заморозка"
SG_FLAG_ACCESS_FREEZING = t
;Ограничение скила "Заморозка" на команду
SG_NUM_FREEZING = 3


;Настройки способности "Тесла"
[Skill tesla]
;Включить/выключить возможность наделения пушки способностью "Тесла"
SG_SKILL_TESLA_SHOT_ON_OFF = 1
;Время через сколько срабатывает выстрел заряда
SG_UPDATE_TESLA_CHARGE_TIME = 2.0
;Дистанция при которой заряд Тесла сработает
SG_TESLA_SHOT_RADIUS = 3000.0
;Дистанция при которой заряд Тесла сработает от первичной цели до следующей (пробивать может электричество сквозь стену!)
SG_TESLA_SHOT_RADIUS_ADD = 500.0
;Дамаг
SG_TESLA_SHOT_DMG = 20.0
;Деньги за убийство
SG_TESLA_SHOT_MONEY = 500
;Цена наделения способностью "Тесла"
SG_TESLA_SHOT_MONEY_CREATE = 150
;Включить/выключить возможность доступа к прокачке скила "Тесла" (0 - все; 1 - ключ флага SG_FLAG_ACCESS_TESLA)
SG_FLAG_ACCESS_TESLA_ON_OFF = 0
;Флаг доступа дающий доступ к прокачке скила "Тесла"
SG_FLAG_ACCESS_TESLA = t
;Ограничение скила "Тесла" на команду
SG_NUM_TESLA = 3

;Настройки способности "Лазерный выжигатель"
[Skill laser]
;Включить/выключить возможность наделения пушки способностью "Лазерный выжигатель"
SG_SKILL_LASER_SHOT_ON_OFF = 1
;Цена наделения способностью "Лазерный выжигатель"
SG_LASER_SHOT_MONEY_CREATE = 300
;Время отрисовки луча
SG_LASER_LIFE = 1
;Толщина луча
SG_LASER_WIDTH = 35
;Колебания луча
SG_LASER_NOISE = 0
;Цвет луча теров
SG_LASER_RGB_T = 255,255,255
;Цвет луча контров
SG_LASER_RGB_CT = 255,255,255
;Яркость луча
SG_LASER_ALPHA = 255
;Скорость луча
SG_LASER_SPEED = 150
;Дамаг
SG_LASER_SHOT_DMG = 25.0
;Включить/выключить отрисовку искр
SG_LASER_SPARKS_DRAW = 1
;Луч лазера теров
SG_LASER_RAY_T = sprites/CSSB/laser_mines/laser_red.spr
;Луч лазера контров
SG_LASER_RAY_CT = sprites/CSSB/laser_mines/laser_blue.spr
;Включить/выключить возможность доступа к прокачке скила "Лазерный выжигатель" (0 - все; 1 - ключ флага SG_FLAG_ACCESS_LASER)
SG_FLAG_ACCESS_LASER_ON_OFF = 0
;Флаг доступа дающий доступ к прокачке скила "Лазерный выжигатель"
SG_FLAG_ACCESS_LASER = t
;Ограничение скила "Лазерный выжигатель" на команду
SG_NUM_LASER = 3

;Настройки моделей
[Models]
;Основание сторожевый пушки
SG_MODELS_BASE = models/CSSB/sentry_v6/base.mdl
;Турель 1 уровня (террорист)
SG_MODELS_LVL_1_T = models/CSSB/sentry_v6/lvl_1_t.mdl
;Турель 2 уровня (террорист)
SG_MODELS_LVL_2_T = models/CSSB/sentry_v6/lvl_2_t.mdl
;Турель 3 уровня (террорист)
SG_MODELS_LVL_3_T = models/CSSB/sentry_v6/lvl_3_t.mdl
;Турель 4 уровня (террорист)
SG_MODELS_LVL_4_T = models/CSSB/sentry_v6/lvl_4_t.mdl
;Турель 5 уровня (террорист)
SG_MODELS_LVL_5_T = models/CSSB/sentry_v6/lvl_5_t.mdl
;Турель 1 уровня (коунтер-террорист)
SG_MODELS_LVL_1_CT = models/CSSB/sentry_v6/lvl_1_ct.mdl
;Турель 2 уровня (коунтер-террорист)
SG_MODELS_LVL_2_CT = models/CSSB/sentry_v6/lvl_2_ct.mdl
;Турель 3 уровня (коунтер-террорист)
SG_MODELS_LVL_3_CT = models/CSSB/sentry_v6/lvl_3_ct.mdl
;Турель 4 уровня (коунтер-террорист)
SG_MODELS_LVL_4_CT = models/CSSB/sentry_v6/lvl_4_ct.mdl
;Турель 5 уровня (коунтер-террорист)
SG_MODELS_LVL_5_CT = models/CSSB/sentry_v6/lvl_5_ct.mdl
;Ракеты
SG_MODELS_ROCKET = models/CSSB/sentry_v6/missile.mdl
;Взрыв от попадания ракеты в стену, пол...
SG_MODELS_GIBS = models/CSSB/sentry_v6/rockgibs.mdl

;Настройки звуков
[Sounds]
;Цель обнаружена
SG_SOUND_ALERT = CSSB/sentry_gun/alert_3.wav
SG_SOUND_ALERT_VOLUME = 0.3
;Стрельба
SG_SOUND_FIRE = CSSB/sentry_gun/fire_5.wav
SG_SOUND_FIRE_VOLUME = 0.7
;Создание пушки
SG_SOUND_BUILD = CSSB/sentry_gun/build_1.wav
SG_SOUND_BUILD_VOLUME = 1.0
;Вращение пушки из стороны в сторону
SG_SOUND_ROTATE = CSSB/sentry_gun/rotate_2.wav
SG_SOUND_ROTATE_VOLUME = 0.1
;Нельзя обновлять владельцу или повторно
SG_SOUND_FAIL_UPDATE = CSSB/sentry_gun/fail_update_2.wav
SG_SOUND_FAIL_UPDATE_VOLUME = 0.4
;Обновление уровня
SG_SOUND_TURRET_UP = CSSB/sentry_gun/turret_up_2.wav
SG_SOUND_TURRET_UP_VOLUME = 0.5
;Выстрел заряда (скил "Ураганный выстрел")
SG_SOUND_FIRE_CHARGE = CSSB/sentry_gun/fire_charge_1.wav
SG_SOUND_FIRE_CHARGE_VOLUME = 0.7
;Звук металла при стрельбе по пухе
SG_SOUND_METAL = CSSB/sentry_gun/metal_2.wav
SG_SOUND_METAL_VOLUME = 0.65
;Взрыв пушки при уничтожении
SG_SOUND_EXPLODE = CSSB/sentry_gun/sentry_exp.wav
SG_SOUND_EXPLODE_VOLUME = 0.5
;Запуск ракет
SG_SOUND_ROCKET_FIRE = CSSB/sentry_gun/rocketfire_1.wav
SG_SOUND_ROCKET_FIRE_VOLUME = 0.5
;Звук летящей ракеты
SG_SOUND_NUKE_FLY = CSSB/sentry_gun/nuke_fly.wav
SG_SOUND_NUKE_FLY_VOLUME = 0.3
;Звук разрывающейся ракеты
SG_SOUND_ROCKET_EXP = CSSB/sentry_gun/rocket_explosion.wav
SG_SOUND_ROCKET_EXP_VOLUME = 0.5
;Выстрел заряда (скил "Заморозка")
SG_SOUND_FREEZE_CHARGE = CSSB/sentry_gun/fire_charge_3.wav
SG_SOUND_FREEZE_CHARGE_VOLUME = 0.5
;Выстрел заряда (скил "Тесла")
SG_SOUND_TESLA_CHARGE = CSSB/sentry_gun/tesla_lightning_2.wav
SG_SOUND_TESLA_CHARGE_VOLUME = 0.5
;Звук лазера
SG_SOUND_LASER = CSSB/sentry_gun/laser_1.wav
SG_SOUND_LASER_VOLUME = 1.0
              

;Настройки моделей для VIP
[Models VIP]
;Вкл/выкл модели
SG_VIP_MODELS_ON_OFF = 1
;Флаг доступа дающий доступ к моделям
SG_VIP_MODELS_FLAG = t
;Турель 1 уровня (террорист)
SG_VIP_MODELS_LVL_1_T = models/CSSB/sentry_v5/lvl_1_t.mdl
;Турель 2 уровня (террорист)
SG_VIP_MODELS_LVL_2_T = models/CSSB/sentry_v5/lvl_2_t.mdl
;Турель 3 уровня (террорист)
SG_VIP_MODELS_LVL_3_T = models/CSSB/sentry_v5/lvl_3_t.mdl
;Турель 4 уровня (террорист)
SG_VIP_MODELS_LVL_4_T = models/CSSB/sentry_v5/lvl_4_t.mdl
;Турель 5 уровня (террорист)
SG_VIP_MODELS_LVL_5_T = models/CSSB/sentry_v5/lvl_5_t.mdl
;Турель 1 уровня (коунтер-террорист)
SG_VIP_MODELS_LVL_1_CT = models/CSSB/sentry_v5/lvl_1_ct.mdl
;Турель 2 уровня (коунтер-террорист)
SG_VIP_MODELS_LVL_2_CT = models/CSSB/sentry_v5/lvl_2_ct.mdl
;Турель 3 уровня (коунтер-террорист)
SG_VIP_MODELS_LVL_3_CT = models/CSSB/sentry_v5/lvl_3_ct.mdl
;Турель 4 уровня (коунтер-террорист)
SG_VIP_MODELS_LVL_4_CT = models/CSSB/sentry_v5/lvl_4_ct.mdl
;Турель 5 уровня (коунтер-террорист)
SG_VIP_MODELS_LVL_5_CT = models/CSSB/sentry_v5/lvl_5_ct.mdl
 
Последнее редактирование модератором:
Сообщения
58
Реакции
2
Помог
2 раз(а)
у него пушки не стабильны, я на основе пушек mirror реализовал свои
 
Сообщения
400
Реакции
147
Помог
11 раз(а)
pro100iweb, понятно. ты же где-то свои пушки выкладывал?! если не ошибаюсь?!
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу