#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;
}