> > > > >

Проверка на VIP Round

Сообщения
37
Рейтинг
0
#1
Ребзя помогите добавить проверку, чтоб менюха автоматически не вылезала, если раунд меньше, чем VIPROUND.

Ситуация: стоят плагины [1.7] WarmUP Knife Round (разминка на ножах) и Re Vipka
с включенным автоматическим появлением оружейного меню.
После разминочного раунда происходит рестарт, но менюха начинает появляться или до или сразу после рестарта.
Но если набрать самому /vipmenu , то плагин говорит, что меню доступно только со 2 раунда :smile3:
Но так как менюха уже открыта, то випы могут себе брать оружие.
Не хотелось бы отключать автоматическое меню и раунд на ножах. Помогите добавить проверку :sorry:

C++:
/*************************************************************************************************

*  Возможности:

*  1. Префикс сообщений от плагина

*  2. VipMenu (vipmenu, /vipmenu) - оружия: ak47, m4a1, awp, пулемет.

*  3. Так же работают чат команды: /ak47, /m4a1, /awp, /b51.

*  4. AWP и Пулемет можно использовать с N раунда (настраивается).

*  5. Не работает на картах awp_, аim_, 35hp, fy_

*  6. Дополнительные HP за убийства (настраивается)

*  7. Автовыдача дигла при спавне (отключаемо), если включено можно выставить с N раунда (настраивается).

*  8. Автовыдача гранат при спавне (отключаемо), если включено можно выставить с N раунда (настраивается).

*  9. Выдача брони при спавне с N раунда (настраивается).

*  10. Выдача дефузов за кт при спавне с N раунда (настраивается).

*  11. Срок до конда с Admin Loader by Neugomon (отключаемо).

*  12. VIP статус в TAB (отключаемо).

*  13. Сообщение при подключении игрока.

*  14. Звук при заходе вип игрока (отключаемо).

*  15. Дамагер (отключаемо).

*  16. Переключение дамагера (setinfo) по команде в чат /damager

*************************************************************************************************/


#include <amxmodx>

#include <reapi>


#if AMXX_VERSION_NUM < 183

    #include <colorchat>

#endif


/* Конфигурационные defines */

#define VIP_ACCESS      ADMIN_LEVEL_H      // Флаг доступа VIP (по дефолту флаг "t" ADMIN_LEVEL_H)

#define PREFIX          "^1[^4VIP^1]^1"    // Префикс перед сообщениями ( ^1 - желтый ^3 - цвет команды ^4 - зеленый )

#define VIPROUND        2                  // C какого раунда можно открыть VIP меню

#define AWPM249RND      4                  // С какого раунда доступны AWP и пулемет

#define ADDHP_HS        15.0               // Кол-во добавляемого HP за убийство в голову (выставить 0.0 если не надо добавлять, так как закомментировать нельзя)

#define ADDHP           10.0                // Кол-во добавляемого HP за убийство (выставить 0.0 если не надо добавлять, так как закомментировать нельзя)

#define MAXHP           110.0              // Максимальное количество HP

#define VIPAUTODEAGLE                      // В начале каждого раунда давать Deagle (закомментируйте если не надо)

#define VIPAUTOGRENADE                     // Давать в начале каждого раунда гранаты (закомментируйте если не надо)

#define ROUND_NADES     1                  // С какого раунда давать гранаты (если раскомментировано VIPAUTOGRENADE иначе нет смысла менять работать не будет)

#define ROUND_DEAGLE    1                  // С какого раунда давать deagle (если раскомментировано VIPAUTODEAGLE иначе нет смысла менять работать не будет)

#define ROUND_ARMOR     1                  // С какого раунда давать броню

#define ROUND_DEFUSE    1                  // С какого раунда давать defuse kit

#define AUTOVIPMENU                        // Автоматически открывать в начале рануда Вип меню (выключено по дефолту)

#define VIPTAB                             // Показывать статус VIP в таблице на tab (закомментируйте если не надо)

// #define ADMIN_LOADER                       // Срок до конца с Admin Loader by Neugomon (закомментируйте если не надо)

#define SOUND_CONNECT                      // Звук при заходе вип игрока (раскомментируйте если надо)

#define DAMAGER                            // дамагер лесенкой (раскомментируйте если надо)

//#define FIFTH_ITEM                         // 5-й пункт в випке переключение дамагера по нажатию (раскомментируйте если надо + раскомментировать DAMAGER)

/* Конфигурационные defines */


#define isUserVip(%0) (get_user_flags(%0) & VIP_ACCESS)

#define IsPlayer(%1)  (1 <= %1 <= g_iMaxPlayers)


#if defined ADMIN_LOADER

    native admin_expired(index);

#endif


#if defined DAMAGER

    new const Float:g_fCoords[][] = { {0.52, 0.52}, {0.54, 0.54}, {0.56, 0.56}, {0.58, 0.58}, {0.60, 0.60}, {0.62, 0.62} };

    new g_iPlayerPos[33];

    new g_iSyncMsgDmg;

#endif


new g_iRoundCount;

new bool:g_bUseWeapon[33];

new bool:g_bBlockVip;

new bool:g_bUserVip[33];

new g_iSyncMsgAddHP;

new g_iMaxPlayers;

new g_bShow = true;

new g_isSwitchDmg[33] = {0, ...};

new g_szText[3] = "";


