Код:
#include <amxmodx>
#include <xs>
#include <fakemeta>
#include <engine>
#include <fun>
#include <hamsandwich>
#include <cstrike>
#include <dhudmessage>
//native zp_set_umm_start()
new g_timer
new g_game_start
new healthbar
new const health_spr[] = "sprites/den67_cso/npc_hp_grade2.spr"
#define PLUGIN_NAME "[CSO] [NPC] Alien Boss"
#define PLUGIN_VERSION "1.1"
#define PLUGIN_AUTHOR "bos93 / heka / DEN67"
#define g_szClassName "npc_Phobos"
#define g_szPhobosModel "models/bw/bosses/npc_alienboss2.mdl"
new g_msgScreenShake, g_msgScreenFade;
new const Float:Phobos_SPEED = 300.0;
#define ZBS_ATTACK1_ANIMTIME 2.36
#define ZBS_SHOCKWAVE_ANIMTIME 3.36
new Float:ZBS_DUSH
new Float:ZBS_SHOCKWAVE;
#define Phobos_HEALTH 500000.0
new SprSW
new bool:start_knock[512]
new m_iBlood[2]
new const SPRITE_BLOOD2[] = "sprites/blood.spr";
new const SPRITE_BLOOD[] = "sprites/bloodspray.spr";
new g_iPhobosEnt
new g_pBossTarget
new g_iMaxPlayers
new PhobosState:g_OPhobosState;
new g_iMsgScreenShake;
new zbs_dush_skill
new zbs_dush_end
const UNIT_SECOND = (1<<12);
const FFADE_IN = 0x0000;
new Float:g_vPhobosOrigin[3];
new Float:g_vTarOrigin[33][3];
new Float:g_vAimVector[33][3];
new Float:g_fLenToAim[33];
new Float:g_fHaveDamage[33];
new Float:g_fPhobosSpeed
new Float:g_fLastAttack1;
new Float:g_fResetDush
new Float:g_fTimeShockWave
new Float:g_fResetShockWave
enum PhobosState
{
scene_appear = 1,
zbs_idle1,
zbs_walk,
zbs_dush,
zbs_atack1,
zbs_shockwave,
death
}
public plugin_init()
{
register_plugin ( PLUGIN_NAME , PLUGIN_VERSION , PLUGIN_AUTHOR )
new szMapName[ 64 ];
get_mapname( szMapName, 63 );
if( contain( szMapName, "zp_boss_city" ) == -1 )
return
set_msg_block(get_user_msgid("ClCorpse"), BLOCK_SET)
set_msg_block(get_user_msgid("RoundTime"), BLOCK_SET)
register_clcmd("say /start", "AlienBoss_Prepare")
register_logevent("round_end", 2, "1=Round_End")
register_think(g_szClassName, "Phobos_Think");
register_touch(g_szClassName, "*", "Fix_Eng_Touch_Player");
g_msgScreenShake = get_user_msgid( "ScreenShake" );
g_msgScreenFade = get_user_msgid( "ScreenFade" );
RegisterHam(Ham_TraceAttack, "info_target", "Phobos_Ham_TraceAttack_Pre", 0);
RegisterHam(Ham_TakeDamage, "info_target", "Phobos_Ham_TakeDamage_Pre", 0);
RegisterHam(Ham_TakeDamage, "info_target", "Phobos_Ham_TakeDamage_Post", 1);
g_iMaxPlayers = get_maxplayers ( )
//set_task(1.0 , "AlienBoss_Prepare")
g_iMsgScreenShake = get_user_msgid("ScreenShake");
}
public plugin_precache()
{
new szMapName[ 64 ];
get_mapname( szMapName, 63 );
if( contain( szMapName, "zp_boss_city" ) == -1 )
return
precache_model( g_szPhobosModel )
precache_model(health_spr)
precache_sound("bw/bosses/mahadash.wav")
precache_sound("bw/bosses/death.wav")
precache_sound("bw/bosses/shockwave.wav")
precache_sound("bw/bosses/swing.wav")
precache_sound("bw/bosses/vioce.wav")
precache_sound("bw/bosses/footstep_1.wav")
precache_sound("bw/bosses/footstep_2.wav")
SprSW = precache_model("sprites/shockwave.spr")
m_iBlood[0] = precache_model(SPRITE_BLOOD);
m_iBlood[1] = precache_model(SPRITE_BLOOD2);
ZBS_DUSH = ( 30.0 )
ZBS_SHOCKWAVE = ( 15.0 )
}
public AlienBoss_Prepare()
{
set_task(1.0, "count_start", 231211)
g_timer = 25 //26
g_game_start = false
set_task(1.0, "AlienBoss_Start", 21341);
}
public count_start(ent)
{
g_timer = g_timer - 1
if(g_timer > 0)
client_print(0, print_center, "Prepare for battle: %d", g_timer)
if(g_timer >= 0)
set_task(1.0, "count_start", 231211)
}
public AlienBoss_Start()
{
g_iPhobosEnt = create_entity( "info_target" );
g_game_start = false
new Float:vOrigin[3]
if(!pev_valid(g_iPhobosEnt))
return;
new Float:fHealth;fHealth = Phobos_HEALTH
set_pev( g_iPhobosEnt, pev_classname, g_szClassName );
set_pev( g_iPhobosEnt, pev_model, g_szPhobosModel );
set_pev( g_iPhobosEnt, pev_solid, SOLID_BBOX);
set_pev( g_iPhobosEnt, pev_movetype, MOVETYPE_NONE);
vOrigin[0] = -314.000000;
vOrigin[1] = 21.000000;
vOrigin[2] = 424.00000;
engfunc( EngFunc_SetModel, g_iPhobosEnt, g_szPhobosModel);
engfunc( EngFunc_SetSize, g_iPhobosEnt, Float:{ -32.0, -32.0, -40.0}, Float:{ 32.0, 32.0, 96.0 });
engfunc( EngFunc_SetOrigin, g_iPhobosEnt, vOrigin);
set_pev( g_iPhobosEnt, pev_sequence, 2);
entity_set_int(g_iPhobosEnt, EV_INT_gamestate, 1)
entity_set_float(g_iPhobosEnt, EV_FL_animtime, halflife_time());
entity_set_float(g_iPhobosEnt, EV_FL_framerate, 1.0);
entity_set_float(g_iPhobosEnt, EV_FL_gravity, 6.0);
set_pev(g_iPhobosEnt, pev_flags, FL_MONSTER);
start_knock[g_iPhobosEnt] = false
healthbar = create_entity("env_sprite")
set_pev(healthbar, pev_scale, 1.0)
engfunc(EngFunc_SetModel, healthbar, health_spr)
set_pev(g_iPhobosEnt, pev_controller_0, 125);
set_pev(g_iPhobosEnt, pev_controller_1, 125);
set_pev(g_iPhobosEnt, pev_controller_2, 125);
set_pev(g_iPhobosEnt, pev_controller_3, 125);
set_pev(g_iPhobosEnt, pev_takedamage, DAMAGE_NO);
set_pev(g_iPhobosEnt, pev_max_health, fHealth);
set_pev(g_iPhobosEnt, pev_health, fHealth);
set_pev(g_iPhobosEnt, pev_velocity, Float:{ 0.0, 0.0, -50.0 });
entity_set_float(g_iPhobosEnt, EV_FL_nextthink, get_gametime() + 24.0);
set_task(0.1, "Phobos_check", g_iPhobosEnt, _, _, "b")
g_OPhobosState = scene_appear
}
public Phobos_Start()
{
if(!pev_valid(g_iPhobosEnt))
return;
set_pev( g_iPhobosEnt, pev_solid, SOLID_BBOX);
set_pev( g_iPhobosEnt, pev_movetype, MOVETYPE_PUSHSTEP);
set_pev(g_iPhobosEnt, pev_takedamage, DAMAGE_YES);
set_pev(g_iPhobosEnt, pev_sequence, 2);
entity_set_float(g_iPhobosEnt, EV_FL_animtime, halflife_time());
entity_set_float(g_iPhobosEnt, EV_FL_framerate, 1.0);
set_dhudmessage(255, 255, 0, -1.0, 0.0, 1, 6.0, 10000.0)
show_dhudmessage(0, "[ Kill Bonus | 30000$ 20 EXP ]")
g_fPhobosSpeed = Phobos_SPEED
g_OPhobosState = zbs_walk
g_pBossTarget = 0;
entity_set_float(g_iPhobosEnt, EV_FL_nextthink, get_gametime() + 0.1);
dllfunc(DLLFunc_Think, g_iPhobosEnt);
g_game_start = true
}
public Phobos_Think ( Entity )
{
static pTarget
// PreThink
pTarget = 0;
if(pev(Entity, pev_deadflag) == DEAD_DYING)
{
Phobos_Kill(Entity);
return;
}
VECTORS_Init();
switch (g_OPhobosState)
{
case scene_appear:
{
Phobos_Start()
}
case death:
{
return;
}
case zbs_idle1, zbs_walk:
{
//set_pev( Entity, pev_solid, SOLID_BBOX);
set_pev( g_iPhobosEnt, pev_movetype, MOVETYPE_PUSHSTEP);
if(Phobos_SelectAction(Entity))
{
entity_set_float(Entity, EV_FL_nextthink, get_gametime() + 0.1);
return;
}
}
case zbs_atack1:
{
if((g_fLastAttack1) > get_gametime())
{
entity_set_float(Entity, EV_FL_nextthink, get_gametime() + 0.1);
return;
}
else
{
g_OPhobosState = zbs_idle1;
g_pBossTarget = 0;
if(Phobos_SelectAction(Entity))
{
entity_set_float(Entity, EV_FL_nextthink, get_gametime() + 0.1);
return;
}
}
}
case zbs_dush:
{
if(!zbs_dush_end)
{
entity_set_float(Entity, EV_FL_nextthink, get_gametime() + 1.0);
return;
}
else
{
g_OPhobosState = zbs_idle1;
g_pBossTarget = 0;
zbs_dush_end = false
if(Phobos_SelectAction(Entity))
{
entity_set_float(Entity, EV_FL_nextthink, get_gametime() + 0.1);
return;
}
}
}
case zbs_shockwave:
{
if((g_fTimeShockWave) > get_gametime())
{
entity_set_float(Entity, EV_FL_nextthink, get_gametime() + 0.1);
return;
}
else
{
g_OPhobosState = zbs_idle1;
g_pBossTarget = 0;
if(Phobos_SelectAction(Entity))
{
entity_set_float(Entity, EV_FL_nextthink, get_gametime() + 0.1);
return;
}
}
}
}
pTarget = BOSS_FindTarget();
// If not target
if(pTarget == 0)
{
g_OPhobosState = zbs_idle1;
if(pev(Entity, pev_sequence) != 2 || pev(Entity, pev_sequence) != 9)
{
play_anim(Entity, 2);
set_pev(Entity, pev_velocity, Float:{0.0, 0.0, -0.1});
}
entity_set_float(g_iPhobosEnt, EV_FL_nextthink, get_gametime() + 0.1);
return;
}
g_OPhobosState = zbs_walk
// Check to walk anim
static iSequence;
iSequence = pev(Entity, pev_sequence);
if(iSequence != 3)
{
play_anim(Entity, 3);
set_pev(Entity, pev_framerate, 1.4)
}
static Float:vAimVector[3], Float:vVelocity[3];
xs_vec_copy(g_vAimVector[pTarget], vAimVector);
vAimVector[2] = 0.0;
vector_to_angle(vAimVector, vVelocity);
vVelocity[0] = 0.0;
vVelocity[2] = 0.0;
set_pev(Entity, pev_angles, vVelocity);
set_pev(Entity, pev_punchangle, vVelocity);
set_pev(Entity, pev_v_angle, vVelocity);
set_pev(Entity, pev_fixangle, 1);
xs_vec_normalize(vAimVector, vAimVector);
xs_vec_mul_scalar(vAimVector, g_fPhobosSpeed, vVelocity);
set_pev(Entity, pev_velocity, vVelocity);
entity_set_float(g_iPhobosEnt, EV_FL_nextthink, get_gametime() + 0.1);
}
public Phobos_Ham_TraceAttack_Pre(this, idattacker, Float:damage, Float:direction[3], tr_handle, damagebits)
{
static Float:vBlood[3], szClassname[32];
pev(this, pev_classname, szClassname, 31);
if(!equal(szClassname, g_szClassName)) return HAM_IGNORED;
if(0 < idattacker <= g_iMaxPlayers)
{
get_tr2(tr_handle, TR_vecEndPos, vBlood);
UTIL_MakeBlood(vBlood);
}
return HAM_IGNORED;
}
public Phobos_Ham_TakeDamage_Pre(victim, inflictor, attacker, Float:damage, damagetype)
{
static szClassname[32], Float:fMaxHealth, Float:fHealth;
pev(victim, pev_classname, szClassname, 31);
if(!equal(szClassname, g_szClassName)) return HAM_IGNORED;
pev(victim, pev_health, fHealth);
pev(victim, pev_max_health, fMaxHealth);
if(fHealth <= damage)
{
g_OPhobosState = death;
client_cmd(0, "spk bw/bosses/death.wav")
client_cmd(0, "mp3 stop")
set_pev(victim, pev_deadflag, DEAD_DYING);
remove_task (100)
set_pev( g_iPhobosEnt, pev_solid, SOLID_NOT);
set_pev( g_iPhobosEnt, pev_movetype, MOVETYPE_NONE);
set_pev(victim, pev_takedamage, DAMAGE_NO);
play_anim(victim, 1);
new szName[ 32 ]
get_user_name( attacker, szName, 31 )
set_hudmessage( 0, 255, 0, 0.05, 0.45, 0, 0.0, 5.0, 1.0, 1.0,3 )
show_hudmessage( 0, "%s Killed Alien Boss !!!^nMoney Bonus 30000$ +20 EXP", szName )
//zp_cs_set_user_money(attacker, zp_cs_get_user_money(attacker) + 30000);
//zp_set_user_exp(attacker, zp_get_user_exp(attacker) + 20)
entity_set_float(g_iPhobosEnt, EV_FL_nextthink, get_gametime() + 15.1);
// zp_set_umm_start()
return HAM_SUPERCEDE;
}
return HAM_IGNORED;
}
public Phobos_Ham_TakeDamage_Post(victim, inflictor, attacker, Float:damage, damagetype)
{
static szClassname[32], Float:fMaxHealth, Float:fHealth;
pev(victim, pev_classname, szClassname, 31);
if(!equal(szClassname, g_szClassName)) return HAM_IGNORED;
pev(g_iPhobosEnt, pev_health, fHealth);
pev(g_iPhobosEnt, pev_max_health, fMaxHealth);
g_fHaveDamage[attacker] += damage;
if(g_fHaveDamage[attacker] >= 1000.0)
{
g_fHaveDamage[attacker] -= 1000.0;
//zp_cs_set_user_money(attacker, zp_cs_get_user_money(attacker) + 500);
}
return HAM_IGNORED;
}
public client_putinserver(id) if(g_game_start) set_pdata_int(id, 365, 1)
public Phobos_SelectAction(ent)
{
static Float:vAimVector[3], Float:vAngle[3];
static id, Float:fLen;
static Float:gametime;
static iNumInAttackDush, iNumInShockWave
gametime = get_gametime();
iNumInAttackDush = iNumInShockWave = 0;
for(id = 1; id <= g_iMaxPlayers; id++)
{
if(!is_user_alive(id)) continue;
entity_get_vector(id, EV_VEC_origin, g_vTarOrigin[id]);
xs_vec_sub(g_vTarOrigin[id], g_vPhobosOrigin, vAimVector);
fLen = xs_vec_len(vAimVector);
// Selecting skill
if(fLen <= 80.0)
{
g_OPhobosState = zbs_atack1;
g_fLastAttack1 = gametime + ZBS_ATTACK1_ANIMTIME
set_pev( g_iPhobosEnt, pev_movetype, MOVETYPE_NONE);
set_pev(ent, pev_framerate, 1.0)
play_anim(ent, 6);
// Set angles
vAimVector[2] = 0.0;
vector_to_angle(vAimVector, vAngle);
vAngle[0] = 0.0;
vAngle[2] = 0.0;
set_angles(ent, vAngle);
set_task(0.5, "Phobos_Damage");
client_cmd(0, "spk bw/bosses/swing.wav")
return 1;
}
if(fLen <= 800.0)
{
iNumInAttackDush++;
}
if(fLen <= 800.0)
{
iNumInShockWave++;
}
}
if(iNumInAttackDush > 0 && g_fResetDush < gametime && random_num(0, 30) == 0)
{
g_OPhobosState = zbs_dush;
g_fResetDush = gametime + ZBS_DUSH
VECTORS_Init();
set_pev( g_iPhobosEnt, pev_movetype, MOVETYPE_NONE);
set_pev(ent, pev_framerate, 1.0)
VECTORS_Init();
// Set angles
xs_vec_copy(g_vAimVector[BOSS_FindTarget()], vAimVector);
vAimVector[2] = 0.0;
vector_to_angle(vAimVector, vAngle);
vAngle[0] = 0.0;
vAngle[2] = 0.0;
set_angles(ent, vAngle);
play_anim(ent, 7);
zbs_dush_skill = true
set_task (1.05 , "zbs_dush_start" )
client_cmd(0, "spk bw/bosses/mahadash.wav")
return 1;
}
if(iNumInShockWave > 0 && g_fResetShockWave < gametime && random_num(0, 30) == 0)
{
g_OPhobosState = zbs_shockwave;
g_fResetShockWave = gametime + ZBS_SHOCKWAVE
VECTORS_Init();
set_pev( g_iPhobosEnt, pev_movetype, MOVETYPE_NONE);
set_pev(ent, pev_framerate, 1.0)
VECTORS_Init();
play_anim(ent, 5);
g_fTimeShockWave = gametime + ZBS_SHOCKWAVE_ANIMTIME
client_cmd(0, "spk bw/bosses/vioce.wav")
set_task(2.0 , "zbs_shockwave_start" )
set_task(2.0, "do_shokwave_effect", ent)
set_task(2.0, "damage", ent)
return 1;
}
return 0;
}
public zbs_dush_start( )
{
static Float:vVelocity[3], Float:vAimVector[3];
VECTORS_Init();
// Set angles
xs_vec_copy(g_vAimVector[BOSS_FindTarget()], vAimVector);
vAimVector[2] = 0.0;
vector_to_angle(vAimVector, vVelocity);
vVelocity[0] = 0.0;
vVelocity[2] = 0.0;
set_angles(g_iPhobosEnt, vVelocity);
xs_vec_copy(g_vPhobosOrigin, vVelocity);
vVelocity[2] += 5;
engfunc( EngFunc_SetOrigin, g_iPhobosEnt, vVelocity);
set_pev(g_iPhobosEnt, pev_movetype, MOVETYPE_FLY);
velocity_by_aim(g_iPhobosEnt, 2500, vVelocity);
set_pev(g_iPhobosEnt, pev_velocity, vVelocity);
}
public Fix_Eng_Touch_Player(Entity, iPlayer)
{
if ( zbs_dush_skill && iPlayer)
{
entity_set_float(g_iPhobosEnt, EV_FL_nextthink, get_gametime() + 0.76);
set_pev( g_iPhobosEnt, pev_movetype, MOVETYPE_NONE);
Phobos_Damage2()
play_anim(Entity, 2);
zbs_dush_skill = false
zbs_dush_end = true
}
if ( zbs_dush_skill && !iPlayer)
{
entity_set_float(g_iPhobosEnt, EV_FL_nextthink, get_gametime() + 0.76);
set_pev( g_iPhobosEnt, pev_movetype, MOVETYPE_NONE);
Phobos_Damage2()
play_anim(Entity, 2);
zbs_dush_skill = false
zbs_dush_end = true
}
}
public Phobos_Damage()
{
if(!pev_valid(g_iPhobosEnt))
return;
static Float:vAimVector[3], Float:vRevenanAngle[3], Float:fDegrees, id;
VECTORS_Init();
velocity_by_aim(g_iPhobosEnt, 10, vRevenanAngle);
// Damage of justiceSwing
for(id = 1; id <= g_iMaxPlayers; id++)
{
if(!is_user_alive(id)) continue;
fDegrees = vec_2Ddegrees(g_vAimVector[id], vRevenanAngle);
if((g_fLenToAim[id] <= 220.0) && ( fDegrees < 91.0 ))
{
Boss_TakeDamage(id, g_iPhobosEnt, 50.0);
client_cmd(id, "drop")
velocity_by_aim(g_iPhobosEnt, 300, vAimVector);
vAimVector[2] = 200.0;
set_pev(id, pev_velocity, vAimVector);
}
}
}
public Phobos_Damage2()
{
if(!pev_valid(g_iPhobosEnt))
return;
static Float:vAimVector[3], Float:vRevenanAngle[3], Float:fDegrees, id;
VECTORS_Init();
velocity_by_aim(g_iPhobosEnt, 10, vRevenanAngle);
// Damage of justiceSwing
for(id = 1; id <= g_iMaxPlayers; id++)
{
if(!is_user_alive(id)) continue;
fDegrees = vec_2Ddegrees(g_vAimVector[id], vRevenanAngle);
if((g_fLenToAim[id] <= 220.0) && ( fDegrees < 91.0 ))
{
Boss_TakeDamage(id, g_iPhobosEnt, 100.0);
velocity_by_aim(g_iPhobosEnt, 300, vAimVector);
vAimVector[2] = 200.0;
set_pev(id, pev_velocity, vAimVector);
}
}
}
stock UTIL_MakeBlood(const Float:vTraceEnd[3])
{
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_BLOODSPRITE);
engfunc(EngFunc_WriteCoord, vTraceEnd[0]);
engfunc(EngFunc_WriteCoord, vTraceEnd[1]);
engfunc(EngFunc_WriteCoord, vTraceEnd[2]);
write_short(m_iBlood[0]);
write_short(m_iBlood[1]);
write_byte(134);
write_byte( random_num( 5,6 ) );
message_end();
}
Boss_TakeDamage(id, attaker, Float:fDamage)
{
UTIL_ScreenShake
(
.id = id,
.amplitude = (7<<14),
.duration = ( (1<<12) * max(floatround(fDamage / 40.0, floatround_ceil), 10) ),
.frequency = ( (2<<12) * max(floatround(fDamage / 10.0, floatround_ceil), 20) )
);
ExecuteHamB(Ham_TakeDamage, id, 0, attaker, fDamage, DMG_SLASH);
}
stock UTIL_ScreenShake(id, amplitude, duration, frequency)
{
message_begin(MSG_ONE_UNRELIABLE, g_iMsgScreenShake, _, id);
write_short(amplitude); // Amplitude
write_short(duration); // Duration
write_short(frequency); // Frequency
message_end();
}
stock ScreenShake(id, duration, frequency)
{
if(!is_user_alive(id)) return
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenShake"), _, id);
write_short(1<<14)
write_short(duration)
write_short(frequency)
message_end();
}
stock Float:vec_2Ddegrees(Float:vFirst[3], Float:vSecond[3])
{
static Float:fAngle;
fAngle = ( ( vFirst[0]*vSecond[0] + vFirst[1]*vSecond[1] ) / ( floatsqroot(vFirst[0]*vFirst[0] + vFirst[1]*vFirst[1]) * floatsqroot(vSecond[0]*vSecond[0] + vSecond[1]*vSecond[1]) ) );
return floatacos(fAngle, degrees);
}
stock play_anim(Entity, sequence)
{
entity_set_int(Entity, EV_INT_sequence, sequence);
entity_set_float(Entity, EV_FL_animtime, halflife_time());
}
stock set_angles(ent, Float:vAngles[3])
{
set_pev(ent, pev_angles, vAngles);
set_pev(ent, pev_punchangle, vAngles);
set_pev(ent, pev_v_angle, vAngles);
set_pev(ent, pev_fixangle, 1);
}
VECTORS_Init()
{
if( !pev_valid( g_iPhobosEnt ) ) return;
static id;
entity_get_vector(g_iPhobosEnt, EV_VEC_origin, g_vPhobosOrigin);
for(id = 1; id <= g_iMaxPlayers; id++)
{
if(!is_user_alive(id)) continue;
entity_get_vector(id, EV_VEC_origin, g_vTarOrigin[id]);
xs_vec_sub(g_vTarOrigin[id], g_vPhobosOrigin, g_vAimVector[id]);
g_fLenToAim[id] = xs_vec_len(g_vAimVector[id]);
}
}
BOSS_FindTarget()
{
static iPlayers[32], iNum, id;
for(id = 1, iNum = 0; id <= g_iMaxPlayers; id++)
if(is_user_alive(id))
iPlayers[iNum++] = id;
if(iNum == 0)
{
g_pBossTarget = 0;
return 0;
}
if(g_pBossTarget && is_user_alive(g_pBossTarget))
{
return g_pBossTarget;
}
return (g_pBossTarget = iPlayers[random_num(0, iNum-1)]);
}
Phobos_Kill (Entity )
{
set_rendering( Entity, kRenderFxNone, 0, 0, 0, kRenderTransTexture, 0);
set_pev( Entity, pev_effects, EF_NODRAW);
set_pev( Entity, pev_deadflag, DEAD_DEAD);
if(pev_valid (Entity))
engfunc(EngFunc_RemoveEntity, Entity)
engfunc(EngFunc_RemoveEntity, healthbar)
g_OPhobosState = death;
}
public zbs_shockwave_start(args[], ent)
{
new Float:origin[3]
set_task(1.0, "reset_knock", ent + 123456)
client_cmd(0, "spk bw/bosses/shockwave.wav")
static Float:flOrigin[3] , Float:flDistance , Float:flSpeed
for(new iVictim=1;iVictim <= 32;iVictim++)
{
//new health = get_user_health(iVictim)
if(is_user_connected(iVictim) && is_user_alive(iVictim))
{
pev(iVictim, pev_origin, flOrigin)
flDistance = get_distance_f(origin, flOrigin)
if(flDistance <= 700)
{
flSpeed = 1600.0
static Float:flNewSpeed
flNewSpeed = flSpeed * ( 1.0 - ( flDistance / 700.0 ) )
static Float:flVelocity [ 3 ]
get_speed_vector (origin, flOrigin, flNewSpeed, flVelocity)
set_pev ( iVictim, pev_velocity,flVelocity )
}
}
}
}
public reset_knock(ent)
{
ent = ent - 123456
}
stock get_speed_vector(const Float:origin1[3], const Float:origin2[3], Float:speed, Float:new_velocity[3])
{
new_velocity[0] = origin2[0] - origin1[0]
new_velocity[1] = origin2[1] - origin1[1]
new_velocity[2] = origin2[2] - origin1[2]
new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
new_velocity[0] *= num
new_velocity[1] *= num
new_velocity[2] *= num
return 1;
}
public do_shokwave_effect(ent)
{
new Float: iOrigin[ 3 ]
entity_get_vector( ent, EV_VEC_origin, iOrigin );
engfunc( EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, iOrigin, 0 );
write_byte( TE_BEAMCYLINDER );
engfunc( EngFunc_WriteCoord, iOrigin[ 0 ] );
engfunc( EngFunc_WriteCoord, iOrigin[ 1 ] );
engfunc( EngFunc_WriteCoord, iOrigin[ 2 ] );
engfunc( EngFunc_WriteCoord, iOrigin[ 0 ] );
engfunc( EngFunc_WriteCoord, iOrigin[ 1 ] );
engfunc( EngFunc_WriteCoord, iOrigin[ 2 ] + 700);
write_short( SprSW );
write_byte(0) // startframe
write_byte(0) // framerate
write_byte(4) // life
write_byte(65) // width
write_byte(0) // noise
write_byte(112) // red
write_byte(112) // green
write_byte(212) // blue
write_byte(255) // brightness
write_byte(0) // speed
message_end()
}
screen_effects( id )
{
message_begin( MSG_ONE_UNRELIABLE, g_msgScreenFade, _, id );
write_short( UNIT_SECOND * 1 );
write_short( UNIT_SECOND * 1 );
write_short( FFADE_IN );
write_byte( 200 );
write_byte( 0 );
write_byte( 0 );
write_byte( 125 );
message_end( );
message_begin( MSG_ONE_UNRELIABLE, g_msgScreenShake, _, id );
write_short( UNIT_SECOND * 5 );
write_short( UNIT_SECOND * 1 );
write_short( UNIT_SECOND * 5 );
message_end( );
}
public damage(ent)
{
for(new i = 1; i < get_maxplayers(); i++)
{
if(is_user_alive(i) && entity_range(ent, i) <= 300.0)
{
screen_effects(i)
static Float:Damage
Damage = random_float(100.0, 200.0)
ExecuteHam(Ham_TakeDamage, i, 0, i, Damage, DMG_SONIC)
}
}
}
public Phobos_check(Entity)
{
if(!is_valid_ent(Entity))
return PLUGIN_HANDLED
if(pev_valid(healthbar))
{
static Float:Origin[3], Float:alien_health
pev(Entity, pev_origin, Origin)
Origin[2] += 250.0
engfunc(EngFunc_SetOrigin, healthbar, Origin)
pev(Entity, pev_health, alien_health)
if(Phobos_HEALTH < (alien_health))
{
set_pev(healthbar, pev_frame, 99.0)
}
else
{
set_pev(healthbar, pev_frame, 0.0 + ((((alien_health) - 1 ) * 100) / Phobos_HEALTH))
}
}
return PLUGIN_CONTINUE
}
public round_end()
{
//zp_set_umm_start()
}
public plugin_natives()
{
register_native("alien_start", "alien_start", 1)
}
public alien_start()
{
return g_game_start
}