Code:
#include < amxmodx >
#include < engine >
#include < zombieplague >
#include <zmvip>
new const zclass_name[ ] = "Boomer Spit"
new const zclass_info[ ] = "Is Spiting"
new const zclass_model[ ] = "boomer"
new const zclass_clawmodel[ ] = "v_knife_boomer.mdl"
const zclass_health = 1000
const zclass_speed = 200
const Float:zclass_gravity = 1.0
const Float:zclass_knockback = 0.5
new const vomit_sprite[ ] = "sprites/bm1.spr"
new const vomit_sounds[ 2 ][ ] =
{ "zombie_plague/male_boomer_vomit01.wav",
"zombie_plague/male_boomer_vomit03.wav" }
new const explode_sounds[ 1 ][ ] =
{ "zombie_plague/explo_medium14.wav" }
new g_zclass_boomer, g_msgid_ScreenFade, g_iMaxPlayers, vomit, cvar_vomitdist, cvar_explodedist, cvar_wakeuptime, cvar_vomitcooldown, cvar_victimrender
// Cooldown hook
new Float:g_iLastVomit[ 33 ]
public plugin_init( )
{
register_plugin( "[ZP] Zombie Class: Boomer", "1.1", "Excalibur.007" )
register_clcmd( "boomer_vomit", "clcmd_vomit" )
register_event( "DeathMsg", "event_DeathMsg", "a" )
cvar_vomitdist = register_cvar( "zp_boomer_vomit_dist", "300" )
cvar_explodedist = register_cvar( "zp_boomer_explode_dist", "300" )
cvar_wakeuptime = register_cvar( "zp_boomer_blind_time", "4" )
cvar_vomitcooldown = register_cvar( "zp_boomer_vomit_cooldown", "10.0" )
cvar_victimrender = register_cvar( "zp_boomer_victim_render", "1" )
g_msgid_ScreenFade = get_user_msgid( "ScreenFade" )
/* - We hook it at here to optimize the plugin a bit
since sv_maxplayers cvar CANNOT BE CHANGED during in-game - */
g_iMaxPlayers = get_maxplayers( )
}
public plugin_precache( )
{
g_zclass_boomer = zp_register_zombie_class( zclass_name, zclass_info, zclass_model, zclass_clawmodel, zclass_health, zclass_speed, zclass_gravity, zclass_knockback )
vomit = precache_model( vomit_sprite )
for( new i = 0; i < sizeof vomit_sounds; i ++ )
precache_sound( vomit_sounds[ i ] )
for( new i = 0; i < sizeof explode_sounds; i ++ )
precache_sound( explode_sounds[ i ] )
}
public zp_user_infected_pre(id) {
if(zv_get_user_flags(id) == 0) {
if(zp_get_user_zombie_class(id) == g_zclass_boomer) {
zp_set_user_zombie_class(id, 0)
client_print(id, print_chat, "Your selected class in only for *VIP* members")
}
}
}
public zp_user_infected_post( id, infector )
{
if( zp_get_user_zombie_class( id ) == g_zclass_boomer && !zp_get_user_nemesis( id ) )
{
client_cmd(id,"bind F1 boomer_vomit")
client_print( id, print_chat, "[ZP] Нажмите F1 (Направив курсор на цель), чтобы изрыгнуть кислоту" )
}
}
public clcmd_vomit( id )
{
if( !is_user_alive( id ) || !is_user_connected( id ) || !zp_get_user_zombie( id ) || zp_get_user_nemesis( id ) || zp_get_user_zombie_class( id ) != g_zclass_boomer )
return PLUGIN_HANDLED
if( get_gametime( ) - g_iLastVomit[ id ] < get_pcvar_float( cvar_vomitcooldown ) )
{
client_print( id, print_chat, "[ZP] Вы должны подождать еще %.f0 сек. чтобы изрыгнуть снова!", get_pcvar_float( cvar_vomitcooldown ) - ( get_gametime( ) - g_iLastVomit[ id ] ) )
return PLUGIN_HANDLED
}
g_iLastVomit[ id ] = get_gametime( )
new target, body, dist = get_pcvar_num( cvar_vomitdist )
get_user_aiming( id, target, body, dist )
new vec[ 3 ], aimvec[ 3 ], velocityvec[ 3 ]
new length
get_user_origin( id, vec )
get_user_origin( id, aimvec, 2 )
velocityvec[ 0 ] = aimvec[ 0 ] - vec[ 0 ]
velocityvec[ 1 ] = aimvec[ 1 ] - vec[ 1 ]
velocityvec[ 2 ] = aimvec[ 2 ] - vec[ 2 ]
length = sqrt( velocityvec[ 0 ] * velocityvec[ 0 ] + velocityvec[ 1 ] * velocityvec[ 1 ] + velocityvec[ 2 ] * velocityvec[ 2 ] )
velocityvec[ 0 ] =velocityvec[ 0 ] * 10 / length
velocityvec[ 1 ] = velocityvec[ 1 ] * 10 / length
velocityvec[ 2 ] = velocityvec[ 2 ] * 10 / length
new args[ 8 ]
args[ 0 ] = vec[ 0 ]
args[ 1 ] = vec[ 1 ]
args[ 2 ] = vec[ 2 ]
args[ 3 ] = velocityvec[ 0 ]
args[ 4 ] = velocityvec[ 1 ]
args[ 5 ] = velocityvec[ 2 ]
set_task( 0.1, "create_sprite", 0, args, 8, "a", 3 )
emit_sound( id, CHAN_STREAM, vomit_sounds[ random_num( 0, 3 ) ], 1.0, ATTN_NORM, 0, PITCH_HIGH )
if( is_valid_ent( target ) && is_user_alive( target ) && is_user_connected( target ) && !zp_get_user_zombie( target ) && get_entity_distance( id, target ) <= dist )
{
message_begin( MSG_ONE_UNRELIABLE, g_msgid_ScreenFade, _, target )
write_short( get_pcvar_num( cvar_wakeuptime ) )
write_short( get_pcvar_num( cvar_wakeuptime ) )
write_short( 0x0004 )
write_byte( 79 )
write_byte( 180 )
write_byte( 61 )
write_byte( 255 )
message_end( )
if( get_pcvar_num( cvar_victimrender ) )
{
set_rendering( target, kRenderFxGlowShell, 79, 180, 61, kRenderNormal, 25 )
}
set_task( get_pcvar_float( cvar_wakeuptime ), "victim_wakeup", target )
}
return PLUGIN_HANDLED
}
public create_sprite( args[ ] )
{
message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
write_byte( 120 )
write_coord( args[ 0 ] )
write_coord( args[ 1 ] )
write_coord( args[ 2 ] )
write_coord( args[ 3 ] )
write_coord( args[ 4 ] )
write_coord( args[ 5 ] )
write_short( vomit )
write_byte( 8 )
write_byte( 70 )
write_byte( 100 )
write_byte( 5 )
message_end( )
return PLUGIN_CONTINUE
}
public victim_wakeup( id )
{
if( !is_user_connected( id ) )
return
message_begin( MSG_ONE_UNRELIABLE, g_msgid_ScreenFade, _, id )
write_short( ( 1<<12 ) )
write_short( 0 )
write_short( 0x0000 )
write_byte( 0 )
write_byte( 0 )
write_byte( 0 )
write_byte( 255 )
message_end( )
if( get_pcvar_num( cvar_victimrender ) )
{
set_rendering( id )
}
}
public event_DeathMsg( )
{
new victim = read_data( 2 )
if( !is_user_connected( victim ) || !zp_get_user_zombie( victim ) || zp_get_user_nemesis( victim ) || zp_get_user_zombie_class( victim ) != g_zclass_boomer )
return
emit_sound( victim, CHAN_STREAM, explode_sounds[ random_num( 0, 3 ) ], 1.0, ATTN_NORM, 0, PITCH_HIGH )
for( new i = 1; i <= g_iMaxPlayers; i ++ )
{
if( !is_valid_ent( i ) || !is_user_alive( i ) || !is_user_connected( i ) || zp_get_user_zombie( i ) || get_entity_distance( victim, i ) > get_pcvar_num( cvar_explodedist ) )
return
message_begin( MSG_ONE_UNRELIABLE, g_msgid_ScreenFade, _, i )
write_short( get_pcvar_num( cvar_wakeuptime ) )
write_short( get_pcvar_num( cvar_wakeuptime ) )
write_short( 0x0004 )
write_byte( 79 )
write_byte( 180 )
write_byte( 61 )
write_byte( 255 )
message_end( )
if( get_pcvar_num( cvar_victimrender ) )
{
set_rendering( i, kRenderFxGlowShell, 79, 180, 61, kRenderNormal, 25 )
}
set_task( get_pcvar_float( cvar_wakeuptime ), "victim_wakeup", i )
}
}
public sqrt( num )
{
new div = num
new result = 1
while( div > result )
{
div = ( div + result ) / 2
result = num / div
}
return div
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/