public plugin_init() {

    register_plugin("[ReAPI] Vip System", "1.4.1", "Dager* *.* -G-");

#if defined DAMAGER

    register_clcmd("say /damager", "cmdSwitchDmg");

    register_clcmd("say_team /damager", "cmdSwitchDmg");

#endif

    register_clcmd("say /vipmenu", "cmdVipMenu");

    register_clcmd("say_team /vipmenu", "cmdVipMenu");

    register_clcmd("vipmenu", "cmdVipMenu");

    register_clcmd("say", "hook_say");

    register_clcmd("say_team", "hook_say");

#if defined FIFTH_ITEM

    register_menucmd(register_menuid("VipMenu"), MENU_KEY_0|MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5, "VipMenuHandler");

#else

    register_menucmd(register_menuid("VipMenu"), MENU_KEY_0|MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4, "VipMenuHandler");

#endif

    RegisterHookChain(RG_CSGameRules_RestartRound, "CSGameRules_RestartRound_Pre", false);

    RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn", true);

    RegisterHookChain(RG_CBasePlayer_Killed, "CBasePlayer_Killed", true);

#if defined DAMAGER

    RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBasePlayer_TakeDamage", true);

#endif

    new szMapName[32], iMap_Prefix[][] = { "awp_", "aim_", "35hp", "fy_" };

    rh_get_mapname(szMapName, charsmax(szMapName));

    for(new i; i < sizeof iMap_Prefix; i++) {

        if(containi(szMapName, iMap_Prefix) != -1) {

            g_bBlockVip = true;

        }

    }

#if defined VIPTAB

    if(!get_member_game(m_bMapHasVIPSafetyZone)) {

        register_message(get_user_msgid("ScoreAttrib"), "msgScoreAttrib");

    }

#endif

#if defined DAMAGER

    g_iSyncMsgDmg = CreateHudSyncObj();

#endif

    g_iSyncMsgAddHP = CreateHudSyncObj();

    g_iMaxPlayers = get_member_game(m_nMaxPlayers);

}


#if defined VIPTAB

public msgScoreAttrib() {

    if(isUserVip(get_msg_arg_int(1)) && !get_msg_arg_int(2)) {

        set_msg_arg_int(2, ARG_BYTE, (1<<2));

    }

}

#endif


public CSGameRules_RestartRound_Pre() {

    if(get_member_game(m_bCompleteReset)) {

        g_iRoundCount = 0;

    }

    g_iRoundCount++;

    arrayset(g_bUseWeapon, false, sizeof g_bUseWeapon);

}


public client_putinserver(id) {

    if(g_bShow) {

        get_user_info(id, "_damager", g_szText, charsmax(g_szText));

        g_isSwitchDmg[id] = (g_szText[0]) ? str_to_num(g_szText) : 1;

    } else {

        g_isSwitchDmg[id] = 0;

    }

    if(!isUserVip(id)) {

        return;

    }

    static szName[32];

    get_entvar(id, var_netname, szName, charsmax(szName));

#if defined SOUND_CONNECT

    client_cmd(0, "spk IDEAL_VIP/ideal_sound.wav");

#endif

    client_print_color(0, print_team_default, "%s На сервер зашёл ^3VIP клиент ^1%s", PREFIX, szName);

}


public CBasePlayer_Killed(pevVictim, pevAttacker) {

    if(IsPlayer(pevVictim) && IsPlayer(pevAttacker) && isUserVip(pevAttacker) && pevVictim != pevAttacker) {

        static Float:attackerHp, Float:addHp;

        attackerHp = Float:get_entvar(pevAttacker, var_health);

        addHp = get_member(pevVictim, m_bHeadshotKilled) ? ADDHP_HS : ADDHP;

        attackerHp += addHp;

        set_entvar(pevAttacker, var_health, attackerHp > MAXHP ? MAXHP : attackerHp);

        if(attackerHp >= MAXHP) {

            return;

        }

        if(addHp > 0.0) {

            set_hudmessage(0, 255, 0, 0.6, 0.4, 2, 1.0, 1.5, 0.1, 0.3, -1);

            ShowSyncHudMsg(pevAttacker, g_iSyncMsgAddHP, "+%.0f hp", addHp);

        }

    }

    return;

}


#if defined DAMAGER

public CBasePlayer_TakeDamage(pevVictim, inflictor, pevAttacker, Float:damage) {

    if(!g_isSwitchDmg[pevAttacker] || !isUserVip(pevAttacker) || pevVictim == pevAttacker || get_member(pevVictim, m_iTeam) == get_member(pevAttacker, m_iTeam)) {

        return HC_CONTINUE;

    }

    if(IsPlayer(pevAttacker) && rg_is_player_can_takedamage(pevVictim, pevAttacker)) {

        static g_iDamage;

        g_iDamage = floatround(damage, floatround_floor);

        if(g_iDamage > 0) {

            static iPos;

            iPos = ++g_iPlayerPos[pevAttacker];

            if(iPos == sizeof(g_fCoords)) {

                iPos = g_iPlayerPos[pevAttacker] = 0;

            }

            set_hudmessage(0, 100, 200, Float:g_fCoords[iPos][0], Float:g_fCoords[iPos][1], 2, 0.5, 1.5, 0.02, 0.02, -1);

            ShowSyncHudMsg(pevAttacker, g_iSyncMsgDmg, "%d^n", g_iDamage);

        }

    }

    return HC_CONTINUE;

}

#endif


public CBasePlayer_Spawn(id) {

    if(g_bBlockVip || !is_user_alive(id)) {

        return 0;

    }

    if(isUserVip(id)) {

        g_bUserVip[id] = true;

    } else {

        return g_bUserVip[id] = false;

    }

#if defined VIPAUTOGRENADE

    if(g_iRoundCount >= ROUND_NADES) {

        rg_give_item(id, "weapon_hegrenade", GT_APPEND);

        rg_give_item(id, "weapon_flashbang", GT_APPEND);

        rg_give_item(id, "weapon_flashbang", GT_APPEND);

        rg_give_item(id, "weapon_smokegrenade", GT_APPEND);

    }

#endif

#if defined VIPAUTODEAGLE

    if(g_iRoundCount >= ROUND_DEAGLE) {

        rg_give_item(id, "weapon_deagle", GT_REPLACE);

        rg_set_user_bpammo(id, WEAPON_DEAGLE, 35);

    }

#endif

    if(g_iRoundCount >= ROUND_ARMOR) {

        rg_set_user_armor(id, 100, ARMOR_VESTHELM);

    }

    if(g_iRoundCount >= ROUND_DEFUSE) {

        new TeamName:team = get_member(id, m_iTeam);

        if(team == TEAM_CT) {

            rg_give_defusekit(id, true);

        }

    }

#if defined AUTOVIPMENU

    return cmdVipMenu(id);

#else

    return 0;

#endif

}


