Code:
#include < amxmodx >
#include < fakemeta >
new sv_gravity;
public plugin_init( )
{
sv_gravity = get_cvar_pointer( "sv_gravity" );
}
// ============= VERSION 1 =================
// Uses interval of time with cell arrays
// =======================================
// ...
// iEntity = entity to find trajectory
// the time between each point found
const Float:TIME_INTERVAL = 0.1;
new Array:aOrigins = ArrayCreate( 3 );
new iTotalPoints;
new Float:vStartOrigin[ 3 ];
pev( iEntity, pev_origin, vStartOrigin );
new Float:vStopOrigin[ 3 ];
engfunc( EngFunc_TraceToss, iEntity, iEntity, 0 );
get_tr2( 0, TR_vecEndPos, vStopOrigin );
new Float:vVelocity[ 3 ];
pev( iEntity, pev_velocity, vVelocity );
new Float:fGravity;
pev( iEntity, pev_gravity, fGravity );
fGravity *= get_pcvar_float( sv_gravity );
new Float:fTotalTime = ( vVelocity[ 2 ] + floatsqroot( ( floatpower( vVelocity[ 2 ], 2.0 ) + ( 2.0 * fGravity * ( vStartOrigin[ 2 ] - vStopOrigin[ 2 ] ) ) ) ) ) / fGravity;
new Float:fPercent;
new Float:vCalcOrigin[ 3 ];
for( new Float:fTime = TIME_INTERVAL; fTime <= fTotalTime; fTime += TIME_INTERVAL )
{
fPercent = fTime / fTotalTime;
vCalcOrigin[ 0 ] = vStartOrigin[ 0 ] + ( fPercent * ( vStopOrigin[ 0 ] - vStartOrigin[ 0 ] ) );
vCalcOrigin[ 1 ] = vStartOrigin[ 1 ] + ( fPercent * ( vStopOrigin[ 1 ] - vStartOrigin[ 1 ] ) );
vCalcOrigin[ 2 ] = vStartOrigin[ 2 ] - ( floatpower( fTime, 2.0 ) * fGravity / 2.0 ) + ( fTime * vVelocity[ 2 ] );
ArrayPushArray( aOrigins, vCalcOrigin );
iTotalPoints++;
}
ArrayPushArray( aOrigins, vStopOrigin );
iTotalPoints++;
// ============= VERSION 2 =================
// Uses maximum points and memory arrays
// =======================================
// ...
// iEntity = entity to find trajectory
// the total amount of points to store
const MAX_POINTS = 32;
new Float:vOrigins[ MAX_POINTS + 1 ][ 3 ];
new Float:fTimes[ MAX_POINTS + 1 ];
new Float:vStartOrigin[ 3 ];
pev( iEntity, pev_origin, vStartOrigin );
new Float:vStopOrigin[ 3 ];
engfunc( EngFunc_TraceToss, iEntity, iEntity, 0 );
get_tr2( 0, TR_vecEndPos, vStopOrigin );
new Float:vVelocity[ 3 ];
pev( iEntity, pev_velocity, vVelocity );
new Float:fGravity;
pev( iEntity, pev_gravity, fGravity );
fGravity *= get_pcvar_float( sv_gravity );
new Float:fTotalTime = ( vVelocity[ 2 ] + floatsqroot( ( floatpower( vVelocity[ 2 ], 2.0 ) + ( 2.0 * fGravity * ( vStartOrigin[ 2 ] - vStopOrigin[ 2 ] ) ) ) ) ) / fGravity;
new Float:fPercent;
new Float:fMaxPoints = float( MAX_POINTS );
new Float:fTime;
new Float:vCalcOrigin[ 3 ];
for( new i; i <= MAX_POINTS; i++ )
{
fPercent = float( i ) / fMaxPoints;
fTime = fTotalTime * fPercent;
vOrigins[ i ][ 0 ] = vStartOrigin[ 0 ] + ( fPercent * ( vStopOrigin[ 0 ] - vStartOrigin[ 0 ] ) );
vOrigins[ i ][ 1 ] = vStartOrigin[ 1 ] + ( fPercent * ( vStopOrigin[ 1 ] - vStartOrigin[ 1 ] ) );
vOrigins[ i ][ 2 ] = vStartOrigin[ 2 ] - ( floatpower( fTime, 2.0 ) * fGravity / 2.0 ) + ( fTime * vVelocity[ 2 ] );
fTimes[ i ] = fTime;
}