Иконка ресурса

Add-on CMSRanks Bonus 1.1.0

Нет прав для скачивания
C++:
#include <amxmodx>
#include <cmsstats_ranks>
#include <cmsstats_mysql>
#include <reapi>

enum _:eExtBonuses
{
    bonusM4A1 = 6,
    bonusAK,
    bonusAWP,
    bonusM249,
    bonus10000,
    bonus100hp,
    bonusAllGrens,
    bonusMegaGren,
    bonusMegaDgl,
    bonusAddDmg,
    bonusReduceDmg,
    bonusRespawn,
    bonusRefillAmmo,
    bonusSpeedUp
};

#define MENU_EMPTY_STRING             {"",0,0,0,0,0,0},
#define IsBonusItemAllow(%0,%1)        (aPlayerRest[%0][%1] < cmsranks_get_gameround())
#define IsBonusActive(%0,%1)        (aPlBonusDuration[%0][%1] >= cmsranks_get_gameround())
#define IsValidPlayer(%0)             (0 < %0 <= MaxClients)

/* =================    Добавление и настройка бонусов    ========================================================*/


new const arrBonuses[][][] ={
//        название                        идентификатор         с какого раунда стоимость    мин. кол-во        мин. уровень        на сколько раундов
//                                        (уникальный номер)    доступен пункт                на сервере        игрока (звание)        блокировать пункт
{"\wM4A1+\yDEAGLE\r+Броня",                 bonusM4A1,             3,                5,             1,                 0,                         1},
{"\wAK47+\yDEAGLE\r+Броня",                 bonusAK,             3,                5,             1,                 1,                        1},
{"\wAWP+\yDEAGLE\r+Броня",                     bonusAWP,             3,                7,             1,                 3,                        1},
{"\wM249+\y500Ammo\r+Броня",                 bonusM249,             3,                10,         1,                 5,                        1},

{"\yВзять \r10.000\y$",                     bonus10000,         3,                10,         2,                 7,                        2},
{"\yВзять \w100\rHP",                         bonus100hp,         3,                10,         4,                 9,                        4},
{"\yВзять \rгранаты",                         bonusAllGrens,         3,                12,         3,                 11,                        3},

MENU_EMPTY_STRING        //пустая строка в меню

{"Мега граната | \yурон \r+200%",             bonusMegaGren,         3,                20,         5,                 13,                        5},
{"Мега \rDEAGLE | \yурон \r+35%",             bonusMegaDgl,         3,                24,         2,                 15,                        5},
{"\d[1 раунд] \wУскорение \r+5%",             bonusSpeedUp,         3,                21,         2,                 17,                        3},
{"\d[3 раунда] \wИсходящий урон \r+2%",     bonusAddDmg,         3,                58,         2,                 21,                        3},
{"\d[3 раунда] \wВходящий урон \r-2%",         bonusReduceDmg,     3,                62,         2,                 23,                        3},
{"\d[3 раунда] \yВосстановление \rобоймы",     bonusRefillAmmo,     3,                54,         2,                 19,                        3},
{"\d[1/5раундов] \yВозрождение",             bonusRespawn,         3,                100,         2,                 25,                        5}

};
/*
"ultimate_ak47"                        "50"       ""            ""         "15"      "2"         "\wВзять \yGOLD \rAK47"
"ultimate_m4a1"                        "50"       ""            ""         "15"      "2"         "\wВзять \yGOLD \rM4A1"
*/

/* ============================================================================================================*/


enum (+=1223)
{
    UID_MEGA_GREN = 1223,
    UID_MEGA_DEAGLE
}

new aPlayerRest[MAX_PLAYERS + 1][eExtBonuses];        //учет использования пунктов для их блокировки в меню
new aPlBonusDuration[MAX_PLAYERS + 1][eExtBonuses];    //учет активности бонусов

public plugin_init()
{
    register_plugin("CMSRanks Bonus", "1.0.0", "cs-games.club");
}

public OnCmsStatsInitializedPost(Handle:Tuple)
{
    for(new i, iSize= sizeof(arrBonuses); i < iSize; i++)
        cmsranks_add_bonusmenu_item(arrBonuses[i][1][0], arrBonuses[i][0], arrBonuses[i][2][0], arrBonuses[i][3][0], arrBonuses[i][4][0],
            arrBonuses[i][5][0], arrBonuses[i][6][0]);

    RegisterHookChain(RG_CBasePlayer_TakeDamage, "RGCBasePlayer_TakeDamage", .post = false);
    RegisterHookChain(RG_CBasePlayer_ResetMaxSpeed, "RGCBasePlayer_ResetMaxSpeed", .post = false);
}