public hook_say(id) {

    static szMsg[128];

    read_args(szMsg, 127);

    remove_quotes(szMsg);

    if(szMsg[0] != '/') {

        return 0;

    }

    static const szChoosedWP[][] = { "/ak47", "/m4a1", "/awp", "/b51" };

    for(new i; i < sizeof szChoosedWP; i++) {

        if(!strcmp(szMsg, szChoosedWP)) {

            if(!isAllowToUse(id)) {

                break;

            }

            if(i > 1 && g_iRoundCount < AWPM249RND) {

                return client_print_color(id, 0, "%s Данное оружие доступно только с ^3%d ^1раунда!", PREFIX, AWPM249RND);

            }

            return VipMenuHandler(id, i);

        }

    }

    return 0;

}


public cmdVipMenu(id) {

    if(!isAllowToUse(id)) {

        return 0;

    }

    static szMenu[512], iLen, iKey;

    iKey = MENU_KEY_0;

#if defined ADMIN_LOADER

    new iExp = admin_expired(id);

    if(iExp > 0) {

        new sysTime = get_systime();

        if(iExp - sysTime > 0) {

            if((iExp - sysTime) / 86400 > 0) {

                iLen = formatex(szMenu, charsmax(szMenu), "\yVipMenu: \r[\y%d дн.\r]^n^n", ((iExp - sysTime) / 86400));

            } else {

                iLen = formatex(szMenu, charsmax(szMenu), "\yVipMenu: \r[\y%dч. %dмин.\r]^n^n", ((iExp - sysTime) / 3600), (((iExp - sysTime) / 60) - (((iExp - sysTime) / 3600) * 60)));

            }

        }

    } else if(iExp == 0) {

        iLen = formatex(szMenu, charsmax(szMenu), "\yVipMenu^n^n");

    }

#else

    iLen = formatex(szMenu, charsmax(szMenu), "\yVipMenu^n^n");

#endif

    iKey |= MENU_KEY_1|MENU_KEY_2;

    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r1. \wВзять \yAK47^n\r2. \wВзять \yM4A1^n");

    if(g_iRoundCount < AWPM249RND) {

        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r3. \dВзять AWP \r[c %d раунда]^n\r4. \dВзять Пулемет \r[c %d раунда]^n^n", AWPM249RND, AWPM249RND);

    } else {

        iKey |= MENU_KEY_3|MENU_KEY_4;

        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r3. \wВзять \yAWP^n\r4. \wВзять \yПулемет^n^n");

    }

#if defined FIFTH_ITEM

    iKey |= MENU_KEY_5;

    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r5. \wДамагер \r[\y%s\r]^n^n", g_isSwitchDmg[id] ? "Включен" : "Отключен");

#endif

    formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r0. \wВыход");

    show_menu(id, iKey, szMenu, -1, "VipMenu");

    return PLUGIN_HANDLED;

}


public VipMenuHandler(id, iKey) {

#if defined FIFTH_ITEM

    if(iKey > 4 || g_bUseWeapon[id]) {

        return 0;

    }

#else

    if(iKey > 3 || g_bUseWeapon[id]) {

        return 0;

    }

#endif

    switch(iKey) {

        case 0..3: {

            static const szChoosedBP[] = { 180, 180, 60, 500 };

            static const szChoosedWP[][] = { "weapon_ak47", "weapon_m4a1", "weapon_awp", "weapon_m249" };

            g_bUseWeapon[id] = true;

            return give_item_ex(id, szChoosedWP[iKey], szChoosedBP[iKey]);

        }

#if defined FIFTH_ITEM

        case 4: {

            g_isSwitchDmg[id] = (g_isSwitchDmg[id]) ? 0 : 1;

            num_to_str(g_isSwitchDmg[id], g_szText, charsmax(g_szText));

            client_cmd(id, "setinfo _damager %s", g_szText);

            return cmdVipMenu(id);

        }

#endif

    }

    return PLUGIN_HANDLED;

}


stock give_item_ex(id, currWeaponName[], ammoAmount) {

    rg_give_item(id, currWeaponName, GT_REPLACE);

    rg_set_user_bpammo(id, rg_get_weapon_info(currWeaponName, WI_ID), ammoAmount);

    engclient_cmd(id, currWeaponName);

    return PLUGIN_HANDLED;

}


bool:isAllowToUse(id) {

    if(!g_bUserVip[id]) {

        client_print_color(id, print_team_default, "%s Только VIP-игрок может пользоваться этой командой!", PREFIX);

        return false;

    }

    if(!is_user_alive(id)) {

        client_print_color(id, print_team_default, "%s Для использования данной команды вы должны быть живы!", PREFIX);

        return false;

    }

    if(!g_iRoundCount) {

        client_print_color(id, print_team_default, "%s Разминочный раунд. Запрещено пользоваться командой!", PREFIX);

        return false;

    }

//    if(g_bUseWeapon[id]) {

//        client_print_color(id, print_team_default, "%s Вы уже брали оружие в этом раунде!", PREFIX);

//        return false;

//    }

    if(g_iRoundCount < VIPROUND) {

        client_print_color(id, print_team_default, "%s Оружия доступны только с ^3%d ^1раунда!", PREFIX, VIPROUND);

        return false;

    }

    return true;

}


public cmdSwitchDmg(id) {

    if(!isUserVip(id)) {

        client_print_color(id, print_team_default, "%s Эту команду может использовать только VIP игрок", PREFIX);

        return 0;

    }

    g_isSwitchDmg[id] = (g_isSwitchDmg[id]) ? 0 : 1;

    num_to_str(g_isSwitchDmg[id], g_szText, charsmax(g_szText));

    client_cmd(id, "setinfo _damager %s", g_szText);

    new szSwitch[20];

    format(szSwitch, charsmax(szSwitch), "%s", g_isSwitchDmg[id] ? "включили" : "отключили");

    client_print_color(id, print_team_default, "%s Вы ^3%s ^1дамагер для себя", PREFIX, szSwitch);

    return PLUGIN_CONTINUE;

}
 
 
Сообщения
164
Рейтинг
40
#2
Ну для начала, нужно показывать, хоть какие-то свои попытки
11 Янв 2019
Начиная с 425 строки, замени :secret:
Код:
#if defined AUTOVIPMENU
    if(g_iRoundCount >= VIPROUND) return cmdVipMenu(id);

#else

    return 0;

