Код:
#include <amxmodx>
#include <cstrike>
#include <fun>
#include <hamsandwich>
#include <fakemeta>
#include <amxmisc>
#include <colorchat>
#define MAX_PLAYERS 32 // Количество игроков на сервере. По умолчанию : 32
#define MIN_PLAYERS 2 // Минимальное количество игроков для начала работы плагина.
#define ROUND_NUM 3 // С какого раунда плагин будет работать.
#define MIN_MONEY 200 // Минимальное количество денег которое может получить игрок.
#define MAX_MONEY 10000 // Максимальное количество денег которое может получить игрок.
#define MENU_KEYS (1<<0|1<<1)
#define PRIMARY_WEAPONS (1<<CSW_SCOUT|1<<CSW_XM1014|1<<CSW_MAC10|1<<CSW_AUG|1<<CSW_UMP45|1<<CSW_SG550|1<<CSW_GALIL|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) //Оружие которое будет даваться, как приз.
#define SECONDARY_WEAPONS (1<<CSW_P228|1<<CSW_ELITE|1<<CSW_FIVESEVEN|1<<CSW_USP|1<<CSW_GLOCK18|1<<CSW_DEAGLE) //Минимальное оружие : пистолеты.
#define PLUGIN_IP "91.211.118.39" // Защита от перепродажи плагина. Выбираете IP на которой будете компилировать плагин.
#define PLUGIN_ERROR "This plugin is PRIVATE © Kemper" //Текст которой будет отображать взломщикам.
enum _:WEAPON_DATA_SIZE
{
Data_Name[32],
Data_Item[24],
Data_Index,
Data_Ammo
};
enum _:score
{
frags,
Float:dmg,
hs
}
new g_Data[][WEAPON_DATA_SIZE] =
{
{"IMI Galil", "weapon_galil", CSW_GALIL, 90},
{"AK-47", "weapon_ak47", CSW_AK47, 90},
{"Colt M4A1", "weapon_m4a1", CSW_M4A1, 90},
{"Steyr Scout", "weapon_scout", CSW_SCOUT, 90},
{"AI Arctic Warfare Magnum", "weapon_awp", CSW_AWP, 30},
{"FN Minimi M249 Para", "weapon_m249", CSW_M249, 200},
{"Desert Eagle", "weapon_deagle", CSW_DEAGLE, 35}
};
new g_iPlayerFrags[MAX_PLAYERS + 1];
new g_iPlayerDamage[MAX_PLAYERS + 1];
new g_iPlayers[MAX_PLAYERS];
new g_iPlayersNum;
new g_szRoundTopName[32];
new g_pRoundTop;
new g_iRandomPrise;
new g_iRoundCounter;
new niceP[33][score];
new hudsync;
public plugin_init()
{
register_plugin("Round Top Ultimate", "v0.3", "Kemper");
register_event("HLTV", "EventHLTV", "a", "1=0", "2=0");
register_event("Damage", "EventDamage", "b", "2!0", "3=0", "4!0");
register_event("DeathMsg", "EventDeathMsg", "a", "1>0");
register_logevent("EventRestartRound", 2, "1&Restart_Round_");
register_logevent("EventRoundEnd", 2, "1=Round_End");
register_menucmd(register_menuid("Prise_Menu"), MENU_KEYS, "HandleMenu");
RegisterHam(Ham_TakeDamage, "player", "hook_TakeDamage")
register_event("DeathMsg", "Event_DeathMessage", "a")
register_logevent("event_round_end", 2, "1=Round_End")
register_event("HLTV", "event_round_start", "a", "1=0", "2=0");
hudsync = CreateHudSyncObj()
new szIP[32]; //Привязка к IP, Действие над сервером который не правильно установил.
get_user_ip(0, szIP, 31, 1);
if (!equal(szIP, PLUGIN_IP))
set_fail_state(PLUGIN_ERROR);
}
public plugin_cfg()
{
new const szDisableMapTypes[][] = {"35hp_", "ka_"}; // Типы карт, на которых плагин не будет работать
new szMapname[32];
get_mapname(szMapname, charsmax(szMapname));
for(new i; i < sizeof szDisableMapTypes; i++)
if(equali(szMapname, szDisableMapTypes[i], strlen(szDisableMapTypes[i]))) pause("ad");
}
public EventHLTV()
if(get_playersnum() >= MIN_PLAYERS)
if(++g_iRoundCounter >= ROUND_NUM && g_pRoundTop != 0 && is_user_alive(g_pRoundTop)) ShowMenu(g_pRoundTop);
public EventRestartRound() g_iRoundCounter = 0;
public EventDamage(const id)
{
if(g_iRoundCounter < ROUND_NUM) return;
static pAttacker; pAttacker = get_user_attacker(id);
if(is_user_connected(pAttacker) && cs_get_user_team(pAttacker) != cs_get_user_team(id) && pAttacker != id) g_iPlayerDamage[pAttacker] += read_data(2);
}
public EventDeathMsg()
{
if(g_iRoundCounter < ROUND_NUM) return;
new pKiller = read_data(1);
g_iPlayerFrags[pKiller]++;
}
public EventRoundEnd()
{
if(g_iRoundCounter < ROUND_NUM || get_playersnum() < MIN_PLAYERS) return;
g_pRoundTop = 0;
new id, i;
get_players(g_iPlayers, g_iPlayersNum, "ch");
new bool:bDrawKills;
for(i = 0; i < g_iPlayersNum; i++)
{
id = g_iPlayers[i];
if(g_iPlayerFrags[id] > g_iPlayerFrags[g_pRoundTop]) g_pRoundTop = id;
}
for(i = 0; i < g_iPlayersNum; i++)
{
id = g_iPlayers[i];
if(g_iPlayerFrags[id] == g_iPlayerFrags[g_pRoundTop] && id != g_pRoundTop)
{
bDrawKills = true;
break;
}
}
if(bDrawKills)
{
for(i = 0; i < g_iPlayersNum; i++)
{
id = g_iPlayers[i];
if(g_iPlayerDamage[id] > g_iPlayerDamage[g_pRoundTop] && g_iPlayerFrags[id] >= g_iPlayerFrags[g_pRoundTop]) g_pRoundTop = id;
}
}
if(g_pRoundTop != 0)
{
get_user_name(g_pRoundTop, g_szRoundTopName, charsmax(g_szRoundTopName));
////Показ сообщение о лучшем игроке раунда в чате////
ColorChat(id,BLUE,"^1[^4Раунд TOP^1]^3Лучший результат в этом раунде показал ^4%s^3, он будет ^4награждён", g_szRoundTopName);
}
for(i = 0; i < g_iPlayersNum; i++)
{
id = g_iPlayers[i];
g_iPlayerFrags[id] = 0;
g_iPlayerDamage[id] = 0;
}
}
ShowMenu(const id)
{
new szMenu[256], szRandomPrise[34];
g_iRandomPrise = random_num(0, 3);
switch(g_iRandomPrise)
{
////Призы которые будут выдаваться Рандомно////
case 0: add(szRandomPrise, charsmax(szRandomPrise), "оружие");
case 1: add(szRandomPrise, charsmax(szRandomPrise), "набор гранат");
case 2: add(szRandomPrise, charsmax(szRandomPrise), "бронежилет и шлем");
case 3: add(szRandomPrise, charsmax(szRandomPrise), "деньги");
}
////Действие над призом////
formatex(szMenu, charsmax(szMenu), "\yВаш приз - это %s^n^n1. \wВзять приз^n\y2. \wОтказаться от приза", szRandomPrise);
show_menu(id, MENU_KEYS, szMenu, -1, "Prise_Menu");
}
public HandleMenu(const id, const iKey)
{
switch(iKey)
{
case 0: GiveRandomPrise(id);
case 1: ColorChat(0, RED,"^1[^4Раунд TOP^1] ^4%s ^1- ^3отказался от приза", g_szRoundTopName);
}
}
public hook_TakeDamage(Victim, inflictor, Attacker, Float:damage, damagebits)
{
if( inflictor == Attacker )
niceP[Attacker][dmg] += damage
else
{
static classname[32]
pev (inflictor, pev_classname, classname, 31)
if( equal (classname, "grenade") )
niceP[Attacker][dmg] += damage
}
if ( get_pdata_int(Victim, 75, 5) == HIT_HEAD )
niceP[Attacker][hs]++
return HAM_IGNORED
}
public Event_DeathMessage()
niceP[read_data(1)][frags]++
public event_round_start ( )
for (new i; i < 32; i++)
for ( new j; j < 3; j++)
niceP[i][j] = 0
public client_disconnect(id)
for ( new j; j < 3; j++)
niceP[id][j] = 0
public event_round_end ()
{
new Players[32], num, tmpf, Float:tmpd, tmpid
get_players( Players, num )
for( new i; i < 32; i++)
{
if ( niceP[i][frags] > tmpf )
{
tmpid = i
tmpf = niceP[i][frags]
tmpd = niceP[i][dmg]
}
else if ( niceP[i][frags] == tmpf && niceP[i][dmg] > tmpd)
{
tmpid = i
tmpf = niceP[i][frags]
tmpd = niceP[i][dmg]
}
}
if ( tmpf > 0 )
{
new name[32], msg[1024];
get_user_name(tmpid, name, 31);
////HUD сообщение о лучшем игроке раунда////
format( msg, charsmax(msg), "Лучшим игроком раунда оказался^n!!! %s !!!^nСделав %d фрага(ов) и %d урона", name, tmpf, floatround(tmpd, floatround_round) )
////Действие над HUD сообщением////
set_hudmessage(178, 34, 34, -1.0, 0.17, 1, 6.0, 10.0)
ShowSyncHudMsg(0, hudsync, msg)
}
}
//////Оповещание над получением приза//////
GiveRandomPrise(const id)
{
switch(g_iRandomPrise)
{
case 0: GiveRandomWeapon(id);
case 1:
{
give_item(id, "weapon_hegrenade");
give_item(id, "weapon_flashbang");
give_item(id, "weapon_smokegrenade");
cs_set_user_bpammo(id, CSW_FLASHBANG, 2);
ColorChat(0, BLUE,"^1[^4Раунд TOP^1] ^4%s ^1выиграл приз - ^3набор гранат", g_szRoundTopName);
}
case 2:
{
cs_set_user_armor(id, 100, CS_ARMOR_VESTHELM);
ColorChat(0, BLUE,"^1[^4Раунд TOP^1] ^4%s ^1выиграл приз - ^3бронежилет ^1и ^3шлем", g_szRoundTopName);
}
case 3:
{
new iMoney = random_num(MIN_MONEY, MAX_MONEY);
cs_set_user_money(id, min(cs_get_user_money(id) + iMoney, 16000));
ColorChat(0, BLUE,"^1[^4Раунд TOP^1] ^4%s ^1выиграл приз - ^3$%d", g_szRoundTopName, iMoney);
}
}
}
GiveRandomWeapon(const id)
{
new iNum = random_num(0, charsmax(g_Data));
DropWeapon(id, iNum);
give_item(id, g_Data[iNum][Data_Item]);
cs_set_user_bpammo(id, g_Data[iNum][Data_Index], g_Data[iNum][Data_Ammo]);
ColorChat(0, BLUE,"^1[^4Раунд TOP^1] ^4%s ^1выиграл приз - ^3%s", g_szRoundTopName, g_Data[iNum][Data_Name]);
}
DropWeapon(const id, const iType)
{
new iWeapons[32], iWeponsNum;
get_user_weapons(id, iWeapons, iWeponsNum);
for(new i; i < iWeponsNum; i++)
{
if((iType == charsmax(g_Data) ? (SECONDARY_WEAPONS & (1<<iWeapons[i])) : (PRIMARY_WEAPONS & (1<<iWeapons[i]))))
{
new szWeaponName[24];
get_weaponname(iWeapons[i], szWeaponName, charsmax(szWeaponName));
engclient_cmd(id, "drop", szWeaponName);
}
}
}