public OnCMSRanksBonusMenuAction(eBonusMenuAction:iAction, iClient, iMenu, iItem, aBonusData[eBonuses])
{
    new iBonusId = aBonusData[BONUS_ITEM_ID];
    if(iBonusId > BONUS_MENU_ITEM_HP)
    {
        switch(iAction)
        {
            case BONUS_MENU_ITEM_STATUS:        //отловим функцию получения статуса пункта, чтобы сделать его неактивным
            {
                if(IsBonusActive(iClient, iBonusId))
                {
                    menu_item_setname(iMenu, iItem, fmt("%s /r[*]", aBonusData[BONUS_NAME]));
                    return ITEM_DISABLED;
                }

                if(!IsBonusItemAllow(iClient, iBonusId))    //если игрок уже использовал пункт
                    return ITEM_DISABLED;                        //то сделаем пункт неактивным
              
                if(iBonusId == bonusRespawn && is_user_alive(iClient))
                    return ITEM_DISABLED;
              
                return ITEM_IGNORE;                        //иначе, проигнорируем
            }
            case BONUS_MENU_CHOOSE_ITEM:        //отловим функцию выбора игроком пункта меню бонусов
            {
                new iRound = cmsranks_get_gameround();

                switch(iBonusId)
                {
                    case bonusM4A1:    //\wM4A1+\yDEAGLE\r+Броня
                    {
                        rg_give_item(iClient, "weapon_m4a1", GT_DROP_AND_REPLACE);
                        rg_give_item(iClient, "weapon_deagle", GT_DROP_AND_REPLACE);
                        rg_set_user_armor(iClient, 100, ARMOR_VESTHELM);
                    }
                    case bonusAK:    //\wAK47+\yDEAGLE\r+Броня"
                    {
                        rg_give_item(iClient, "weapon_ak47", GT_DROP_AND_REPLACE);
                        rg_give_item(iClient, "weapon_deagle", GT_DROP_AND_REPLACE);
                        rg_set_user_armor(iClient, 100, ARMOR_VESTHELM);
                    }
                    case bonusAWP:    //\wAWP+\yDEAGLE\r+Броня
                    {
                        rg_give_item(iClient, "weapon_awp", GT_DROP_AND_REPLACE);
                        rg_give_item(iClient, "weapon_deagle", GT_DROP_AND_REPLACE);
                        rg_set_user_armor(iClient, 100, ARMOR_VESTHELM);
                    }
                    case bonusM249:    //\wM249+\y500Ammo\r+Броня
                    {
                        rg_give_item(iClient, "weapon_m249", GT_DROP_AND_REPLACE);
                        rg_set_user_bpammo(iClient, WEAPON_M249, 500);
                        rg_set_user_armor(iClient, 100, ARMOR_VESTHELM);
                    }
                    case bonus10000:    //\yВзять \r10.000\y$
                    {
                        rg_add_account(iClient, 10000);
                    }
                    case bonus100hp:    //\yВзять \w100\rHP
                    {
                        set_entvar(iClient, var_health, Float:get_entvar(iClient, var_health) + 100.0);
                    }
                    case bonusAllGrens:    //\yВзять \rгранаты
                    {
                        if(rg_give_item(iClient, "weapon_hegrenade") == -1 &&
                            rg_give_item(iClient, "weapon_flashbang") == -1 &&
                            rg_give_item(iClient, "weapon_smokegrenade") == -1)
                         return PLUGIN_HANDLED;
                    }
                    case bonusMegaGren:    //Мега граната | \yурон \r+200%
                    {
                        if(rg_give_custom_item(iClient, "weapon_hegrenade", .uid = UID_MEGA_GREN) == -1)
                            return PLUGIN_HANDLED;
                    }
                    case bonusMegaDgl:    //Мега \rDEAGLE | \yурон \r+35%
                    {
                        if(rg_give_custom_item(iClient, "weapon_deagle", .uid = UID_MEGA_DEAGLE) == -1)
                            return PLUGIN_HANDLED;
                    }
                    case bonusAddDmg, bonusReduceDmg, bonusRefillAmmo:
                    {
                        aPlBonusDuration[iClient][iBonusId] = iRound + 3;    //запишем номер раунда, до которого бонус активен
                    }
                    case bonusRespawn:
                    {
                        rg_round_respawn(iClient);
                    }
                    case bonusSpeedUp:
                    {
                        set_entvar(iClient, var_maxspeed, Float:get_entvar(iClient, var_maxspeed) * 1.05);
                    }  
                }

                aPlayerRest[iClient][iBonusId] = iRound + aBonusData[BONUS_RESTRICT_ROUND];    //запишем номер следующего раунда, в котором пункт станет доступным
            }
        }
    }

    return PLUGIN_CONTINUE;
}

public RGCBasePlayer_TakeDamage(const pPlayer, const pInflictor, const pAttacker, const Float:flDamage, const bitsDamageType)
{
    if(pPlayer == pAttacker || !IsValidPlayer(pAttacker))
        return HC_CONTINUE;

    new iUIDWeapon;
    if(pInflictor == pAttacker)
    {
        if(bitsDamageType & DMG_BULLET)
            iUIDWeapon = get_entvar(get_member(pAttacker, m_pActiveItem), var_impulse);
    }
    else if(bitsDamageType & DMG_GRENADE)
    {
        if(FClassnameIs(pInflictor, "grenade"))
            iUIDWeapon = get_entvar(pInflictor, var_impulse);
    }
  
    new Float:flDmgMultipler;
    switch(iUIDWeapon)
    {
        case UID_MEGA_DEAGLE: flDmgMultipler = 200.0;
        case UID_MEGA_GREN: flDmgMultipler = 35.0;
    }
  
    if(IsBonusActive(pAttacker, bonusAddDmg))
        flDmgMultipler += 2.0;
  
    if(IsBonusActive(pPlayer, bonusReduceDmg))
        flDmgMultipler -= 2.0;  
  
    if(flDmgMultipler > 0.0)
        SetHookChainArg(4, ATYPE_FLOAT, flDamage * (100.0 + flDmgMultipler) / 100.0);

    return HC_CONTINUE;
}

public OnCmsStatsAction(ActType, iKiller, iVictim, wpnId, hitPlace, kds[])
{
    if(ActType != FRAGS)
        return;
  
    if(wpnId != CSW_KNIFE && wpnId != CSW_HEGRENADE)
    {
        if(IsBonusActive(iKiller, bonusRefillAmmo))
        {
            rg_instant_reload_weapons(iKiller, get_member(iKiller, m_pActiveItem));
        }
    }
}

public RGCBasePlayer_ResetMaxSpeed(pPlayer)
{
    if(IsBonusActive(pPlayer, bonusSpeedUp))
        return HC_BREAK;
  
    return HC_CONTINUE;
}
Назад
Сверху