Chihuahuax
11-03-2015 01:59
set_task on Entity? (Tripmine)
Is it fine for me to use a set_task on Entity?
For now it works fine, but I just want to make sure it doesnt crash server or whatever:
(Highlighted red)
Code:
public Func_Plant( iPlayer ) {
iPlayer -= TASK_CREATE;
g_iPlanting[ iPlayer ] = false;
static Float: flOrigin[ 3 ];
entity_get_vector( iPlayer, EV_VEC_origin, flOrigin );
static Float: flTraceDirection[ 3 ], Float: flTraceEnd[ 3 ], Float: flTraceResult[ 3 ], Float: flNormal[ 3 ];
velocity_by_aim( iPlayer, 128, flTraceDirection );
flTraceEnd[ 0 ] = flTraceDirection[ 0 ] + flOrigin[ 0 ];
flTraceEnd[ 1 ] = flTraceDirection[ 1 ] + flOrigin[ 1 ];
flTraceEnd[ 2 ] = flTraceDirection[ 2 ] + flOrigin[ 2 ];
static Float: flFraction, iTr;
iTr = 0;
engfunc( EngFunc_TraceLine, flOrigin, flTraceEnd, 0, iPlayer, iTr );
get_tr2( iTr, TR_vecEndPos, flTraceResult );
get_tr2( iTr, TR_vecPlaneNormal, flNormal );
get_tr2( iTr, TR_flFraction, flFraction );
static iEntity;
iEntity = create_entity( "info_target" );
if( !iEntity )
return;
entity_set_string( iEntity, EV_SZ_classname, MINE_CLASSNAME );
entity_set_model( iEntity, MINE_MODEL_VIEW );
entity_set_size( iEntity, Float: { -4.0, -4.0, -4.0 }, Float: { 4.0, 4.0, 4.0 } );
entity_set_int( iEntity, EV_INT_iuser2, iPlayer );
g_iPlantedMines[ iPlayer ]++;
if (g_iMineIds[iPlayer][0]==0)
g_iMineIds[iPlayer][0] = iEntity;
else
g_iMineIds[iPlayer][1] = iEntity;
entity_set_float( iEntity, EV_FL_frame, 0.0 );
entity_set_float( iEntity, EV_FL_framerate, 0.0 );
entity_set_int( iEntity, EV_INT_movetype, MOVETYPE_FLY );
entity_set_int( iEntity, EV_INT_solid, SOLID_NOT );
entity_set_int( iEntity, EV_INT_body, 3 );
entity_set_int( iEntity, EV_INT_sequence, 7 );
entity_set_float( iEntity, EV_FL_takedamage, DAMAGE_NO );
entity_set_int( iEntity, EV_INT_iuser1, MINE_OFF );
static Float: flNewOrigin[ 3 ], Float: flEntAngles[ 3 ];
flNewOrigin[ 0 ] = flTraceResult[ 0 ] + ( flNormal[ 0 ] * 8.0 );
flNewOrigin[ 1 ] = flTraceResult[ 1 ] + ( flNormal[ 1 ] * 8.0 );
flNewOrigin[ 2 ] = flTraceResult[ 2 ] + ( flNormal[ 2 ] * 8.0 );
entity_set_origin( iEntity, flNewOrigin );
vector_to_angle( flNormal, flEntAngles );
entity_set_vector( iEntity, EV_VEC_angles, flEntAngles );
flEntAngles[ 0 ] *= -1.0;
flEntAngles[ 1 ] *= -1.0;
flEntAngles[ 2 ] *= -1.0;
entity_set_vector( iEntity, EV_VEC_v_angle, flEntAngles );
g_iTripMines[ iPlayer ]--;
emit_sound( iEntity, CHAN_WEAPON, MINE_SOUND_DEPLOY, VOL_NORM, ATTN_NORM, 0, PITCH_NORM );
emit_sound( iEntity, CHAN_VOICE, MINE_SOUND_CHARGE, VOL_NORM, ATTN_NORM, 0, PITCH_NORM );
set_task(2.5 , "MINE_ACTIVATED", iEntity);
client_print_color(iPlayer, Grey, "^x04[ZP]^x01 Tripmine has been planted! You have^x04 %i tripmines^x01 left.", g_iTripMines[ iPlayer ])
entity_set_float( iEntity, EV_FL_nextthink, get_gametime( ) + 0.6 );
}
Code:
public MINE_ACTIVATED(iEntity)
{
if( !is_valid_ent( iEntity ) )
return;
entity_set_int( iEntity, EV_INT_iuser1, MINE_ON );
entity_set_float( iEntity, EV_FL_takedamage, DAMAGE_YES );
entity_set_int( iEntity, EV_INT_solid, SOLID_BBOX );
entity_set_float( iEntity, EV_FL_health, MINE_HEALTH + 1000.0 );
emit_sound( iEntity, CHAN_VOICE, MINE_SOUND_ACTIVATE, VOL_NORM, ATTN_NORM, 0, 75 );
return;
}
Full code:
Spoiler
PHP Code:
#include < amxmodx >
#include < fakemeta >
#include < engine >
#include < hamsandwich >
#include < colorchat >
#include < zombie_plague_advance >
#define MAX_ENTITIES 600
#define MAX_PLAYERS 32
#define MINE_ON 1
#define MINE_OFF 0
#define TASK_CREATE 84765
#define TASK_REMOVE 86766
#define MINE_COST 5
#define MINE_CLASSNAME "zp_trip_mine"
#define MINE_MODEL_EXPLODE "sprites/zerogxplode.spr"
#define MINE_MODEL_VIEW "models/ReverseZM/laser_mine.mdl"
#define MINE_SOUND_ACTIVATE "ReverseZM/mine_activate.wav"
#define MINE_SOUND_CHARGE "ReverseZM/mine_charge.wav"
#define MINE_SOUND_DEPLOY "ReverseZM/mine_deploy.wav"
#define MINE_SOUND_TAKE "items/gunpickup2.wav"
#define MINE_HEALTH 800.0
#define entity_get_owner(%0) entity_get_int( %0, EV_INT_iuser2 )
#define entity_get_status(%0) entity_get_int( %0, EV_INT_iuser1 )
#define entity_get_classname(%0,%1) entity_get_string( %0, EV_SZ_classname, %1, charsmax( %1 ) )
#define FADE_IN 0x0000
new g_iTripMines [ 33 ];
new g_iPlantedMines [ 33 ];
new g_iPlanting [ 33 ];
new g_iRemoving [ 33 ];
new g_iMineIds [ 33 ][ 2 ];
new g_hExplode ;
new g_hud [ 3 ];
new g_itemid_tripmine ;
public plugin_init ( )
{
register_plugin ( "[ZP] Trip Mines" , "1.0" , "Hattrick" );
g_itemid_tripmine = zp_register_extra_item ( "Tripmine" , 5 , ZP_TEAM_HUMAN )
register_clcmd ( "say /lm" , "Command_Buy" );
register_clcmd ( "say lm" , "Command_Buy" );
register_clcmd ( "plant_mine" , "Command_Plant" );
register_clcmd ( "take_mine" , "Command_Take" );
register_logevent ( "Event_RoundStart" , 2 , "1=Round_Start" );
register_think ( MINE_CLASSNAME , "Forward_Think" );
RegisterHam ( Ham_TakeDamage , "info_target" , "OnTripmineTakeDamage" )
g_hud [ 0 ] = CreateHudSyncObj ();
g_hud [ 1 ] = CreateHudSyncObj ();
}
public plugin_precache ( )
{
engfunc ( EngFunc_PrecacheModel , MINE_MODEL_VIEW );
engfunc ( EngFunc_PrecacheSound , MINE_SOUND_ACTIVATE );
engfunc ( EngFunc_PrecacheSound , MINE_SOUND_CHARGE );
engfunc ( EngFunc_PrecacheSound , MINE_SOUND_DEPLOY );
engfunc ( EngFunc_PrecacheSound , MINE_SOUND_TAKE );
g_hExplode = engfunc ( EngFunc_PrecacheModel , MINE_MODEL_EXPLODE );
}
public client_disconnect ( iPlayer )
{
g_iTripMines [ iPlayer ] = 0 ;
g_iPlanting [ iPlayer ] = false ;
g_iRemoving [ iPlayer ] = false ;
g_iMineIds [ iPlayer ][ 0 ] = 0 ;
g_iMineIds [ iPlayer ][ 1 ] = 0 ;
if( g_iPlantedMines [ iPlayer ] )
{
Func_RemoveMinesByOwner ( iPlayer );
g_iPlantedMines [ iPlayer ] = 0 ;
}
remove_task ( iPlayer + TASK_REMOVE );
remove_task ( iPlayer + TASK_CREATE );
}
public zp_extra_item_selected ( iPlayer , itemid )
{
if ( itemid == g_itemid_tripmine )
{
if (! zp_has_round_started ())
{
client_print_color ( iPlayer , Grey , "^4[ZP]^1 To buy tripmines, you have to wait until the round starts." );
return ZP_PLUGIN_HANDLED ;
}
g_iTripMines [ iPlayer ]++;
emit_sound ( iPlayer , CHAN_ITEM , MINE_SOUND_TAKE , VOL_NORM , ATTN_NORM , 0 , PITCH_NORM )
client_print_color ( iPlayer , Grey , "^x04[ZP]^x01 You have %i tripmines." , g_iTripMines [ iPlayer ] );
client_print_color ( iPlayer , Grey , "^x04[ZP]^x01 Press^x03 P^x01 to plant it or^x03 V^x01 to take it!" );
}
return PLUGIN_CONTINUE ;
}
public OnTripmineTakeDamage ( ent , inflictor , attacker , Float : damage , damagebits )
{
static szClass [ 32 ]; entity_get_classname ( ent , szClass ); //get entity classname
if(! equal ( szClass , MINE_CLASSNAME )) return HAM_IGNORED ; //not a tripmine
if(! is_user_connected ( attacker )) return HAM_IGNORED ; //attacker is not player
if( zp_get_user_zombie ( attacker )) return HAM_IGNORED ; //attacker is zombie
return HAM_SUPERCEDE ;
}
public Command_Buy ( iPlayer )
{
if( ! is_user_alive ( iPlayer ) )
{
client_print_color ( iPlayer , Grey , "^x04[ZP]^x01 You should be alive!" );
return PLUGIN_CONTINUE ;
}
if (! zp_has_round_started ())
{
client_print_color ( iPlayer , Grey , "^4[ZP]^1 To buy tripmines, you have to wait until the round starts." );
return PLUGIN_CONTINUE ;
}
if( zp_get_user_zombie ( iPlayer ) )
{
client_print_color ( iPlayer , Grey , "^x04[ZP]^x01 You should be human!" );
return PLUGIN_CONTINUE ;
}
if( zp_get_user_survivor ( iPlayer ) )
{
client_print_color ( iPlayer , Grey , "^x04[ZP]^x01 You should be human!" );
return PLUGIN_CONTINUE ;
}
if( zp_get_user_sniper ( iPlayer ) )
{
client_print_color ( iPlayer , Grey , "^x04[ZP]^x01 You should be human!" );
return PLUGIN_CONTINUE ;
}
if( zp_get_user_ammo_packs ( iPlayer ) < MINE_COST )
{
client_print_color ( iPlayer , Grey , "^x04[ZP]^x01 You need %i ammo packs" , MINE_COST );
return PLUGIN_CONTINUE ;
}
zp_set_user_ammo_packs ( iPlayer , zp_get_user_ammo_packs ( iPlayer ) - MINE_COST );
g_iTripMines [ iPlayer ]++;
emit_sound ( iPlayer , CHAN_ITEM , MINE_SOUND_TAKE , VOL_NORM , ATTN_NORM , 0 , PITCH_NORM )
client_print_color ( iPlayer , Grey , "^x04[ZP]^x01 You have %i tripmines." , g_iTripMines [ iPlayer ] );
client_print_color ( iPlayer , Grey , "^x04[ZP]^x01 Press^x03 P^x01 to plant it or^x03 V^x01 to take it!" );
return PLUGIN_CONTINUE ;
}
public Command_Plant ( iPlayer )
{
if( ! is_user_alive ( iPlayer ) )
{
client_print_color ( iPlayer , Grey , "^x04[ZP]^x01 You should be alive!" );
return PLUGIN_CONTINUE ;
}
if (! zp_has_round_started ())
{
client_print_color ( iPlayer , Grey , "^4[ZP]^1 To plant tripmines, you have to wait until the round starts." );
return PLUGIN_CONTINUE ;
}
if( zp_get_user_zombie ( iPlayer ) )
{
client_print_color ( iPlayer , Grey , "^x04[ZP]^x01 You should be human!" );
return PLUGIN_CONTINUE ;
}
if( zp_get_user_survivor ( iPlayer ) )
{
client_print_color ( iPlayer , Grey , "^x04[ZP]^x01 You should be human!" );
return PLUGIN_CONTINUE ;
}
if( zp_get_user_sniper ( iPlayer ) )
{
client_print_color ( iPlayer , Grey , "^x04[ZP]^x01 You should be human!" );
return PLUGIN_CONTINUE ;
}
if( ! g_iTripMines [ iPlayer ] )
{
client_print_color ( iPlayer , Grey , "^x04[ZP]^x01 You don't have a trip mine to plant" );
return PLUGIN_CONTINUE ;
}
if( g_iPlantedMines [ iPlayer ] > 1 )
{
client_print_color ( iPlayer , Grey , "^x04[ZP]^x01 You can plant only 2 mines!" );
return PLUGIN_CONTINUE ;
}
if( g_iPlanting [ iPlayer ] || g_iRemoving [ iPlayer ] )
return PLUGIN_CONTINUE ;
if( CanPlant ( iPlayer ) ) {
g_iPlanting [ iPlayer ] = true ;
message_begin ( MSG_ONE_UNRELIABLE , 108 , _ , iPlayer );
write_byte ( 1 );
write_byte ( 0 );
message_end ( );
set_task ( 1.2 , "Func_Plant" , iPlayer + TASK_CREATE );
}
return PLUGIN_CONTINUE ;
}
public Command_Take ( iPlayer )
{
if( ! is_user_alive ( iPlayer ) )
{
client_print_color ( iPlayer , Grey , "^x04[ZP]^x01 You should be alive!" );
return PLUGIN_CONTINUE ;
}
if( zp_get_user_zombie ( iPlayer ) )
{
client_print_color ( iPlayer , Grey , "^x04[ZP]^x01 You should be human!" );
return PLUGIN_CONTINUE ;
}
if( ! g_iPlantedMines [ iPlayer ] )
{
client_print_color ( iPlayer , Grey , "^x04[ZP]^x01 You don't have a planted mine!" );
return PLUGIN_CONTINUE ;
}
if( g_iPlanting [ iPlayer ] || g_iRemoving [ iPlayer ] )
return PLUGIN_CONTINUE ;
if( CanTake ( iPlayer ) ) {
g_iRemoving [ iPlayer ] = true ;
message_begin ( MSG_ONE_UNRELIABLE , 108 , _ , iPlayer );
write_byte ( 1 );
write_byte ( 0 );
message_end ( );
set_task ( 1.2 , "Func_Take" , iPlayer + TASK_REMOVE );
}
return PLUGIN_CONTINUE ;
}
public Event_RoundStart ( ) {
static iEntity , szClassName [ 32 ], iPlayer ;
for( iEntity = 0 ; iEntity < MAX_ENTITIES + 1 ; iEntity ++ ) {
if( ! is_valid_ent ( iEntity ) )
continue;
szClassName [ 0 ] = '^0' ;
entity_get_classname ( iEntity , szClassName );
if( equal ( szClassName , MINE_CLASSNAME ) )
remove_entity ( iEntity );
}
for( iPlayer = 1 ; iPlayer < 33 ; iPlayer ++ ) {
g_iTripMines [ iPlayer ] = 0 ;
g_iPlantedMines [ iPlayer ] = 0 ;
g_iMineIds [ iPlayer ][ 0 ] = 0 ;
g_iMineIds [ iPlayer ][ 1 ] = 0 ;
}
}
public Func_Take ( iPlayer ) {
iPlayer -= TASK_REMOVE ;
g_iRemoving [ iPlayer ] = false ;
static iEntity , szClassName [ 32 ], Float : flOwnerOrigin [ 3 ], Float : flEntityOrigin [ 3 ];
for( iEntity = 0 ; iEntity < MAX_ENTITIES + 1 ; iEntity ++ ) {
if( ! is_valid_ent ( iEntity ) )
continue;
szClassName [ 0 ] = '^0' ;
entity_get_classname ( iEntity , szClassName );
if( equal ( szClassName , MINE_CLASSNAME ) ) {
if( entity_get_owner ( iEntity ) == iPlayer ) {
entity_get_vector ( iPlayer , EV_VEC_origin , flOwnerOrigin );
entity_get_vector ( iEntity , EV_VEC_origin , flEntityOrigin );
if( get_distance_f ( flOwnerOrigin , flEntityOrigin ) < 55.0 ) {
if ( g_iMineIds [ iPlayer ][ 0 ] == iEntity )
g_iMineIds [ iPlayer ][ 0 ] = 0 ;
else if ( g_iMineIds [ iPlayer ][ 1 ] == iEntity )
g_iMineIds [ iPlayer ][ 1 ] = 0 ;
g_iPlantedMines [ iPlayer ]--;
g_iTripMines [ iPlayer ]++;
remove_entity ( iEntity );
emit_sound ( iPlayer , CHAN_ITEM , MINE_SOUND_TAKE , VOL_NORM , ATTN_NORM , 0 , PITCH_NORM )
break;
}
}
}
}
}
public bool : CanTake ( iPlayer ) {
static iEntity , szClassName [ 32 ], Float : flOwnerOrigin [ 3 ], Float : flEntityOrigin [ 3 ];
for( iEntity = 0 ; iEntity < MAX_ENTITIES + 1 ; iEntity ++ ) {
if( ! is_valid_ent ( iEntity ) )
continue;
szClassName [ 0 ] = '^0' ;
entity_get_classname ( iEntity , szClassName );
if( equal ( szClassName , MINE_CLASSNAME ) ) {
if( entity_get_owner ( iEntity ) == iPlayer ) {
entity_get_vector ( iPlayer , EV_VEC_origin , flOwnerOrigin );
entity_get_vector ( iEntity , EV_VEC_origin , flEntityOrigin );
if( get_distance_f ( flOwnerOrigin , flEntityOrigin ) < 55.0 )
return true ;
}
}
}
return false ;
}
public bool : CanPlant ( iPlayer ) {
static Float : flOrigin [ 3 ];
entity_get_vector ( iPlayer , EV_VEC_origin , flOrigin );
static Float : flTraceDirection [ 3 ], Float : flTraceEnd [ 3 ], Float : flTraceResult [ 3 ], Float : flNormal [ 3 ];
velocity_by_aim ( iPlayer , 64 , flTraceDirection );
flTraceEnd [ 0 ] = flTraceDirection [ 0 ] + flOrigin [ 0 ];
flTraceEnd [ 1 ] = flTraceDirection [ 1 ] + flOrigin [ 1 ];
flTraceEnd [ 2 ] = flTraceDirection [ 2 ] + flOrigin [ 2 ];
static Float : flFraction , iTr ;
iTr = 0 ;
engfunc ( EngFunc_TraceLine , flOrigin , flTraceEnd , 0 , iPlayer , iTr );
get_tr2 ( iTr , TR_vecEndPos , flTraceResult );
get_tr2 ( iTr , TR_vecPlaneNormal , flNormal );
get_tr2 ( iTr , TR_flFraction , flFraction );
if( flFraction >= 1.0 ) {
client_print_color ( iPlayer , GREY , "^x04[ZP]^x01 You must plant the tripmine on a wall!" );
return false ;
}
return true ;
}
public Func_Plant ( iPlayer ) {
iPlayer -= TASK_CREATE ;
g_iPlanting [ iPlayer ] = false ;
static Float : flOrigin [ 3 ];
entity_get_vector ( iPlayer , EV_VEC_origin , flOrigin );
static Float : flTraceDirection [ 3 ], Float : flTraceEnd [ 3 ], Float : flTraceResult [ 3 ], Float : flNormal [ 3 ];
velocity_by_aim ( iPlayer , 128 , flTraceDirection );
flTraceEnd [ 0 ] = flTraceDirection [ 0 ] + flOrigin [ 0 ];
flTraceEnd [ 1 ] = flTraceDirection [ 1 ] + flOrigin [ 1 ];
flTraceEnd [ 2 ] = flTraceDirection [ 2 ] + flOrigin [ 2 ];
static Float : flFraction , iTr ;
iTr = 0 ;
engfunc ( EngFunc_TraceLine , flOrigin , flTraceEnd , 0 , iPlayer , iTr );
get_tr2 ( iTr , TR_vecEndPos , flTraceResult );
get_tr2 ( iTr , TR_vecPlaneNormal , flNormal );
get_tr2 ( iTr , TR_flFraction , flFraction );
static iEntity ;
iEntity = create_entity ( "info_target" );
if( ! iEntity )
return;
entity_set_string ( iEntity , EV_SZ_classname , MINE_CLASSNAME );
entity_set_model ( iEntity , MINE_MODEL_VIEW );
entity_set_size ( iEntity , Float : { - 4.0 , - 4.0 , - 4.0 }, Float : { 4.0 , 4.0 , 4.0 } );
entity_set_int ( iEntity , EV_INT_iuser2 , iPlayer );
g_iPlantedMines [ iPlayer ]++;
if ( g_iMineIds [ iPlayer ][ 0 ]== 0 )
g_iMineIds [ iPlayer ][ 0 ] = iEntity ;
else
g_iMineIds [ iPlayer ][ 1 ] = iEntity ;
entity_set_float ( iEntity , EV_FL_frame , 0.0 );
entity_set_float ( iEntity , EV_FL_framerate , 0.0 );
entity_set_int ( iEntity , EV_INT_movetype , MOVETYPE_FLY );
entity_set_int ( iEntity , EV_INT_solid , SOLID_NOT );
entity_set_int ( iEntity , EV_INT_body , 3 );
entity_set_int ( iEntity , EV_INT_sequence , 7 );
entity_set_float ( iEntity , EV_FL_takedamage , DAMAGE_NO );
entity_set_int ( iEntity , EV_INT_iuser1 , MINE_OFF );
static Float : flNewOrigin [ 3 ], Float : flEntAngles [ 3 ];
flNewOrigin [ 0 ] = flTraceResult [ 0 ] + ( flNormal [ 0 ] * 8.0 );
flNewOrigin [ 1 ] = flTraceResult [ 1 ] + ( flNormal [ 1 ] * 8.0 );
flNewOrigin [ 2 ] = flTraceResult [ 2 ] + ( flNormal [ 2 ] * 8.0 );
entity_set_origin ( iEntity , flNewOrigin );
vector_to_angle ( flNormal , flEntAngles );
entity_set_vector ( iEntity , EV_VEC_angles , flEntAngles );
flEntAngles [ 0 ] *= - 1.0 ;
flEntAngles [ 1 ] *= - 1.0 ;
flEntAngles [ 2 ] *= - 1.0 ;
entity_set_vector ( iEntity , EV_VEC_v_angle , flEntAngles );
g_iTripMines [ iPlayer ]--;
emit_sound ( iEntity , CHAN_WEAPON , MINE_SOUND_DEPLOY , VOL_NORM , ATTN_NORM , 0 , PITCH_NORM );
emit_sound ( iEntity , CHAN_VOICE , MINE_SOUND_CHARGE , VOL_NORM , ATTN_NORM , 0 , PITCH_NORM );
set_task ( 2.5 , "MINE_ACTIVATED" , iEntity );
client_print_color ( iPlayer , Grey , "^x04[ZP]^x01 Tripmine has been planted! You have^x04 %i tripmines^x01 left." , g_iTripMines [ iPlayer ])
entity_set_float ( iEntity , EV_FL_nextthink , get_gametime ( ) + 0.6 );
}
public Func_RemoveMinesByOwner ( iPlayer ) {
static iEntity , szClassName [ 32 ];
for( iEntity = 0 ; iEntity < MAX_ENTITIES + 1 ; iEntity ++ ) {
if( ! is_valid_ent ( iEntity ) )
continue;
szClassName [ 0 ] = '^0' ;
entity_get_classname ( iEntity , szClassName );
if( equal ( szClassName , MINE_CLASSNAME ) )
if( entity_get_int ( iEntity , EV_INT_iuser2 ) == iPlayer )
remove_entity ( iEntity );
}
}
Func_Explode ( iEntity ) {
new owner = entity_get_owner ( iEntity );
g_iPlantedMines [ entity_get_owner ( iEntity ) ]--;
if ( g_iMineIds [ owner ][ 0 ] == iEntity )
g_iMineIds [ owner ][ 0 ] = 0 ;
else if ( g_iMineIds [ owner ][ 1 ] == iEntity )
g_iMineIds [ owner ][ 1 ] = 0 ;
static Float : flOrigin [ 3 ], Float : flZombieOrigin [ 3 ], Float : flHealth , Float : flVelocity [ 3 ];
entity_get_vector ( iEntity , EV_VEC_origin , flOrigin );
message_begin ( MSG_BROADCAST , SVC_TEMPENTITY );
write_byte ( TE_EXPLOSION );
engfunc ( EngFunc_WriteCoord , flOrigin [ 0 ] );
engfunc ( EngFunc_WriteCoord , flOrigin [ 1 ] );
engfunc ( EngFunc_WriteCoord , flOrigin [ 2 ] );
write_short ( g_hExplode );
write_byte ( 55 );
write_byte ( 15 );
write_byte ( 0 );
message_end ( );
static iZombie , Float : Damage ;
new name [ 32 ], damagestring [ 16 ];
for( iZombie = 1 ; iZombie < MAX_PLAYERS + 1 ; iZombie ++ ) {
if( is_user_connected ( iZombie ) ) {
if( is_user_alive ( iZombie ) ) {
entity_get_vector ( iZombie , EV_VEC_origin , flZombieOrigin );
if( get_distance_f ( flOrigin , flZombieOrigin ) < 360.0 ) {
flHealth = entity_get_float ( iZombie , EV_FL_health );
entity_get_vector ( iZombie , EV_VEC_velocity , flVelocity );
flVelocity [ 2 ] += 456.0 ;
flVelocity [ 1 ] += 320.0 ;
flVelocity [ 0 ] += 299.0 ;
entity_set_vector ( iZombie , EV_VEC_velocity , flVelocity );
if( zp_get_user_zombie ( iZombie ) )
{
Damage = 1250.0 - get_distance_f ( flOrigin , flZombieOrigin );
do_screen_fade ( iZombie , 0.45 , 230 , 0 , 0 , 200 );
client_cmd ( iZombie , "spk fvox/flatline" )
get_user_name ( iZombie , name , 31 )
AddCommas ( floatround ( Damage ), damagestring , 15 )
client_print_color ( owner , Grey , "^x04[Tripmine]^x01 Damage to^x03 %s^x01 ::^x04 %s damage" , name , damagestring )
if (!( flHealth - Damage > 0.0 ))
ExecuteHamB ( Ham_Killed , iZombie , owner , 2 );
else
ExecuteHam ( Ham_TakeDamage , iZombie , iEntity , owner , Damage , DMG_MORTAR );
}
}
}
}
}
remove_entity ( iEntity );
}
public Forward_Think ( iEntity ) {
new owner = entity_get_owner ( iEntity );
static Float : flGameTime , iStatus ;
flGameTime = get_gametime ( );
iStatus = entity_get_status ( iEntity );
switch( iStatus ) {
case MINE_OFF : {
}
case MINE_ON : {
static Float : flHealth ;
flHealth = entity_get_float ( iEntity , EV_FL_health );
if( flHealth <= 1000.0 ) {
Func_Explode ( iEntity );
return FMRES_IGNORED ;
}
else
{
if ( g_iMineIds [ owner ][ 0 ] == iEntity )
{
set_hudmessage ( 0 , 191 , 255 , 0.1 , 0.37 , 0 , 6.0 , 0.11 , 0.1 , 0.2 ,- 1 );
ShowSyncHudMsg ( owner , g_hud [ 0 ], "First mine's health: %d" , max ( floatround ( flHealth - 1000.0 ), 0 ));
}
else
{
set_hudmessage ( 0 , 191 , 255 , 0.1 , 0.41 , 0 , 6.0 , 0.11 , 0.1 , 0.2 ,- 1 );
ShowSyncHudMsg ( owner , g_hud [ 1 ], "Second mine's health: %d" , max ( floatround ( flHealth - 1000.0 ), 0 ));
}
}
}
}
if( is_valid_ent ( iEntity ) )
entity_set_float ( iEntity , EV_FL_nextthink , flGameTime + 0.1 );
return FMRES_IGNORED ;
}
public MINE_ACTIVATED ( iEntity )
{
if( ! is_valid_ent ( iEntity ) )
return;
entity_set_int ( iEntity , EV_INT_iuser1 , MINE_ON );
entity_set_float ( iEntity , EV_FL_takedamage , DAMAGE_YES );
entity_set_int ( iEntity , EV_INT_solid , SOLID_BBOX );
entity_set_float ( iEntity , EV_FL_health , MINE_HEALTH + 1000.0 );
emit_sound ( iEntity , CHAN_VOICE , MINE_SOUND_ACTIVATE , VOL_NORM , ATTN_NORM , 0 , 75 );
return;
}
AddCommas ( iNum , szOutput [], iLen )
{
static szTmp [ 15 ], iOutputPos , iNumPos , iNumLen ;
szTmp [ 0 ]= '^0' , iOutputPos = iNumPos = iNumLen = 0 ;
if ( iNum < 0 )
{
szOutput [ iOutputPos ++] = '-' ;
iNum = abs ( iNum );
}
iNumLen = num_to_str ( iNum , szTmp , charsmax ( szTmp ));
if ( iNumLen <= 3 )
iOutputPos += copy ( szOutput [ iOutputPos ] , iLen , szTmp );
else
{
while ( ( iNumPos < iNumLen ) && ( iOutputPos < iLen ) )
{
szOutput [ iOutputPos ++ ] = szTmp [ iNumPos ++ ];
if( ( iNumLen - iNumPos ) && !( ( iNumLen - iNumPos ) % 3 ) )
szOutput [ iOutputPos ++ ] = ',' ;
}
szOutput [ iOutputPos ] = EOS ;
}
return iOutputPos ;
}
do_screen_fade ( id , Float : fadeTime , red , green , blue , alpha , type = FADE_IN )
{
new hold = floatround ( fadeTime * 4096.0 );
message_begin ( MSG_ONE_UNRELIABLE , get_user_msgid ( "ScreenFade" ), _ , id );
write_short ( hold );
write_short ( hold );
write_short ( type );
write_byte ( red );
write_byte ( green );
write_byte ( blue );
write_byte ( alpha );
message_end ( );
}