#endif
11 Янв 2019
На будущее, если вы не можете сделать какое-либо продвижение по коду сами, вам сюда: ТЫК.
 
 
Сообщения
164
Рейтинг
40
#4
several, какая ошибка?
11 Янв 2019
У вас изначально не компилируется плагин:
Код:
//// comvip.sma
//
// C:\Users\666\Desktop\SCRIPTER\AMX-5235+Reapi-5.7.0.162\addons\amxmodx\scripting\comvip.sma(187) : error 048: array dimensions do not match
// C:\Users\666\Desktop\SCRIPTER\AMX-5235+Reapi-5.7.0.162\addons\amxmodx\scripting\comvip.sma(455) : error 048: array dimensions do not match
//
// 2 Errors.
// Could not locate output file C:\Users\666\Desktop\SCRIPTER\AMX-5235+Reapi-5.7.0.162\addons\amxmodx\scripting\compiled\comvip.amx (compile failed).
//
// Compilation Time: 0,81 sec
// ----------------------------------------

Press enter to exit ...
 
 
Сообщения
37
Рейтинг
0
#5
WILL_BE,
21312313131321.jpg

странно
11 Янв 2019
Вот эта компилируется 100%. Без ваших правок версия.

Видимо я добавил в теги на сайте и что-то нарушилось.


Код:
/*************************************************************************************************
*  Возможности:
*  1. Префикс сообщений от плагина
*  2. VipMenu (vipmenu, /vipmenu) - оружия: ak47, m4a1, awp, пулемет.
*  3. Так же работают чат команды: /ak47, /m4a1, /awp, /b51.
*  4. AWP и Пулемет можно использовать с N раунда (настраивается).
*  5. Не работает на картах awp_, аim_, 35hp, fy_
*  6. Дополнительные HP за убийства (настраивается)
*  7. Автовыдача дигла при спавне (отключаемо), если включено можно выставить с N раунда (настраивается).
*  8. Автовыдача гранат при спавне (отключаемо), если включено можно выставить с N раунда (настраивается).
*  9. Выдача брони при спавне с N раунда (настраивается).
*  10. Выдача дефузов за кт при спавне с N раунда (настраивается).
*  11. Срок до конда с Admin Loader by Neugomon (отключаемо).
*  12. VIP статус в TAB (отключаемо).
*  13. Сообщение при подключении игрока.
*  14. Звук при заходе вип игрока (отключаемо).
*  15. Дамагер (отключаемо).
*  16. Переключение дамагера (setinfo) по команде в чат /damager
*************************************************************************************************/

#include <amxmodx>
#include <reapi>

#if AMXX_VERSION_NUM < 183
    #include <colorchat>
#endif

/* Конфигурационные defines */
#define VIP_ACCESS      ADMIN_LEVEL_H      // Флаг доступа VIP (по дефолту флаг "t" ADMIN_LEVEL_H)
#define PREFIX          "^1[^4VIP^1]^1"    // Префикс перед сообщениями ( ^1 - желтый ^3 - цвет команды ^4 - зеленый )
#define VIPROUND        3                  // C какого раунда можно открыть VIP меню
#define AWPM249RND      4                  // С какого раунда доступны AWP и пулемет
#define ADDHP_HS        15.0               // Кол-во добавляемого HP за убийство в голову (выставить 0.0 если не надо добавлять, так как закомментировать нельзя)
#define ADDHP           10.0                // Кол-во добавляемого HP за убийство (выставить 0.0 если не надо добавлять, так как закомментировать нельзя)
#define MAXHP           110.0              // Максимальное количество HP
#define VIPAUTODEAGLE                      // В начале каждого раунда давать Deagle (закомментируйте если не надо)
#define VIPAUTOGRENADE                     // Давать в начале каждого раунда гранаты (закомментируйте если не надо)
#define ROUND_NADES     1                  // С какого раунда давать гранаты (если раскомментировано VIPAUTOGRENADE иначе нет смысла менять работать не будет)
#define ROUND_DEAGLE    1                  // С какого раунда давать deagle (если раскомментировано VIPAUTODEAGLE иначе нет смысла менять работать не будет)
#define ROUND_ARMOR     1                  // С какого раунда давать броню
#define ROUND_DEFUSE    1                  // С какого раунда давать defuse kit
#define AUTOVIPMENU                        // Автоматически открывать в начале рануда Вип меню (выключено по дефолту)
#define VIPTAB                             // Показывать статус VIP в таблице на tab (закомментируйте если не надо)
// #define ADMIN_LOADER                       // Срок до конца с Admin Loader by Neugomon (закомментируйте если не надо)
#define SOUND_CONNECT                      // Звук при заходе вип игрока (раскомментируйте если надо)
#define DAMAGER                            // дамагер лесенкой (раскомментируйте если надо)
//#define FIFTH_ITEM                         // 5-й пункт в випке переключение дамагера по нажатию (раскомментируйте если надо + раскомментировать DAMAGER)
/* Конфигурационные defines */

#define isUserVip(%0) (get_user_flags(%0) & VIP_ACCESS)
#define IsPlayer(%1)  (1 <= %1 <= g_iMaxPlayers)

#if defined ADMIN_LOADER
    native admin_expired(index);
#endif

#if defined DAMAGER
    new const Float:g_fCoords[][] = { {0.52, 0.52}, {0.54, 0.54}, {0.56, 0.56}, {0.58, 0.58}, {0.60, 0.60}, {0.62, 0.62} };
    new g_iPlayerPos[33];
    new g_iSyncMsgDmg;
#endif

new g_iRoundCount;
new bool:g_bUseWeapon[33];
new bool:g_bBlockVip;
new bool:g_bUserVip[33];
new g_iSyncMsgAddHP;
new g_iMaxPlayers;
new g_bShow = true;
new g_isSwitchDmg[33] = {0, ...};
new g_szText[3] = "";

