Код:
#include <amxmodx>
#include <fun>
#include <cstrike>
#include <hamsandwich>
#include <fakemeta>
#include <orpheu>
#if AMXX_VERSION_NUM < 183
#include <colorchat>
#endif
#define PLUGIN "Boss for Public"
#define VERSION "2.0 Beta"
#define AUTHOR "neygomon"
#define TASK_BOSS 1337
//###### Конфигурационные define ######
#define BOSS_ARMOR 300 // Броня у Босса
#define BOSS_HEALTH 400 // Здоровье у Босса
#define TIMESHOW 15.0 // Время HUD сообщения о том, кто стал Боссом
#define MIN_ROUND 3 // Минимальный раунд когда возможно ставить Босса
#define MAX_ROUND 6 // Максимальный раунд когда возможно ставить Босса
#define MIN_LATENCYBOSS 10.0 // Минимальное время от начала раунда до появления Босса
#define MAX_LATENCYBOSS 20.0 // Максимальное время от начала раунда до появления Босса
#define GLOW // Свечение Босса(по дефолту включено)
#define DOP_HP // Дополнительные HP (по дефолту включено)
#if defined DOP_HP
#define BOSS_HS 15 // Сколько давать HP Боссу за убиство в голову
#define BOSS_TELO 10 // Сколько давать HP Боссу за убиство в тело
#endif
#define SOUND_FILE "misc/killChicken.wav" // Звук, который будет воспроизводиться, как только появится босс
#define MODEL_PATH "models/player/vip/vip.mdl" // Путь(с названием и расширением) до модельки Босса
#define MODEL_FILE "vip" // Файл модели без расширения
//###### Конфигурационные define ######
new iRoundCounter, iRound;
new iBoss;
new pGameRules;
new iPlayers;
new bool:g_BounceActived[32] = false;
#if defined GLOW
new g_ProtColors[4][3] = {{0,0,0},{255,0,0},{0,0,255},{0,255,0}};
new g_GlowAlpha[4] = {50,50,50,50};
#endif
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_event("HLTV", "Event_round_start", "a","1=0","2=0");
register_event("TextMsg","eventRoundRestart","a","2&#Game_w");
register_event("TextMsg","eventCommencingRestart","a","2&#Game_C");
register_event("DeathMsg","eventDeathMsg","a","1>0");
register_event("ResetHUD", "resetModel", "be");
register_cvar ("boss_version", VERSION, FCVAR_SERVER | FCVAR_SPONLY);
// Hammmmm ^_^
RegisterHam(Ham_Spawn, "player", "PlayerSpawn", 1);
// Ouuu, Orpheu... love you, baby :D
new OrpheuFunction:FPlayerCanTakeDamage = OrpheuGetFunctionFromObject(pGameRules,"FPlayerCanTakeDamage","CGameRules");
OrpheuRegisterHook(FPlayerCanTakeDamage,"FPlayerCanTakeDamage_Handler",OrpheuHookPre);
}
public plugin_precache()
{
precache_sound(SOUND_FILE);
precache_model(MODEL_PATH);
OrpheuRegisterHook(OrpheuGetFunction("InstallGameRules"),"OnInstallGameRules",OrpheuHookPost);
}
public client_disconnect(iBoss)
{
iBoss = 0;
#if defined GLOW
off_rendering(iBoss);
#endif
}
public eventCommencingRestart()
iRoundCounter = 0;
public eventRoundRestart()
iRoundCounter = 0;
public Event_round_start()
{
if(!iRound)
iRound = random_num(MIN_ROUND, MAX_ROUND);
if(++iRoundCounter >= iRound)
{
set_task(random_float(MIN_LATENCYBOSS, MAX_LATENCYBOSS), "boss_actived", TASK_BOSS);
iRound = iRoundCounter = 0;
}
if(iBoss)
{
iBoss = 0;
#if defined GLOW
off_rendering(iBoss);
#endif
}
}
public PlayerSpawn(id)
{
if(g_BounceActived[id])
{
give_item(id,"weapon_hegrenade");
give_item(id,"weapon_flashbang");
give_item(id,"weapon_smokegrenade");
cs_set_user_bpammo(id, CSW_FLASHBANG, 2);
cs_set_user_armor(id, 100, CS_ARMOR_VESTHELM);
cs_set_user_money(id, cs_get_user_money(id) + 1000);
g_BounceActived[id] = false;
static bosskiller[32];
get_user_name(id, bosskiller, charsmax(bosskiller));
client_print_color(0, 0, "^4Игрок с ником^3 %s ^4в предыдущем раунде ^3убил Босса ^4и получил бонусы. ^3Молодец^4!", bosskiller);
}
}
public eventDeathMsg(iKiller, iVictim)
{
if(iBoss)
{
iKiller = read_data(1);
iVictim = read_data(2);
if(iKiller != iVictim && iVictim == iBoss)
{
g_BounceActived[iKiller] = true;
#if defined GLOW
off_rendering(iBoss);
#endif
iBoss = 0;
}
else if(iVictim == iBoss)
if(task_exists(TASK_BOSS)) remove_task(TASK_BOSS);
#if defined DOP_HP
static killer_HP, addHP
killer_HP = get_user_health(iKiller)
addHP = (read_data(3) == 1)?BOSS_HS:BOSS_TELO
set_user_health(iKiller,((killer_HP += addHP) > BOSS_HEALTH)?BOSS_HEALTH:killer_HP)
#endif
}
}
public resetModel(id)
{
if(id == iBoss && is_user_alive(id))
cs_set_user_model(id, MODEL_FILE);
else if (!iBoss)
cs_reset_user_model(id);
}
public boss_actived()
{
get_playersteam();
iBoss = random_num(1, iPlayers);
if(iBoss && is_user_alive(iBoss))
{
privilegies(iBoss);
cs_set_user_model(iBoss, MODEL_FILE);
set_rendering(iBoss, kRenderFxGlowShell, g_ProtColors[3][0], g_ProtColors[3][1], g_ProtColors[3][2], kRenderNormal, g_GlowAlpha[3]);
iPlayers = 0;
}
NoticePlayers();
for(new i = 1; i < get_playersnum(); i++)
if((get_user_team(i) == 1 || get_user_team(i) == 2) && !is_user_alive(i))
ExecuteHamB(Ham_CS_RoundRespawn, i);
}
public privilegies(id)
{
set_user_health(id, BOSS_HEALTH);
cs_set_user_armor(id, BOSS_ARMOR, CS_ARMOR_VESTHELM);
give_item(id, "weapon_m249");
cs_set_user_bpammo(id, CSW_M249, 250);
}
public NoticePlayers()
{
static name[32];
get_user_name(iBoss, name, charsmax(name));
set_hudmessage(255, 0, 0, -1.00, 0.2, 0, 10.0, TIMESHOW, 0.0, 0.0, -1);
show_hudmessage(0, "А вот и наш босс...^nЕго ник ^"%s^"^nУдачи в бою;)", name);
client_cmd(0, "spk %s", SOUND_FILE);
}
public OnInstallGameRules()
pGameRules = OrpheuGetReturn();
public FPlayerCanTakeDamage_Handler(gameRules,pVictim,pAttacker)
{
if(iBoss && (pVictim == iBoss || pAttacker == iBoss))
{
OrpheuSetReturn(true);
return _:OrpheuOverride;
}
return _:OrpheuIgnored;
}
#if defined GLOW
stock set_rendering(index, fx=kRenderFxNone, r=255, g=255, b=255, render=kRenderNormal, amount=16)
{
set_pev(index, pev_renderfx, fx)
new Float:RenderColor[3]
RenderColor[0] = float®
RenderColor[1] = float(g)
RenderColor[2] = float(b)
set_pev(index, pev_rendercolor, RenderColor)
set_pev(index, pev_rendermode, render)
set_pev(index, pev_renderamt, float(amount))
return 1
}
stock off_rendering(id)
set_rendering(id, kRenderFxNone, 0, 0, 0, kRenderNormal, 0);
#endif
stock get_playersteam()
{
static i;
for(i = 1; i < get_playersnum(); i++)
if((get_user_team(i) == 1 || get_user_team(i) == 2) && is_user_alive(i)) iPlayers++;
return iPlayers;
}