VIP menu bug when night vip time

Сообщения
108
Реакции
17
Помог
2 раз(а)
Hello, i have problem with vip menu when come free vip time, appear every round double triple menus on screen how i can fix it. Thanks in advice.

Код:
/*************************************************************************************************
*  Возможности:
*  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        10.0               // Кол-во добавляемого HP за убийство в голову (выставить 0.0 если не надо добавлять, так как закомментировать нельзя)
#define ADDHP           5.0                // Кол-во добавляемого HP за убийство (выставить 0.0 если не надо добавлять, так как закомментировать нельзя)
#define MAXHP           100.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 g_DefaultFlag;
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 plugin_cfg() {
    new cvar = get_cvar_pointer("amx_default_access");
    if (cvar) {
        new flags[32];
        get_pcvar_string(cvar, flags, charsmax(flags));
        g_DefaultFlag = read_flags(flags);
    }
}

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 (checkTime(13, 23) && isUserVip(id) != VIP_ACCESS) {
        if (g_DefaultFlag) {
            remove_user_flags(id, g_DefaultFlag);
            set_user_flags(id, VIP_ACCESS);
        }
    }
    if(!isUserVip(id)) {
        return;
    }
    static szName[32];
    get_entvar(id, var_netname, szName, charsmax(szName));
#if defined SOUND_CONNECT
    client_cmd(0, "spk buttons/blip1.wav");
#endif
    client_print_color(0, print_team_default, "%s На сервер зашёл ^3VIP клиент ^1%s", PREFIX, szName);
}

bool:checkTime(iStart, iEnd) {
    new iHour; time(iHour);
    return bool:(iStart < iEnd ? (iStart <= iHour < iEnd) : (iStart <= iHour || iHour < iEnd))
}

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[] = { 90, 90, 30, 250 };
            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 Only VIP player can use this team!", PREFIX);
        return false;
    }
    if(!is_user_alive(id)) {
client_print_color (id, print_team_default, "%s To use this command you must be alive!", PREFIX);
        return false;
    }
    if(!g_iRoundCount) {
client_print_color (id, print_team_default," %s warm-up round. It is forbidden to use the team!", PREFIX);
        return false;
    }
    if(g_bUseWeapon[id]) {
client_print_color (id, print_team_default, "%s you already took a gun in this round!", PREFIX);
        return false;
    }
    if(g_iRoundCount < VIPROUND) {
client_print_color (id, print_team_default, "%s Weapons are only available with 3%d q1raund!", PREFIX, VIPROUND);
        return false;
    }
    return true;
}

public cmdSwitchDmg(id) {
    if(!isUserVip(id)) {
client_print_color (id, print_team_default, "%s This team can only be used by a VIP player," 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] ? "turned on": "disconnected");
client_print_color (id, print_team_default, "%s you're a 3%s z1dager for yourself", PREFIX, szSwitch);
    return PLUGIN_CONTINUE;
}
vKdrTKe.png
 

Download all Attachments

Сообщения
108
Реакции
17
Помог
2 раз(а)
Solved, thread can be locked
 

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

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