public plugin_init() {
    register_plugin("[ReAPI] Vip System", "1.4.1", "Dager* *.* -G-");
#if defined DAMAGER
    register_clcmd("say /damager", "cmdSwitchDmg");
    register_clcmd("say_team /damager", "cmdSwitchDmg");
#endif
    register_clcmd("say /vipmenu", "cmdVipMenu");
    register_clcmd("say_team /vipmenu", "cmdVipMenu");
    register_clcmd("vipmenu", "cmdVipMenu");
    register_clcmd("say", "hook_say");
    register_clcmd("say_team", "hook_say");
#if defined FIFTH_ITEM
    register_menucmd(register_menuid("VipMenu"), MENU_KEY_0|MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5, "VipMenuHandler");
#else
    register_menucmd(register_menuid("VipMenu"), MENU_KEY_0|MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4, "VipMenuHandler");
#endif
    RegisterHookChain(RG_CSGameRules_RestartRound, "CSGameRules_RestartRound_Pre", false);
    RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn", true);
    RegisterHookChain(RG_CBasePlayer_Killed, "CBasePlayer_Killed", true);
#if defined DAMAGER
    RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBasePlayer_TakeDamage", true);
#endif
    new szMapName[32], iMap_Prefix[][] = { "awp_", "aim_", "35hp", "fy_" };
    rh_get_mapname(szMapName, charsmax(szMapName));
    for(new i; i < sizeof iMap_Prefix; i++) {
        if(containi(szMapName, iMap_Prefix[i]) != -1) {
            g_bBlockVip = true;
        }
    }
#if defined VIPTAB
    if(!get_member_game(m_bMapHasVIPSafetyZone)) {
        register_message(get_user_msgid("ScoreAttrib"), "msgScoreAttrib");
    }
#endif
#if defined DAMAGER
    g_iSyncMsgDmg = CreateHudSyncObj();
#endif
    g_iSyncMsgAddHP = CreateHudSyncObj();
    g_iMaxPlayers = get_member_game(m_nMaxPlayers);
}

#if defined VIPTAB
public msgScoreAttrib() {
    if(isUserVip(get_msg_arg_int(1)) && !get_msg_arg_int(2)) {
        set_msg_arg_int(2, ARG_BYTE, (1<<2));
    }
}
#endif

public CSGameRules_RestartRound_Pre() {
    if(get_member_game(m_bCompleteReset)) {
        g_iRoundCount = 0;
    }
    g_iRoundCount++;
    arrayset(g_bUseWeapon, false, sizeof g_bUseWeapon);
}

public client_putinserver(id) {
    if(g_bShow) {
        get_user_info(id, "_damager", g_szText, charsmax(g_szText));
        g_isSwitchDmg[id] = (g_szText[0]) ? str_to_num(g_szText) : 1;
    } else {
        g_isSwitchDmg[id] = 0;
    }
    if(!isUserVip(id)) {
        return;
    }
    static szName[32];
    get_entvar(id, var_netname, szName, charsmax(szName));
#if defined SOUND_CONNECT
    client_cmd(0, "spk IDEAL_VIP/ideal_sound.wav");
#endif
    client_print_color(0, print_team_default, "%s На сервер зашёл ^3VIP клиент ^1%s", PREFIX, szName);
}

public CBasePlayer_Killed(pevVictim, pevAttacker) {
    if(IsPlayer(pevVictim) && IsPlayer(pevAttacker) && isUserVip(pevAttacker) && pevVictim != pevAttacker) {
        static Float:attackerHp, Float:addHp;
        attackerHp = Float:get_entvar(pevAttacker, var_health);
        addHp = get_member(pevVictim, m_bHeadshotKilled) ? ADDHP_HS : ADDHP;
        attackerHp += addHp;
        set_entvar(pevAttacker, var_health, attackerHp > MAXHP ? MAXHP : attackerHp);
        if(attackerHp >= MAXHP) {
            return;
        }
        if(addHp > 0.0) {
            set_hudmessage(0, 255, 0, 0.6, 0.4, 2, 1.0, 1.5, 0.1, 0.3, -1);
            ShowSyncHudMsg(pevAttacker, g_iSyncMsgAddHP, "+%.0f hp", addHp);
        }
    }
    return;
}

#if defined DAMAGER
public CBasePlayer_TakeDamage(pevVictim, inflictor, pevAttacker, Float:damage) {
    if(!g_isSwitchDmg[pevAttacker] || !isUserVip(pevAttacker) || pevVictim == pevAttacker || get_member(pevVictim, m_iTeam) == get_member(pevAttacker, m_iTeam)) {
        return HC_CONTINUE;
    }
    if(IsPlayer(pevAttacker) && rg_is_player_can_takedamage(pevVictim, pevAttacker)) {
        static g_iDamage;
        g_iDamage = floatround(damage, floatround_floor);
        if(g_iDamage > 0) {
            static iPos;
            iPos = ++g_iPlayerPos[pevAttacker];
            if(iPos == sizeof(g_fCoords)) {
                iPos = g_iPlayerPos[pevAttacker] = 0;
            }
            set_hudmessage(0, 100, 200, Float:g_fCoords[iPos][0], Float:g_fCoords[iPos][1], 2, 0.5, 1.5, 0.02, 0.02, -1);
            ShowSyncHudMsg(pevAttacker, g_iSyncMsgDmg, "%d^n", g_iDamage);
        }
    }
    return HC_CONTINUE;
}
#endif

public CBasePlayer_Spawn(id) {
    if(g_bBlockVip || !is_user_alive(id)) {
        return 0;
    }
    if(isUserVip(id)) {
        g_bUserVip[id] = true;
    } else {
        return g_bUserVip[id] = false;
    }
#if defined VIPAUTOGRENADE
    if(g_iRoundCount >= ROUND_NADES) {
        rg_give_item(id, "weapon_hegrenade", GT_APPEND);
        rg_give_item(id, "weapon_flashbang", GT_APPEND);
        rg_give_item(id, "weapon_flashbang", GT_APPEND);
        rg_give_item(id, "weapon_smokegrenade", GT_APPEND);
    }
#endif
#if defined VIPAUTODEAGLE
    if(g_iRoundCount >= ROUND_DEAGLE) {
        rg_give_item(id, "weapon_deagle", GT_REPLACE);
        rg_set_user_bpammo(id, WEAPON_DEAGLE, 35);
    }
#endif
    if(g_iRoundCount >= ROUND_ARMOR) {
        rg_set_user_armor(id, 100, ARMOR_VESTHELM);
    }
    if(g_iRoundCount >= ROUND_DEFUSE) {
        new TeamName:team = get_member(id, m_iTeam);
        if(team == TEAM_CT) {
            rg_give_defusekit(id, true);
        }
    }
#if defined AUTOVIPMENU
    return cmdVipMenu(id);
#else
    return 0;
#endif
}

