PHP Code:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#define VERSION "0.14"
#define OFFSET_HOSTAGE_KILLS 217 // kills for mp_hostagepenalty
#define PLAYER_MAX_SAFE_FALL_SPEED 500.0 // exact (OLD: 488.5)
#define PLAYER_FATAL_FALL_SPEED 960.0 // not exact (OLD: 988.5)
#define DAMAGE_FOR_FALL_SPEED 100.0 // (PLAYER_FATAL_FALL_SPEED - PLAYER_MAX_SAFE_FALL_SPEED)
// animation defines
#define ANIM_KNEEL_HOS 126
#define ANIM_KNEEL_SCI 127
#define FRAME_RATE 3.0
// storage containers
#define WAS_DUCKING pev_iuser1
#define ON_LADDER pev_iuser2
#define ANIMATING pev_iuser3
#define LAST_TOUCHER pev_iuser4
#define ANIM_FRAME pev_fuser1
#define FALL_VELOCITY pev_fuser2
#define CUSTOM_WALL pev_iuser1
// ladder defines
#define MAX_LADDERS 16
#define DIR_NONE -1
#define DIR_EAST 0
#define DIR_NORTH 1
#define DIR_WEST 2
#define DIR_SOUTH 3
new iLadderIndex[ MAX_LADDERS ], iLadderDirection[ MAX_LADDERS ];
new Float:fLadderMins[ MAX_LADDERS ][ 3 ], Float:fLadderMaxs[ MAX_LADDERS ][ 3 ], Float:fLadderOrigin[ MAX_LADDERS ][ 3 ];
new iLadderNum, iClassName[ 10 ], Float:fJumpTime[ 33 ];
new g_pCvarClimbSpeed, g_pCvarCanDuck, g_pCvarDirLadders, g_pCvarFallDmg, g_pCvarDoorDist, g_pCvarFallPenalty, g_pCvarJumpDelay, g_pCvarJumpSpeed;
new mp_hostagepenalty;
new g_iMsgTextMsg;
public plugin_init( )
{
register_plugin( "Prometheus", VERSION, "Avalanche" );
g_pCvarClimbSpeed = register_cvar( "Hostage_Climb_Speed", "256.0" );
g_pCvarCanDuck = register_cvar( "Hostage_can_Duck", "1" );
g_pCvarDirLadders = register_cvar( "Hostage_Directional_Ladders", "1" );
g_pCvarFallDmg = register_cvar( "Hostage_Fall_Damage", "1.0" );
g_pCvarDoorDist = register_cvar( "Hostage_Use_Door_Distance", "64.0" );
g_pCvarFallPenalty = register_cvar( "Hostage_Fall_Penalty", "1" );
g_pCvarJumpDelay = register_cvar( "Hostage_Jump_Delay", "0.25" );
g_pCvarJumpSpeed = register_cvar( "Hostage_Jump_Speed", "256.0" );
mp_hostagepenalty = get_cvar_pointer( "mp_hostagepenalty" );
new iMod[ 16 ];
get_modname( iMod, 15 );
if( !equal( iMod, "cstrike" ) )
{
log_amx( "Prometheus cannot run in %s!", iMod);
pause( "ad" );
return;
}
if( !fm_find_ent_by_class( 1, "hostage_entity" ) )
return;
register_forward( FM_AddToFullPack,"Fw_AddToFullPack", 1 );
RegisterHam( Ham_Think, "hostage_entity", "Fw_Think", 0 );
RegisterHam( Ham_Touch, "hostage_entity", "Fw_Touch", 1 );
RegisterHam( Ham_Player_Jump, "player", "Fw_PlayerJump", 1 );
g_iMsgTextMsg = get_user_msgid( "TextMsg" );
set_task( 0.1, "plugin_cfg" );
new iEnt, i;
while( ( iEnt = fm_find_ent_by_class( iEnt,"func_ladder" ) ) != 0 )
{
iLadderIndex[ iLadderNum ] = iEnt;
pev( iEnt, pev_absmin, fLadderMins[ iLadderNum ] );
pev( iEnt, pev_absmax, fLadderMaxs[ iLadderNum ] );
for( i=0; i<3; i++ ) fLadderOrigin[ iLadderNum ][ i ] = ( fLadderMins[ iLadderNum ][ i ] + fLadderMaxs[ iLadderNum ][ i ]) * 0.5;
iLadderDirection[ iLadderNum ] = get_ladder_direction( iLadderNum );
if( ++iLadderNum >= MAX_LADDERS)
break;
}
}
public plugin_cfg( )
{
new location_cfg[ 33 ];
get_configsdir( location_cfg, charsmax( location_cfg ) );
server_cmd( "exec %s/prometheus.cfg", location_cfg );
server_exec( );
}
public get_ladder_direction( ladder )
{
new eIllus, eWall, Float:fAbsMin[ 3 ], Float:fAbsMax[ 3 ];
while( ( eIllus = fm_find_ent_by_class( eIllus, "func_illusionary" ) ) != 0 )
{
eWall = fm_create_entity( "func_wall" );
set_pev( eWall, pev_solid, SOLID_BSP );
set_pev( eWall, pev_movetype, MOVETYPE_PUSH );
set_pev( eWall, pev_modelindex, pev( eIllus, pev_modelindex ) );
pev( eIllus, pev_absmin, fAbsMin );
pev( eIllus, pev_absmax, fAbsMax );
engfunc( EngFunc_SetSize, eWall, fAbsMin, fAbsMax );
set_pev( eWall, CUSTOM_WALL, 1 );
}
new iTr;
new Float:flFraction, Float:fStart[ 3 ], Float:fGoal[ 3 ], Float:fEnd[ 3 ], Float:fDistances[ 4 ];
fStart = fLadderOrigin[ ladder ];
fStart[ 0 ] = fLadderMins[ ladder ][ 0 ];
fGoal = fLadderOrigin[ ladder ];
fGoal[ 0 ] += ( fLadderMaxs[ ladder ][ 0 ]-fLadderMins[ ladder ][ 0 ] ) * 2.0;
engfunc( EngFunc_TraceLine, fStart, fGoal, 0, ladder, iTr );
get_tr2( iTr, TR_flFraction, flFraction );
get_tr2( iTr, TR_vecEndPos, fEnd );
if( flFraction == 1.0 || get_tr2( iTr, TR_StartSolid ) ) fDistances[ DIR_EAST ] = 4096.0;
else
fDistances[ DIR_EAST ] = vector_distance( fLadderOrigin[ ladder ], fEnd );
fStart = fLadderOrigin[ ladder ];
fStart[ 1 ] = fLadderMins[ ladder ][ 1 ];
fGoal = fLadderOrigin[ ladder ];
fGoal[ 1 ] += ( fLadderMaxs[ ladder ][ 1 ]-fLadderMins[ ladder ][ 1 ] ) * 2.0;
engfunc( EngFunc_TraceLine, fStart, fGoal, 0, ladder, iTr );
get_tr2( iTr, TR_flFraction, flFraction );
get_tr2( iTr, TR_vecEndPos, fEnd );
if( flFraction == 1.0 || get_tr2( iTr, TR_StartSolid ) ) fDistances[ DIR_NORTH ] = 4096.0;
else
fDistances[ DIR_NORTH ] = vector_distance( fLadderOrigin[ ladder ], fEnd );
fStart = fLadderOrigin[ ladder ];
fStart[ 0 ] = fLadderMaxs[ ladder ][ 0 ];
fGoal = fLadderOrigin[ ladder ];
fGoal[ 0 ] -= ( fLadderMaxs[ ladder ][ 0 ]-fLadderMins[ ladder ][ 0 ] ) * 2.0;
engfunc( EngFunc_TraceLine, fStart, fGoal, 0, ladder, iTr );
get_tr2( iTr, TR_flFraction, flFraction );
get_tr2( iTr, TR_vecEndPos, fEnd );
if( flFraction == 1.0 || get_tr2( iTr, TR_StartSolid ) ) fDistances[ DIR_WEST ] = 4096.0;
else
fDistances[ DIR_WEST ] = vector_distance( fLadderOrigin[ ladder ], fEnd );
fStart = fLadderOrigin[ ladder ];
fStart[ 1 ] = fLadderMaxs[ ladder ][ 1 ];
fGoal = fLadderOrigin[ ladder ];
fGoal[ 1 ] -= ( fLadderMaxs[ ladder ][ 1 ]-fLadderMins[ ladder ][ 1 ] ) * 2.0;
engfunc( EngFunc_TraceLine, fStart, fGoal, 0, ladder, iTr );
get_tr2( iTr, TR_flFraction, flFraction );
get_tr2( iTr, TR_vecEndPos, fEnd );
if( flFraction == 1.0 || get_tr2( iTr, TR_StartSolid ) ) fDistances[ DIR_SOUTH ] = 4096.0;
else
fDistances[ DIR_SOUTH ] = vector_distance( fLadderOrigin[ ladder ], fEnd );
new i, iClosestDir = DIR_NONE;
for( i=0; i<4; i++ )
{
if( fDistances[ i ] >= 4096.0 )
continue;
if( iClosestDir == DIR_NONE || fDistances[ i ] <= fDistances[ iClosestDir ] )
iClosestDir = i;
}
eWall = 0;
while( ( eWall = fm_find_ent_by_class( eWall, "func_wall" ) ) != 0 )
if( pev( eWall, CUSTOM_WALL ) )
fm_remove_entity( eWall );
return iClosestDir;
}
public Fw_AddToFullPack( es_handle, e, ent, host, hostflags, player, pSet )
{
static iModel[ 9 ];
if( player || !pev_valid( ent ) )
return FMRES_IGNORED;
pev( ent, pev_classname, iClassName, 4 );
if( iClassName[ 0 ] != 'h' || iClassName[ 1 ] != 'o' || iClassName[ 2 ] != 's' || iClassName[ 3 ] != 't' )
return FMRES_IGNORED;
if( pev( ent, ANIMATING ) && !pev( ent, pev_deadflag ) )
{
new Float:fFrame;
pev( ent, ANIM_FRAME, fFrame );
set_es( es_handle, ES_Frame, fFrame );
set_es( es_handle, ES_FrameRate, 0.0 );
pev( ent, pev_model, iModel, 8 );
set_es( es_handle, ES_Sequence, ( iModel[ 7 ] == 's' ) ? ANIM_KNEEL_SCI : ANIM_KNEEL_HOS );
return FMRES_HANDLED;
}
return FMRES_IGNORED;
}
public Fw_Think( ent )
{
static Float:hOrigin[ 3 ];
if( pev( ent, pev_deadflag ) )
{
reset_hostage( ent );
return FMRES_IGNORED;
}
new iLeader = cs_get_hostage_foll( ent );
pev( ent, pev_origin, hOrigin );
hOrigin[ 2 ] += 36.0;
new bool:bHeadSpace = is_monster_hull_vacant( ent, hOrigin );
hOrigin[ 2 ] -= 36.0;
new iFallDmgDeath = hostage_fall_ai( ent, iLeader, get_pcvar_float( g_pCvarFallDmg ) );
if( !iLeader )
{
set_pev( ent, pev_movetype, MOVETYPE_STEP );
set_pev( ent, ON_LADDER, 0);
if( pev( ent, WAS_DUCKING ) && !bHeadSpace )
return FMRES_IGNORED;
set_pev( ent, WAS_DUCKING, 0 );
set_pev( ent, pev_mins, Float:{ -10.0, -10.0, 0.0 } );
set_pev( ent, pev_maxs, Float:{ 10.0, 10.0, 62.0 } );
if( pev( ent, ANIMATING ) )
{
new Float:fFrame;
pev( ent, ANIM_FRAME, fFrame );
if( fFrame - FRAME_RATE > 0.0 )
set_pev( ent, ANIM_FRAME, fFrame-FRAME_RATE );
else
{
set_pev( ent, ANIM_FRAME, 0.0 );
set_pev( ent, ANIMATING, 0 );
}
}
return FMRES_IGNORED;
}
if( iFallDmgDeath )
return FMRES_IGNORED;
new Float:fDoorDist = get_pcvar_float( g_pCvarDoorDist ), Float:fClimbSpeed = get_pcvar_float( g_pCvarClimbSpeed ), Float:fJumpDelay = get_pcvar_float( g_pCvarJumpDelay );
if( fDoorDist > 0.0 )
hostage_door_ai( ent, iLeader, hOrigin, fDoorDist );
if( get_pcvar_num( g_pCvarCanDuck ) )
hostage_duck_ai( ent, iLeader, bHeadSpace );
if( fClimbSpeed > 0.0 )
hostage_ladder_ai( ent, iLeader, hOrigin, fClimbSpeed );
if( fJumpDelay > 0.0 )
hostage_jump_ai( ent, iLeader, fJumpDelay );
return FMRES_IGNORED;
}
hostage_door_ai( ent, leader, Float:hOrigin[ 3 ], Float:maxDist )
{
static Float:lOrigin[3], Float:vecEndPos[ 3 ];
pev( leader, pev_origin, lOrigin );
new iPtr;
engfunc( EngFunc_TraceLine, hOrigin, lOrigin, DONT_IGNORE_MONSTERS, ent, iPtr );
new iHit = get_tr2( iPtr, TR_pHit );
if( iHit <= 0 || iHit == leader || !pev_valid( iHit ) )
return;
get_tr2( iPtr, TR_vecEndPos, vecEndPos );
if( vector_distance( hOrigin, vecEndPos ) > maxDist )
return;
pev( iHit, pev_classname, iClassName, 9 );
if( !equal( iClassName,"func_door" ) )
return;
pev( iHit, pev_targetname, iClassName, 1 );
if( iClassName[ 0 ] )
return;
dllfunc( DLLFunc_Touch, iHit, ent );
return;
}
hostage_fall_ai( ent, leader, Float:dmgModifier )
{
static Float:fVelocity[ 3 ];
if( dmgModifier <= 0.0 )
return 0;
if( !is_user_alive( leader ) )
{
new iLastToucher = pev( ent, LAST_TOUCHER );
if( is_user_alive( iLastToucher ) )
leader = iLastToucher;
else
leader = 0;
}
new Float:fFallVelocity;
pev( ent, FALL_VELOCITY, fFallVelocity );
if( fFallVelocity > PLAYER_MAX_SAFE_FALL_SPEED && ( pev( ent, pev_flags ) & FL_ONGROUND ) )
{
new Float:fFallDamage, Float:fHealth, iFallPenalty = get_pcvar_num( g_pCvarFallPenalty );
pev( ent, pev_health, fHealth );
fFallVelocity -= PLAYER_MAX_SAFE_FALL_SPEED;
fFallDamage = float( floatround( fFallVelocity * DAMAGE_FOR_FALL_SPEED * dmgModifier ) );
if( iFallPenalty && leader )
{
new Float:fPrice;
if( fFallDamage > fHealth ) fPrice = fHealth / 0.055;
else
fPrice = fFallDamage / 0.055;
if( fHealth - fFallDamage <= 0.0 )
fPrice *= 2.0;
fPrice = float( floatround( fPrice / 10.0 ) * 10 );
cs_set_user_money( leader, clamp( cs_get_user_money( leader ) - floatround( fPrice ), 0, 16000 ) );
}
if( fHealth - float( floatround( fFallDamage ) ) <= 0.0 )
{
if( iFallPenalty && leader )
{
static uName[ 32 ], uAuthId[ 32 ], uTeam[ 10 ];
get_user_name( leader, uName, charsmax( uName ) );
get_user_authid( leader, uAuthId, charsmax( uAuthId ) );
get_user_team( leader, uTeam, charsmax( uTeam ) );
log_message("^"%s<%i><%s><%s>^" triggered ^"Killed_A_Hostage^"", uName, get_user_userid( leader ), uAuthId, uTeam );
emessage_begin( MSG_ONE, g_iMsgTextMsg, { 0, 0, 0 }, leader );
ewrite_byte( 4 );
ewrite_string( "#Killed_Hostage" );
emessage_end( );
new iHostagePenalty = get_pcvar_num( mp_hostagepenalty );
if( iHostagePenalty )
{
new iHostageKills = get_pdata_int( leader, OFFSET_HOSTAGE_KILLS, 5 );
if( iHostageKills + 1 >= iHostagePenalty )
server_cmd( "kick #%i", get_user_userid( leader ) );
else
set_pdata_int( leader, OFFSET_HOSTAGE_KILLS, iHostageKills + 1, 5 );
}
}
fm_fakedamage( ent, "worldspawn", 4096.0, 0 );
set_pev( ent, pev_deadflag, DEAD_DEAD );
reset_hostage( ent );
return 1;
}
else
{
if( iFallPenalty && leader )
{
emessage_begin( MSG_ONE, g_iMsgTextMsg, { 0, 0, 0 }, leader );
ewrite_byte( 4 );
ewrite_string( "#Injured_Hostage" );
emessage_end( );
}
set_pev( ent, pev_health, fHealth - fFallDamage );
}
set_pev( ent, FALL_VELOCITY, fFallVelocity );
}
else
{
pev( ent, pev_velocity, fVelocity );
set_pev( ent, FALL_VELOCITY, fVelocity[ 2 ] * -1.0 );
}
return 0;
}
hostage_duck_ai( ent, leader, bool:headSpace )
{
if( pev( leader, pev_flags ) & FL_DUCKING )
{
if( !pev( ent, WAS_DUCKING ) )
{
set_pev( ent, WAS_DUCKING, 1 );
set_pev( ent, ANIMATING, 1 );
set_pev( ent, ANIM_FRAME, 0.0 );
}
new Float:fFrame;
pev( ent, ANIM_FRAME, fFrame );
if( fFrame + FRAME_RATE < 35.0 )
set_pev( ent, ANIM_FRAME, fFrame + FRAME_RATE );
else
{
set_pev( ent, ANIM_FRAME, 35.0 );
set_pev( ent, pev_mins, Float:{ -10.0, -10.0, 0.0 } );
set_pev( ent, pev_maxs, Float:{ 10.0, 10.0, 32.0 } );
}
}
else
{
if( !pev( ent, WAS_DUCKING ) || headSpace )
{
set_pev( ent, pev_mins, Float:{ -10.0, -10.0, 0.0 } );
set_pev( ent, pev_maxs, Float:{ 10.0, 10.0, 62.0 } );
if( pev( ent, WAS_DUCKING ) )
{
set_pev( ent, ANIMATING, 1 );
set_pev( ent, WAS_DUCKING, 0 );
}
if( pev( ent, ANIMATING ) )
{
new Float:fFrame;
pev( ent, ANIM_FRAME, fFrame );
if( fFrame - FRAME_RATE > 0.0 )
set_pev( ent, ANIM_FRAME, fFrame-FRAME_RATE );
else
{
set_pev( ent, ANIM_FRAME, 0.0 );
set_pev( ent, ANIMATING, 0 );
}
}
}
}
}
hostage_ladder_ai( ent, leader, Float:hOrigin[ 3 ], Float:climbSpeed )
{
static Float:lOrigin[ 3 ], Float:lMins[ 3 ], Float:fGoal[ 3 ], Float:fAbsMin[ 3 ], Float:fAbsMax[ 3 ], Float:fNewVelocity[ 3 ], Float:fComparison[ 3 ];
new iDirLadders = get_pcvar_num( g_pCvarDirLadders );
pev( leader, pev_origin, lOrigin );
pev( leader, pev_mins, lMins );
new iOnLadder = pev( ent, ON_LADDER );
if( iOnLadder )
{
if( hOrigin[ 2 ] > fLadderMaxs[ iOnLadder-1 ][ 2 ] )
{
get_speed_vector( hOrigin, lOrigin, 256.0, fNewVelocity );
set_pev( ent, pev_movetype, MOVETYPE_FLY );
set_pev( ent, pev_velocity, fNewVelocity );
set_pev( ent, ON_LADDER, 0 );
return;
}
}
if( hOrigin[ 2 ] >= lOrigin[ 2 ]+lMins[ 2 ]-4.0 )
{
set_pev( ent, pev_movetype, MOVETYPE_STEP );
return;
}
pev( ent, pev_absmin, fAbsMin );
pev( ent, pev_absmax, fAbsMax );
new i, Float:fDist, iTouchingLadder = -1;
for( i=0; i<iLadderNum; i++ )
{
fDist = get_box_distance( fAbsMin, fAbsMax, fLadderMins[ i ], fLadderMaxs[ i ] );
if( fDist > 24.0 )
continue;
if( fLadderOrigin[ i ][ 2 ] > lOrigin[ 2 ] )
continue;
if( !iDirLadders || iLadderDirection[ i ] == DIR_NONE )
{
iTouchingLadder = i;
break;
}
switch( iLadderDirection[ i ] )
{
case DIR_EAST:
{
if( hOrigin[ 0 ] > fLadderMins[ i ][ 0 ])
continue;
}
case DIR_NORTH:
{
if( hOrigin[ 1 ] > fLadderMins[ i ][ 1 ] )
continue;
}
case DIR_WEST:
{
if( hOrigin[ 0 ] < fLadderMaxs[ i ][ 0 ] )
continue;
}
case DIR_SOUTH:
{
if( hOrigin[ 1 ] < fLadderMaxs[ i ][ 1 ] )
continue;
}
}
iTouchingLadder = i;
break;
}
set_pev( ent, ON_LADDER, iTouchingLadder+1 );
if( iTouchingLadder == -1 )
{
set_pev( ent, pev_movetype, MOVETYPE_STEP );
return;
}
fGoal = fLadderOrigin[ iTouchingLadder ];
if( iDirLadders && iLadderDirection[ i ] != DIR_NONE )
{
switch( iLadderDirection[ i ] )
{
case DIR_EAST: fGoal[ 0 ] = fLadderMins[ iTouchingLadder ][ 0 ] - 16.0;
case DIR_NORTH: fGoal[ 1 ] = fLadderMins[ iTouchingLadder ][ 1 ] - 16.0;
case DIR_WEST: fGoal[ 0 ] = fLadderMaxs[ iTouchingLadder ][ 0 ] + 16.0;
case DIR_SOUTH: fGoal[ 1 ] = fLadderMaxs[ iTouchingLadder ][ 1 ] + 16.0;
}
}
fComparison = fGoal;
fComparison[ 2 ] = hOrigin[ 2 ];
if( vector_distance( hOrigin, fComparison ) > 12.0 ) fGoal[ 2 ] = fLadderMins[ iTouchingLadder ][ 2 ] + 8.0;
else
{
if( iDirLadders && iLadderDirection[ i ] != DIR_NONE ) fGoal[ 2 ] = fLadderMaxs[ iTouchingLadder ][ 2 ] + 32.0;
else
fGoal[ 2 ] = fLadderMaxs[ iTouchingLadder ][ 2 ] + 512.0;
}
get_speed_vector( hOrigin, fGoal, climbSpeed, fNewVelocity );
set_pev( ent, pev_movetype, MOVETYPE_FLY );
set_pev( ent, pev_velocity, fNewVelocity );
}
hostage_jump_ai( ent, leader, Float:jumpDelay )
{
new Float:fCurrent = get_gametime( );
if( fJumpTime[ leader ] && fCurrent - fJumpTime[ leader ] < jumpDelay + 0.05 && fCurrent > fJumpTime[ leader ] + jumpDelay )
{
if( pev( ent, pev_flags ) & FL_ONGROUND )
{
static Float:fVelocity[ 3 ];
pev( ent, pev_velocity, fVelocity );
fVelocity[ 2 ] += get_pcvar_float( g_pCvarJumpSpeed );
set_pev( ent, pev_velocity, fVelocity );
}
}
}
public Fw_Touch( touched, toucher )
{
if( touched <= 0 || toucher <= 0 || !pev_valid( touched ) || !pev_valid( toucher ) )
return FMRES_IGNORED;
if( !is_user_alive( toucher ) )
{
new iOwner = pev( toucher, pev_owner );
if( is_user_alive( iOwner ) ) toucher = iOwner;
else
toucher = 0;
}
if( toucher ) set_pev( touched, LAST_TOUCHER, toucher );
return FMRES_IGNORED;
}
public fw_PlayerJump( id )
{
if( !( pev( id, pev_oldbuttons ) & IN_JUMP ) && ( pev( id, pev_flags ) & FL_ONGROUND ) )
fJumpTime[ id ] = get_gametime( );
return HAM_IGNORED;
}
reset_hostage( ent )
{
set_pev( ent, WAS_DUCKING, 0 );
set_pev( ent, ON_LADDER, 0 );
set_pev( ent, LAST_TOUCHER, 0 );
set_pev( ent, ANIMATING, 0 );
set_pev( ent, ANIM_FRAME, 0.0 );
set_pev( ent, FALL_VELOCITY, 0.0 );
set_pev( ent, pev_movetype, MOVETYPE_STEP );
set_pev( ent, pev_mins, Float:{ -10.0, -10.0, 0.0 } );
set_pev( ent, pev_maxs, Float:{ 10.0, 10.0, 62.0 } );
}
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:fNum = floatsqroot( speed*speed / ( new_velocity[ 0 ]*new_velocity[ 0 ] + new_velocity[ 1 ]*new_velocity[ 1 ] + new_velocity[ 2 ]*new_velocity[ 2 ] ) );
new_velocity[ 0 ] *= fNum;
new_velocity[ 1 ] *= fNum;
new_velocity[ 2 ] *= fNum;
return 1;
}
stock bool:is_monster_hull_vacant( ent, const Float:origin[ 3 ] )
{
new iTr = 0;
engfunc( EngFunc_TraceMonsterHull, ent, origin, origin, 0, ent, iTr );
if( !get_tr2( iTr, TR_StartSolid ) && !get_tr2( iTr, TR_AllSolid ) && get_tr2( iTr, TR_InOpen ) )
return true;
return false;
}
stock Float:get_box_distance( Float:mins1[ 3 ], Float:maxs1[ 3 ], Float:mins2[ 3 ], Float:maxs2[ 3 ] )
{
new Float:fDistance[ 3 ], i, Float:max, Float:min;
for( i=0; i<3; i++ )
{
min = mins1[ i ];
max = maxs2[ i ];
if( min > max )
{
fDistance[ i ] = min - max;
continue;
}
min = mins2[ i ];
max = maxs1[ i ];
if( min > max ) fDistance[ i ] = min - max;
}
return floatsqroot( fDistance[ 0 ] * fDistance[ 0 ] + fDistance[ 1 ] * fDistance[ 1 ] + fDistance[ 2 ] * fDistance[ 2 ] );
}