/*************************************************************************************************
* Возможности:
* 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
if(g_iRoundCount >= VIPROUND) 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) {
return 0;
}
#else
if(iKey > 3) {
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;
}