public hook_say(id) {
    static szMsg[128];
    read_args(szMsg, 127);
    remove_quotes(szMsg);
    if(szMsg[0] != '/') {
        return 0;
    }
    static const szChoosedWP[][] = { "/ak47", "/m4a1", "/awp", "/b51" };
    for(new i; i < sizeof szChoosedWP; i++) {
        if(!strcmp(szMsg, szChoosedWP[i])) {
            if(!isAllowToUse(id)) {
                break;
            }
            if(i > 1 && g_iRoundCount < AWPM249RND) {
                return client_print_color(id, 0, "%s Данное оружие доступно только с ^3%d ^1раунда!", PREFIX, AWPM249RND);
            }
            return VipMenuHandler(id, i);
        }
    }
    return 0;
}

public cmdVipMenu(id) {
    if(!isAllowToUse(id)) {
        return 0;
    }
    static szMenu[512], iLen, iKey;
    iKey = MENU_KEY_0;
#if defined ADMIN_LOADER
    new iExp = admin_expired(id);
    if(iExp > 0) {
        new sysTime = get_systime();
        if(iExp - sysTime > 0) {
            if((iExp - sysTime) / 86400 > 0) {
                iLen = formatex(szMenu, charsmax(szMenu), "\yVipMenu: \r[\y%d дн.\r]^n^n", ((iExp - sysTime) / 86400));
            } else {
                iLen = formatex(szMenu, charsmax(szMenu), "\yVipMenu: \r[\y%dч. %dмин.\r]^n^n", ((iExp - sysTime) / 3600), (((iExp - sysTime) / 60) - (((iExp - sysTime) / 3600) * 60)));
            }
        }
    } else if(iExp == 0) {
        iLen = formatex(szMenu, charsmax(szMenu), "\yVipMenu^n^n");
    }
#else
    iLen = formatex(szMenu, charsmax(szMenu), "\yVipMenu^n^n");
#endif
    iKey |= MENU_KEY_1|MENU_KEY_2;
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r1. \wВзять \yAK47^n\r2. \wВзять \yM4A1^n");
    if(g_iRoundCount < AWPM249RND) {
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r3. \dВзять AWP \r[c %d раунда]^n\r4. \dВзять Пулемет \r[c %d раунда]^n^n", AWPM249RND, AWPM249RND);
    } else {
        iKey |= MENU_KEY_3|MENU_KEY_4;
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r3. \wВзять \yAWP^n\r4. \wВзять \yПулемет^n^n");
    }
#if defined FIFTH_ITEM
    iKey |= MENU_KEY_5;
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r5. \wДамагер \r[\y%s\r]^n^n", g_isSwitchDmg[id] ? "Включен" : "Отключен");
#endif
    formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r0. \wВыход");
    show_menu(id, iKey, szMenu, -1, "VipMenu");
    return PLUGIN_HANDLED;
}

public VipMenuHandler(id, iKey) {
#if defined FIFTH_ITEM
    if(iKey > 4 || g_bUseWeapon[id]) {
        return 0;
    }
#else
    if(iKey > 3 || g_bUseWeapon[id]) {
        return 0;
    }
#endif
    switch(iKey) {
        case 0..3: {
            static const szChoosedBP[] = { 180, 180, 60, 500 };
            static const szChoosedWP[][] = { "weapon_ak47", "weapon_m4a1", "weapon_awp", "weapon_m249" };
            g_bUseWeapon[id] = true;
            return give_item_ex(id, szChoosedWP[iKey], szChoosedBP[iKey]);
        }
#if defined FIFTH_ITEM
        case 4: {
            g_isSwitchDmg[id] = (g_isSwitchDmg[id]) ? 0 : 1;
            num_to_str(g_isSwitchDmg[id], g_szText, charsmax(g_szText));
            client_cmd(id, "setinfo _damager %s", g_szText);
            return cmdVipMenu(id);
        }
#endif
    }
    return PLUGIN_HANDLED;
}

stock give_item_ex(id, currWeaponName[], ammoAmount) {
    rg_give_item(id, currWeaponName, GT_REPLACE);
    rg_set_user_bpammo(id, rg_get_weapon_info(currWeaponName, WI_ID), ammoAmount);
    engclient_cmd(id, currWeaponName);
    return PLUGIN_HANDLED;
}

bool:isAllowToUse(id) {
    if(!g_bUserVip[id]) {
        client_print_color(id, print_team_default, "%s Только VIP-игрок может пользоваться этой командой!", PREFIX);
        return false;
    }
    if(!is_user_alive(id)) {
        client_print_color(id, print_team_default, "%s Для использования данной команды вы должны быть живы!", PREFIX);
        return false;
    }
    if(!g_iRoundCount) {
        client_print_color(id, print_team_default, "%s Разминочный раунд. Запрещено пользоваться командой!", PREFIX);
        return false;
    }
//    if(g_bUseWeapon[id]) {
//        client_print_color(id, print_team_default, "%s Вы уже брали оружие в этом раунде!", PREFIX);
//        return false;
//    }
    if(g_iRoundCount < VIPROUND) {
        client_print_color(id, print_team_default, "%s Оружия доступны только с ^3%d ^1раунда!", PREFIX, VIPROUND);
        return false;
    }
    return true;
}

public cmdSwitchDmg(id) {
    if(!isUserVip(id)) {
        client_print_color(id, print_team_default, "%s Эту команду может использовать только VIP игрок", PREFIX);
        return 0;
    }
    g_isSwitchDmg[id] = (g_isSwitchDmg[id]) ? 0 : 1;
    num_to_str(g_isSwitchDmg[id], g_szText, charsmax(g_szText));
    client_cmd(id, "setinfo _damager %s", g_szText);
    new szSwitch[20];
    format(szSwitch, charsmax(szSwitch), "%s", g_isSwitchDmg[id] ? "включили" : "отключили");
    client_print_color(id, print_team_default, "%s Вы ^3%s ^1дамагер для себя", PREFIX, szSwitch);
    return PLUGIN_CONTINUE;
}
 
 
Сообщения
164
Рейтинг
40
#6
several,
Код:
#if defined AUTOVIPMENU
    if(g_iRoundCount >= VIPROUND) {
        return cmdVipMenu(id);
    }
    else return 0;
