#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <fakemeta_util>
#pragma semicolon 1
const PRIMARY_WEAPONS_BIT_SUM =
(1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_AUG)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_GALIL)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<
CSW_MP5NAVY)|(1<<CSW_M249)|(1<<CSW_M3)|(1<<CSW_M4A1)|(1<<CSW_TMP)|(1<<CSW_G3SG1)|(1<<CSW_SG552)|(1<<CSW_AK47)|(1<<CSW_P90);
const SECONDARY_WEAPONS_BIT_SUM = (1<<CSW_P228)|(1<<CSW_ELITE)|(1<<CSW_FIVESEVEN)|(1<<CSW_USP)|(1<<CSW_GLOCK18)|(1<<CSW_DEAGLE);
enum _:WEAPON_DATA_SIZE
{
sz_DataName[32],
sz_DataItem[24],
i_Index,
i_DataAmmo
};
new g_szWeaponData[][WEAPON_DATA_SIZE] =
{
{"AK47", "weapon_ak47", CSW_AK47, 90},
{"M4A1", "weapon_m4a1", CSW_M4A1, 90},
{"AWP", "weapon_awp", CSW_AWP, 30},
{"SCOUT", "weapon_scout", CSW_SCOUT, 90},
{"M249", "weapon_m249", CSW_M249, 200},
{"GALIL", "weapon_galil", CSW_GALIL, 90},
{"DEAGLE", "weapon_deagle", CSW_DEAGLE, 35}
};
new g_iBestPlayer, g_szBestPlayerName[32], Float:g_fDamage[33];
new g_iRoundCounter, g_iRandomPrice, g_pCvarRoundAccess, g_pCvarMinPlayers;
public plugin_init()
{
#define VERSION "1.7"
register_plugin("BEST PLAYER PRIVATE", VERSION, "DUKKHAZ0R");
register_cvar("nice_player_bonus", VERSION, FCVAR_SERVER | FCVAR_SPONLY);
RegisterHam(Ham_Spawn, "player", "fw_HamSpawn_Post", true);
RegisterHam(Ham_TakeDamage, "player", "fw_HamTakeDamage_Pre", false);
register_logevent("eEndRound", 2, "1=Round_End");
register_event("TextMsg", "eRestart", "a", "2&#Game_C", "2&#Game_w");
register_event("HLTV", "eRoundStart", "a", "1=0", "2=0");
register_menucmd(register_menuid("BonusMenu"), MENU_KEY_4|MENU_KEY_6, "MenuHandler");
g_pCvarRoundAccess = register_cvar("bp_round_access", "3");
g_pCvarMinPlayers = register_cvar("bp_minplayers", "5");
new szMapName[32], szMapPrefix[][] = {"aim_", "fy_", "knife_", "35hp_", "deathrun_"};
get_mapname(szMapName, charsmax(szMapName));
for(new i; i < sizeof szMapPrefix; i++) {
if(containi(szMapName, szMapPrefix[i]) != -1) {
pause("ad");
break;
}
}
}
public client_disconnect(id)
g_fDamage[id] = 0.0;
public client_connect(id)
g_fDamage[id] = 0.0;
public fw_HamTakeDamage_Pre(pVictim, iInflictor, pAttacker, Float:fDamage, damagebits)
{
if(fm_get_user_team(pVictim) != fm_get_user_team(pAttacker) && pAttacker != pVictim)
g_fDamage[pAttacker] += fDamage;
}
public eRestart()
g_iRoundCounter = 0;
public eRoundStart()
{
static i, apPlayers[32], iPlayers, pPlayer;
get_players(apPlayers, iPlayers, "ch");
for(i = 0; i < iPlayers; i++)
{
pPlayer = apPlayers[i];
g_fDamage[pPlayer] = 0.0;
}
}
public eEndRound()
{
if(++g_iRoundCounter < get_pcvar_num(g_pCvarRoundAccess) || get_playersnum() < get_pcvar_num(g_pCvarMinPlayers))
return;
static i, apPlayers[32], iPlayers, pPlayer, Float:fBestPlayerDamage;
get_players(apPlayers, iPlayers, "ch");
fBestPlayerDamage = 0.0;
for(i = 0; i < iPlayers; i++)
{
pPlayer = apPlayers[i];
if(g_fDamage[pPlayer] && g_fDamage[pPlayer] > fBestPlayerDamage)
{
g_iBestPlayer = pPlayer;
fBestPlayerDamage = g_fDamage[pPlayer];
}
}
if(g_iBestPlayer)
{
get_user_name(g_iBestPlayer, g_szBestPlayerName, charsmax(g_szBestPlayerName));
ChatColor(0, "^1[^4Бонус^1] Отлично! Лучший результат за прошлый раунд: <<^4%s^1>> [^3%d урона^1]", g_szBestPlayerName, floatround(g_fDamage[g_iBestPlayer]));
}
}
public fw_HamSpawn_Post(const id)
{
if(is_user_alive(id) && g_iBestPlayer == id && !(get_user_flags(id) & ADMIN_LEVEL_H) )
ShowBonusMenu(id);
}
public ShowBonusMenu(const id)
{
static iLen, szMenu[512]; g_iRandomPrice = random(7);
switch(g_iRandomPrice)
{
case 7: iLen = formatex(szMenu, charsmax(szMenu), "\wВаш приз: \rАрмор + все гранаты^n\dВзять свой приз?^n^n");
default: iLen = formatex(szMenu, charsmax(szMenu), "\wВаш приз: \r%s^n\dВзять свой приз?^n^n", g_szWeaponData[g_iRandomPrice][sz_DataName]);
}
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r4.\wПолучить приз^n");
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r6.\wОтказаться от приза^n^n");
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r0.\wВыход");
show_menu(id, MENU_KEY_4|MENU_KEY_6, szMenu, -1, "BonusMenu");
}
public MenuHandler(const id, const iKey)
{
switch(iKey)
{
case 3:
{
switch(g_iRandomPrice)
{
case 7:
{
ChatColor(0, "^1[^4Бонус^1] Поздравляем! <<^3%s^1>> выиграл ^4армор + все гранаты^1 за лучший результ.", g_szBestPlayerName);
equipment_player(id);
return;
}
case 6: drop_weapons(id, 2);
default: drop_weapons(id, 1);
}
fm_give_item(id, g_szWeaponData[g_iRandomPrice][sz_DataItem]);
fm_set_user_bpammo(id, g_szWeaponData[g_iRandomPrice][i_Index], g_szWeaponData[g_iRandomPrice][i_DataAmmo]);
ChatColor(0, "^1[^4Бонус^1] Поздравляем! <<^4%s^1>> выиграл ^4%s^1 за лучший результ.", g_szBestPlayerName, g_szWeaponData[g_iRandomPrice][sz_DataName]);
}
case 5: ChatColor(0, "^1[^4Бонус^1] Странно, что ^4%s^1 отказался от приза.", g_szBestPlayerName );
}
}
stock equipment_player(const id)
{
fm_give_item(id, "weapon_hegrenade");
fm_give_item(id, "weapon_flashbang");
fm_give_item(id, "weapon_flashbang");
fm_give_item(id, "weapon_smokegrenade");
fm_set_user_armor(id, 100);
}
stock drop_weapons(id, dropwhat)
{
static weapons[32], num, i, weaponid;
num = 0;
get_user_weapons(id, weapons, num);
for (i = 0; i < num; i++)
{
weaponid = weapons[i];
if ((dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM)) || (dropwhat == 2 && ((1<<weaponid) & SECONDARY_WEAPONS_BIT_SUM)))
{
static wname[32];
get_weaponname(weaponid, wname, sizeof wname - 1);
engclient_cmd(id, "drop", wname);
}
}
}
stock fm_get_user_team(const pPlayer)
{
#define OFFSET_TEAM 114
return get_pdata_int(pPlayer, OFFSET_TEAM, 5);
}
stock fm_set_user_bpammo(const pPlayer, iWeaponId, iAmount)
{
new iOffset;
switch(iWeaponId)
{
case CSW_AWP: iOffset = 377;
case CSW_SCOUT, CSW_AK47, CSW_G3SG1: iOffset = 378;
case CSW_M249: iOffset = 379;
case CSW_FAMAS, CSW_M4A1, CSW_AUG, CSW_SG550, CSW_GALIL, CSW_SG552: iOffset = 380;
case CSW_M3, CSW_XM1014: iOffset = 381;
case CSW_USP, CSW_UMP45, CSW_MAC10: iOffset = 382;
case CSW_FIVESEVEN, CSW_P90: iOffset = 383;
case CSW_DEAGLE: iOffset = 384;
case CSW_P228: iOffset = 385;
case CSW_GLOCK18, CSW_MP5NAVY, CSW_TMP, CSW_ELITE: iOffset = 386;
case CSW_FLASHBANG: iOffset = 387;
case CSW_HEGRENADE: iOffset = 388;
case CSW_SMOKEGRENADE: iOffset = 389;
case CSW_C4: iOffset = 390;
default: return;
}
set_pdata_int(pPlayer, iOffset, iAmount, 5);
}
stock ChatColor(const id, const input[], any:...)
{
static msg[191], players[32], count; count = 1;
vformat(msg, 190, input, 3);
replace_all(msg, 190, "!g", "^4");
replace_all(msg, 190, "!y", "^1");
replace_all(msg, 190, "!t", "^3");
if (id) players[0] = id; else get_players(players, count, "ch");
{
for (new i = 0; i < count; i++)
{
if (is_user_connected(players[i]))
{
message_begin(MSG_ONE_UNRELIABLE, 76, _, players[i]);
write_byte(players[i]);
write_string(msg);
message_end();
}
}
}
}