Code:
#include < amxmodx >
#include < fakemeta >
#include < engine >
#include < hamsandwich >
#include < xs >
#include < fakemeta_util >
#include <colorchat>
native zp_get_user_zombie( iPlayer );
native zp_get_user_ammo_packs( iPlayer );
native zp_set_user_ammo_packs( iPlayer, iPacks );
native zp_get_user_nemesis( i );
native zp_is_lnj_round( );
native Float: HattrickRange( i, j );
#define HattrickRange(%1,%2) entity_range(%1,%2)
new q;
#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 6
#define MINE_CLASSNAME "zp_trip_mine"
#define MINE_MODEL_EXPLODE "sprites/zerogxplode.spr"
#define MINE_MODEL_VIEW "models/ZmS-ZomBIE/v_laser_mine.mdl"
#define MINE_SOUND_ACTIVATE "weapons/mine_activate.wav"
#define MINE_SOUND_CHARGE "weapons/mine_charge.wav"
#define MINE_SOUND_DEPLOY "weapons/mine_deploy.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 ) )
const FFADE_IN = 0x0000
new g_iTripMines[ 33 ];
new g_iPlantedMines[ 33 ];
new g_iPlanting[ 33 ];
new g_iRemoving[ 33 ];
new g_hExplode;
public plugin_init( )
{
register_plugin( "[ZP] Trip Mines", "1.0", "R.I.P" );
register_clcmd( "say /lm", "Command_Buy" );
register_clcmd( "say lm", "Command_Buy" );
q=get_user_msgid("SayText");
register_clcmd( "+setlaser", "Command_Plant" );
register_clcmd( "+dellaser", "Command_Take" );
register_logevent( "Event_RoundStart", 2, "1=Round_Start" );
register_think( MINE_CLASSNAME, "Forward_Think" );
}
qwerty(number = 0)
{
static str[15], strpointed[15], len, c, i; c = 0
num_to_str(number, str, 14)
len = strlen(str)
strpointed = ""
for (i = 0 ; i < len; i++)
{
if (i != 0 && ((len-i)%3==0))
{
add(strpointed, 14, ",", 1)
c++
add(strpointed[i+c], 1, str[i], 1)
}
else add(strpointed[i+c], 1, str[i], 1)
}
return strpointed
}
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 );
g_hExplode = engfunc( EngFunc_PrecacheModel, MINE_MODEL_EXPLODE );
}
public client_disconnect( iPlayer )
{
g_iTripMines[ iPlayer ] = 0;
g_iPlanting[ iPlayer ] = false;
g_iRemoving[ iPlayer ] = false;
if( g_iPlantedMines[ iPlayer ] )
{
Func_RemoveMinesByOwner( iPlayer );
g_iPlantedMines[ iPlayer ] = 0;
}
remove_task( iPlayer + TASK_REMOVE );
remove_task( iPlayer + TASK_CREATE );
}
public Command_Buy( iPlayer )
{
if( !is_user_alive( iPlayer ) )
{
ColorChat(iPlayer,GREY,"^x04-[*ZmS*]-^x01 You should be ^x04Alive ^x01!!!" );
return PLUGIN_CONTINUE;
}
if( zp_get_user_zombie( iPlayer ) )
{
ColorChat(iPlayer,GREY,"^x04-[*ZmS*]-^x01 You should be ^x04Human ^x01!!!" );
return PLUGIN_CONTINUE;
}
if( zp_get_user_ammo_packs( iPlayer ) < MINE_COST )
{
ColorChat(iPlayer,GREY,"^x04-[*ZmS*]-^x01 You need ^x04%i^x01 Ammo packs ^x04!!!", MINE_COST );
return PLUGIN_CONTINUE;
}
if( zp_is_lnj_round( ) )
{
ColorChat(iPlayer,GREY,"^x04-[*ZmS*]-^x01 You can't buy a ^x04Tripmine^x01 into an ^x04Armageddon ^x01!!!" );
return PLUGIN_CONTINUE;
}
zp_set_user_ammo_packs( iPlayer, zp_get_user_ammo_packs( iPlayer ) - MINE_COST );
g_iTripMines[ iPlayer ]++;
ColorChat(iPlayer,GREY,"^x04-[*ZmS*]-^x01 You bought a ^x04Trip mine.^x01 Press ^x04V^x01 to plant it or^x04 C ^x01to ^x04take it ^x01!!!" );
client_cmd( iPlayer, "bind v +setlaser" );
client_cmd( iPlayer, "bind c +dellaser" );
return PLUGIN_CONTINUE;
}
public Command_Plant( iPlayer )
{
if( !is_user_alive( iPlayer ) )
{
ColorChat(iPlayer,GREY,"^x04-[*ZmS*]-^x01 You should be ^x04Alive ^x01!!!" );
return PLUGIN_CONTINUE;
}
if( zp_get_user_zombie( iPlayer ) )
{
ColorChat(iPlayer,GREY,"^x04-[*ZmS*]-^x01 You should be ^x04Human ^x01!!!" );
return PLUGIN_CONTINUE;
}
if( !g_iTripMines[ iPlayer ] )
{
ColorChat(iPlayer,GREY,"^x04-[*ZmS*]-^x01 You don't have a ^x04Tripmine^x01 to ^x04plant ^x01!!!" );
return PLUGIN_CONTINUE;
}
if( g_iPlantedMines[ iPlayer ] > 1 )
{
ColorChat(iPlayer,GREY,"^x04-[*ZmS*]-^x01 You can ^x04plant^x01 only ^x042 Mines ^x01!!!" );
return PLUGIN_CONTINUE;
}
if( zp_is_lnj_round( ) )
{
ColorChat(iPlayer,GREY,"^x04-[*ZmS*]-^x01 You can't buy a ^x04Tripmine^x01 into an ^x04Armageddon ^x01!!!" );
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 ) )
{
ColorChat(iPlayer,GREY,"^x04-[*ZmS*]-^x01 You should be ^x04Alive ^x01!!!" );
return PLUGIN_CONTINUE;
}
if( zp_get_user_zombie( iPlayer ) )
{
ColorChat(iPlayer,GREY,"^x04-[*ZmS*]-^x01 You should be ^x04Human ^x01!!!" );
return PLUGIN_CONTINUE;
}
if( !g_iPlantedMines[ iPlayer ] )
{
ColorChat(iPlayer,GREY,"^x04-[*ZmS*]-^x01 You don't have a ^x04planted mine ^x01!!!" );
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;
}
}
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 ) {
g_iPlantedMines[ iPlayer ]--;
g_iTripMines[ iPlayer ]++;
remove_entity( iEntity );
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 ) {
ColorChat(iPlayer,GREY,"^x04-[*ZmS*]-^x01 You must plant the ^x04Tripmine^x01 on a ^x04Wall ^x01!!!" );
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 ]++;
set_pev( iEntity, pev_iuser3, g_iPlantedMines[ iPlayer ] );
fm_set_rendering(iEntity, kRenderFxGlowShell, 42, 112, 209, kRenderNormal, 16);
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 );
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 ) {
g_iPlantedMines[ entity_get_owner( iEntity ) ]--;
static Float: flOrigin[ 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( );
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( 65 );
write_byte( 15 );
write_byte( 0 );
message_end( );
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( 85 );
write_byte( 15 );
write_byte( 0 );
message_end( );
for( new i = 1; i < 33; i++ )
{
if( !is_user_connected( i ) || !is_user_alive( i ) ) continue;
if( zp_get_user_zombie( i ) )
{
static Float: fDistance, Float: fDamage;
fDistance = HattrickRange( i, iEntity );
if( fDistance < 340 )
{
fDamage = 1900 - fDistance;
if( !zp_get_user_nemesis( i ) )
fDamage *= 0.75;
static Float: fVelocity[ 3 ];
pev( i, pev_velocity, fVelocity );
xs_vec_mul_scalar( fVelocity, 1.75, fVelocity );
set_pev( i, pev_velocity, fVelocity );
message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "ScreenFade" ), _, i );
write_short( 4096 );
write_short( 4096 );
write_short( FFADE_IN );
write_byte( 255 );
write_byte( 0 );
write_byte( 0 );
write_byte( 225 );
message_end( );
message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "ScreenShake" ), _, i );
write_short( 4096 * 19 );
write_short( 4096 * 7 );
write_short( 4096 * 24 );
message_end( );
if( float( get_user_health( i ) ) - fDamage > 0 )
ExecuteHamB( Ham_TakeDamage, i, iEntity, entity_get_owner( iEntity ), fDamage, DMG_BLAST );
else ExecuteHamB( Ham_Killed, i, entity_get_owner( iEntity ), 2 );
static cName[ 32 ]; get_user_name( i, cName, 31 );
Message( entity_get_owner( iEntity ), "^x04-[*ZmS*]-^x01 Damage to^x03 %s^x01 ::^x04 %0.0f damage", cName,fDamage );
}
}
}
for( new i = 1; i < 33; i++ )
{
if( !is_user_connected( i ) || !is_user_alive( i ) )
continue;
if( !zp_get_user_zombie( i ) )
{
if( HattrickRange( i, iEntity ) < 340 )
{
static Float: fVelocity[ 3 ];
pev( i, pev_velocity, fVelocity );
xs_vec_mul_scalar( fVelocity, 1.5, fVelocity );
set_pev( i, pev_velocity, fVelocity );
message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "ScreenShake" ), _, i );
write_short( 4096 * 19 );
write_short( 4096 * 7 );
write_short( 4096 * 24 );
message_end( );
}
}
}
remove_entity( iEntity );
}
public Forward_Think( iEntity ) {
static Float: flGameTime, iStatus;
flGameTime = get_gametime( );
iStatus = entity_get_status( iEntity );
switch( iStatus ) {
case MINE_OFF: {
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, PITCH_NORM );
}
case MINE_ON: {
static Float: flHealth;
flHealth = entity_get_float( iEntity, EV_FL_health );
if( is_user_alive( entity_get_owner( iEntity ) ) )
{
if( pev( iEntity, pev_iuser3 ) == 1 )
set_hudmessage(0, 200, 100, 0.05, 0.3, 0, 0.0, 0.12, 2.0, 1.0, -1),
show_hudmessage( entity_get_owner( iEntity ), "Lasermine #1 :: %0.0f HP", flHealth - 1000.0 );
else
set_hudmessage(0, 200, 100, 0.05, 0.32, 0, 0.0, 0.12, 2.0, 1.0, -1),
show_hudmessage( entity_get_owner( iEntity ), "Lasermine #2 :: %0.0f HP", flHealth - 1000.0 );
}
if( flHealth <= 1000.0 ) {
Func_Explode( iEntity );
return FMRES_IGNORED;
}
}
}
if( is_valid_ent( iEntity ) )
entity_set_float( iEntity, EV_FL_nextthink, flGameTime + 0.1 );
return FMRES_IGNORED;
}
Message( v, c[ ], any: ... )
{
static cBuffer[ 192 ];
vformat( cBuffer, 191, c, 3 );
if( v )
{
message_begin( MSG_ONE_UNRELIABLE, q, _, v );
write_byte( v );
write_string( cBuffer );
message_end( );
}
else
{
static i[ 32 ], j, k;
get_players( i, j, "ch" );
for( k = 0; k < j; k++ )
{
message_begin( MSG_ONE_UNRELIABLE, q, _, i[ k ] );
write_byte( i[ k ] );
write_string( cBuffer );
message_end( );
}
}
}