#else
    return 0;
#endif
}
 
 
Сообщения
164
Рейтинг
40
#8
Попробуйте прибавить на 1-2 раунд(-a) AUTOVIPMENU
11 Янв 2019
И думаю, на время WarmUP'a стоит отключить VIP систему :blush2:
 
 
Сообщения
37
Рейтинг
0
#9
Попробуйте прибавить на 1-2 раунд(-a) AUTOVIPMENU
Попробовал добавить 1 раунд
Код:
#define VIPROUND        3                  // C какого раунда можно открыть VIP меню
Теперь после пистолетки, на следующий раунд меню не открывается, открывается только на следующий после него раунд.
Похоже дело в том, что после того как закончился knife раунд, как бы начинается следующий раунд и сразу происходит рестарт. А плагин отсчет раундов начинает вести без учета рестарта ((
 
 
Сообщения
37
Рейтинг
0
#11
WILL_BE, щас попробую вот эту переделку поставить https://dev-cs.ru/threads/2037/post-23008
11 Янв 2019
В общем не очень переделка. ДМ мод какой-то, который не получилось выключить, закомментировать строку пробую и не компилируется.

В первом плагине можно как-то отключить вип на время разминки?

Пытаюсь по аналогии с переделанного плагина вытянуть эту функцию

Нахожу вот такое:

Код:
#define STOP_PLUGS        // Отключать плагины на время разминки

#if defined STOP_PLUGS
    new g_arPlugins[][] =    // Указывать название плагинов, например test.amxx
    {
        "test.amxx",
        "test2.amxx"
    }
#endif

вставляю и не компилится. в общем я понимаю, что я что-то не так делаю, только что именно ?

всю голову сломал уже с этими двумя плагинами =(((
11 Янв 2019
Да и не факт, что выключив випку всё будет как надо работать. Беда, одним словом.
 
Последнее редактирование:
 
Сообщения
34
Рейтинг
8
#12
Тут либо на паузу ставить плагин вип во время разминки, либо добавить в плагин вип отлов рестартов, но это уже к скриптерам.
 
 
Сообщения
37
Рейтинг
0
#13
Вроде всё ок стало с менюшкой в этом плагине.

Код:
#include <amxmodx>
#include <reapi>

#define TIME_RR     40    // Время разминки
#define NUM_RR        1    // Кол-во рестартов
#define LATENCY        1.5    // Задержка между рестартами
#define PROTECTED     0    // Сколько секунд действует защита после возрождения, 0 - отключить (актуально для DM_MODE)
// отключаемо //
//#define SOUND            // Музыка под час разминки
#define STOP_PLUGS        // Отключать плагины на время разминки
#define DM_MODE     0       // Бесконечный респавн на время разминки
#define OFF_RR            // Отключать этот плагин на указанных картах
//#define BLOCK           // Запрет поднятия оружия с земли [по умолчанию выкл.]
//#define STOP_STATS      // Отключать запись статистики на время разминки (Работает только с измененным CSStatsX SQL by serfreeman1337) [по умолчанию выкл.]

#if defined SOUND
new const soundRR[] = "sound/rr/RoundStart.mp3"; // Указывать путь и название файла, например sound/serv/music.mp3
#endif
#if defined STOP_STATS
native stats_set_enabled(params_num)
#endif
#if defined STOP_PLUGS
    new g_arPlugins[][] =    // Указывать название плагинов, например test.amxx
    {
        "re_vipka.amxx",
        "aes_statsx_cstrike.amxx"
    }
#endif
new g_iHudSync;
new g_szWeapon[32];
new HookChain:fwd_NewRound,
    HookChain:fwd_Spawn,
    HookChain:fwd_GiveC4,
#if defined BLOCK
    HookChain:fwd_BlockEntity,
#endif
#if defined DM_MODE
    HookChain:fwd_Killed;
#endif

const TASK_PROTECTION_ID = 33464;

public plugin_init()
{
    register_plugin("[ReAPI] Random Weapons WarmUP", "2.4.4", "neugomon");

    RegisterHookChain(RG_RoundEnd, "fwdRoundEnd", true);
    DisableHookChain(fwd_NewRound = RegisterHookChain(RG_CSGameRules_CheckMapConditions, "fwdRoundStart", true));
    DisableHookChain(fwd_Spawn    = RegisterHookChain(RG_CBasePlayer_Spawn, "fwdPlayerSpawnPost", true));
    DisableHookChain(fwd_GiveC4   = RegisterHookChain(RG_CSGameRules_GiveC4, "fwdGiveC4", false));
#if defined BLOCK
    DisableHookChain(fwd_BlockEntity = RegisterHookChain(RG_CBasePlayer_HasRestrictItem, "fwdHasRestrictItemPre", false));
    register_clcmd("drop", "ClCmd_Drop");
#endif
#if defined DM_MODE
    DisableHookChain(fwd_Killed   = RegisterHookChain(RG_CBasePlayer_Killed, "fwdPlayerKilledPost", true));
    g_iHudSync    = CreateHudSyncObj();
    register_clcmd("joinclass", "clCmdJoinClass");
    register_clcmd("menuselect","clCmdJoinClass");
#endif
    state warmupOff;   
#if defined OFF_RR
    new sPref[][] = { "awp_", "aim_", "fy_", "$", "cs_", "35hp" }; // Указывать префиксы карт
    new map[32]; get_mapname(map, charsmax(map));
    for(new i; i < sizeof sPref; i++)
    {
        if(containi(map, sPref[i]) != -1)
        {
            pause("ad");
            return;
        }
    }   
#endif   
}
#if defined BLOCK
public fwdHasRestrictItemPre() {
    SetHookChainReturn(ATYPE_INTEGER, true);
    return HC_SUPERCEDE;
}

public ClCmd_Drop() <warmupOff>
    return PLUGIN_CONTINUE;
  
public ClCmd_Drop() <warmupOn>
    return PLUGIN_HANDLED;
#endif
public client_putinserver(id)
{
    remove_task(id + TASK_PROTECTION_ID)
}
#if defined SOUND
public plugin_precache()
{
        precache_generic(soundRR);
}
#endif
public fwdRoundEnd(WinStatus:status, ScenarioEventEndRound:event, Float:tmDelay)
    if(event == ROUND_GAME_COMMENCE)
        EnableHookChain(fwd_NewRound);

public fwdRoundStart()
{
    state warmupOn;
  
#if defined SOUND
    client_cmd(0, "mp3 play ^"%s^"", soundRR);
#endif
  
    DisableHookChain(fwd_NewRound);
    EnableHookChain(fwd_Spawn);
    EnableHookChain(fwd_GiveC4);
#if defined STOP_STATS
    stats_set_enabled(0);
#endif
    set_cvar_string("mp_round_infinite", "1");
#if defined BLOCK
    EnableHookChain(fwd_BlockEntity);
#endif
#if defined DM_MODE   
    EnableHookChain(fwd_Killed);
#endif   
#if defined STOP_PLUGS   
    PluginController(1);
#endif
    set_task(1.0, "ShowTimer", .flags = "a", .repeat = TIME_RR);
}
#if defined DM_MODE
public clCmdJoinClass(id) <warmupOff>
    return;
  
public clCmdJoinClass(id) <warmupOn>
    if(get_member(id, m_iMenu) == Menu_ChooseAppearance)
        set_task(0.5, "SpawnPlayer", id);
#endif
public fwdPlayerSpawnPost(const id)
{
    if(!is_user_alive(id))
        return;

    BuyZone_ToogleSolid(SOLID_NOT);
    SetProtection(id)
    rg_remove_all_items(id);
    set_member_game(m_bMapHasBuyZone, true);

    rg_give_item(id, "weapon_knife");
}
#if defined DM_MODE
public fwdPlayerKilledPost(pVictim)
    set_task(1.0, "SpawnPlayer", pVictim);
#endif
public fwdGiveC4()
{
    return HC_SUPERCEDE
}

public ShowTimer()
{
    static timer = -1;
    if(timer == -1) timer = TIME_RR;
  
    switch(--timer)
    {
        case 0:
        {
            state warmupOff;
          
            BuyZone_ToogleSolid(SOLID_TRIGGER);
            DisableHookChain(fwd_Spawn);
            DisableHookChain(fwd_GiveC4);
        #if defined STOP_STATS
            stats_set_enabled(1);
        #endif
            set_cvar_string("mp_round_infinite", "0");
        #if defined BLOCK
            DisableHookChain(fwd_BlockEntity);
        #endif
        #if defined DM_MODE   
            DisableHookChain(fwd_Killed);
        #endif
        #if defined STOP_PLUGS   
            PluginController(0);
        #endif   
        #if NUM_RR > 1       
            set_task(LATENCY, "SV_Restart", .flags = "a", .repeat = NUM_RR);
        #else
            SV_Restart();
        #endif
            timer = -1;
        }
        default:
        {
        #if defined STOP_STATS
            set_hudmessage(255, 0, 0, .x = -1.0, .y = 0.05, .holdtime = 0.9, .channel = -1);
            show_hudmessage(0, "[Статистика Отключена]");
        #endif
            set_hudmessage(135, 206, 235, .x = -1.0, .y = 0.08, .holdtime = 0.9, .channel = -1);
            ShowSyncHudMsg(0, g_iHudSync, "Разминка на %s!^nРестарт через %d сек", g_szWeapon, timer);
        }
    }
}

public SV_Restart()
{
    set_cvar_num("sv_restart", 1);
    set_task(2.0, "End_RR");
}

public End_RR()
{
#if defined STOP_STATS
    set_hudmessage(255, 0, 0, .x = -1.0, .y = 0.05, .holdtime = 5.0, .channel = -1);
    show_hudmessage(0, "[Статистика Включена]");
#endif
    set_hudmessage(135, 206, 235, .x = -1.0, .y = 0.08, .holdtime = 5.0, .channel = -1);
    show_hudmessage(0, "Разминка окончена!");
}
#if defined DM_MODE   
public SpawnPlayer(id)
{
    if(!is_user_connected(id))
        return;
    if(is_user_alive(id))
        return;
  
    switch(get_member(id, m_iTeam))
    {
        case 1, 2: rg_round_respawn(id);
    }
}
#endif

public SetProtection(id)
{
    set_entvar(id, var_takedamage, DAMAGE_NO)

    switch(get_member(id, m_iTeam))
    {
        case TEAM_TERRORIST: rg_set_rendering(id, kRenderFxGlowShell, 255, 0, 0, 10);
        case TEAM_CT: rg_set_rendering(id, kRenderFxGlowShell, 0, 0, 255, 10);
    }

    remove_task(TASK_PROTECTION_ID + id)
    set_task( PROTECTED.0, "EndProtection", TASK_PROTECTION_ID + id)
}

public EndProtection(TaskID)
{
    new id = TaskID - TASK_PROTECTION_ID

    if(!is_user_connected(id))
        return

    set_entvar(id, var_takedamage, DAMAGE_AIM)
    rg_set_rendering(id)
}

stock rg_set_rendering(index, fx = kRenderFxNone, r=255, g=255, b=255, amount=16)
{
    new Float:RenderColor[3]
    RenderColor[0] = float(r)
    RenderColor[1] = float(g)
    RenderColor[2] = float(b)
  
    set_entvar(index, var_renderfx, fx)
    set_entvar(index, var_rendercolor, RenderColor)
    set_entvar(index, var_renderamt, float(amount))
}

stock PluginController(stop)
{
    for(new i; i < sizeof g_arPlugins; i++)
    {
        if(stop)pause  ("ac", g_arPlugins[i]);
        else    unpause("ac", g_arPlugins[i]);
    }   
}

stock BuyZone_ToogleSolid(const solid)
{
    new entityIndex = 0;
    while ((entityIndex = rg_find_ent_by_class(entityIndex, "func_buyzone")))
        set_entvar(entityIndex, var_solid, solid);
}
Только как отключить DM MOD?
Код:
#define DM_MODE     0
не помогает
закомментировать строку если, то не компилируется.
 
 

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

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

Похожие темы

> > > > >