Чисто теоретически, граната в руках - это однозарядный гранатомёт. Так что, думаю, подойдёт код от Бульдога.
Код:
//**********************************************
//* Launch a contact grenade. *
//**********************************************
//добавь CGrenada__Launcher(iPlayer) в Primary Attack
CGrenade__Launch( iPlayer )
{
new pGrenade = create_entity( "info_target" );
if( pGrenade <= 0 )
return;
// classname
set_pev( pGrenade, pev_classname, GRENADE_CLASSNAME );
// model
engfunc( EngFunc_SetModel, pGrenade, MODEL_CLIP );
// origin
static Float:vecSrc[ 3 ];
UTIL_MakeVectors( iPlayer, v_angle + punchangle );
GetGunPosition( iPlayer, vecSrc );
engfunc( EngFunc_SetOrigin, pGrenade, vecSrc );
// fly in the air
set_pev( pGrenade, pev_gravity, 0.5 );
// movetype
set_pev( pGrenade, pev_movetype, g_iCurrentMode[ iPlayer ] == MODE_BOUNCE ? MOVETYPE_BOUNCE : MOVETYPE_TOSS );
// interaction
set_pev( pGrenade, pev_solid, SOLID_BBOX );
// size
engfunc( EngFunc_SetSize, pGrenade, gVecZero, gVecZero );
// owner
set_pev( pGrenade, pev_owner, iPlayer );
// store grenade mode
set_pev( pGrenade, pev_iuser1, g_iCurrentMode[ iPlayer ] );
// damage
set_pev( pGrenade, pev_dmg, WEAPON_DAMAGE );
// next think
set_pev( pGrenade, pev_nextthink, get_gametime( ) + 0.6 );
// Velocity
static Float:vecVelocity[ 3 ];
velocity_by_aim( iPlayer, GRENADE_VELOCITY, vecVelocity );
set_pev( pGrenade, pev_velocity, vecVelocity );
// angles
static Float:vecAngles[ 3 ];
engfunc( EngFunc_VecToAngles, vecVelocity, vecAngles );
set_pev( pGrenade, pev_angles, vecAngles );
// trail
message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
write_byte( TE_BEAMFOLLOW );
write_short( pGrenade );
write_short( g_sModelIndexTrail );
write_byte( 25 );
write_byte( 5 );
write_byte( 250 );
write_byte( 0 );
write_byte( 0 );
write_byte( 250 );
message_end( );
}
//**********************************************
//* Grenade is ticking away. *
//**********************************************
public CGP25Grenade__Think( pGrenade )
{
if( !pev_valid( pGrenade ) )
return;
switch( pev( pGrenade, pev_iuser1 ) )
{
case MODE_BOUNCE:
{
static Float:vecVelocity[ 3 ];
pev( pGrenade, pev_velocity, vecVelocity );
if( xs_vec_len( vecVelocity ) <= 10.0 )
{
CGP25__Explode( pGrenade );
}
}
}
}
//**********************************************
//* Grenade hit something. *
//**********************************************
public CGP25Grenade__Touch( pGrenade, pOther )
{
if( !pev_valid( pGrenade ) )
return;
switch( pev( pGrenade, pev_iuser1 ) )
{
case MODE_BOUNCE:
{
static Float:vecVelocity[ 3 ];
pev( pGrenade, pev_velocity, vecVelocity );
xs_vec_mul_scalar( vecVelocity, 0.4, vecVelocity );
set_pev( pGrenade, pev_velocity, vecVelocity );
if( pev( pGrenade, pev_fuser1 ) <= 0.0 )
{
emit_sound( pGrenade, CHAN_ITEM, SOUND_BOUNCE, VOL_NORM, ATTN_NORM, 0, 97 );
set_pev( pGrenade, pev_fuser1, random_float( 0.5, 0.9 ) );
}
set_pev( pGrenade, pev_nextthink, get_gametime( ) + 0.16 );
}
case MODE_INSTANT:
{
CGP25__Explode( pGrenade );
}
}
}
//**********************************************
//* Grenade explode. *
//**********************************************
CGP25__Explode( pGrenade )
{
if( !pev_valid( pGrenade ) )
return;
static Float:vecSrc[ 3 ], Float:flDmg;
pev( pGrenade, pev_origin, vecSrc );
pev( pGrenade, pev_dmg, flDmg );
// sprite
engfunc( EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, vecSrc, 0 );
write_byte( TE_EXPLOSION );
engfunc( EngFunc_WriteCoord, vecSrc[ 0 ] );
engfunc( EngFunc_WriteCoord, vecSrc[ 1 ] );
engfunc( EngFunc_WriteCoord, vecSrc[ 2 ] );
write_short( g_sModelIndexExplode );
write_byte( floatround( ( flDmg - 50.0 ) * 0.6 ) );
write_byte( 15 );
write_byte( TE_EXPLFLAG_NONE );
message_end( );
static pevOwner;
pevOwner = pev( pGrenade, pev_owner );
// damage
wpnmod_radius_damage( vecSrc, pGrenade, pevOwner, flDmg, GRENADE_RADIUS, CLASS_NONE, DMG_BLAST | DMG_ALWAYSGIB );
engfunc( EngFunc_RemoveEntity, pGrenade );
}
UTIL_MakeVectors( Player, bsType )
{
static Float:vPunchAngle[ 3 ], Float:vAngle[ 3 ];
if( bsType & v_angle )
pev( Player, pev_v_angle, vAngle );
if( bsType & punchangle )
pev( Player, pev_punchangle, vPunchAngle );
xs_vec_add( vAngle, vPunchAngle, vAngle );
engfunc( EngFunc_MakeVectors, vAngle );
}
GetGunPosition( pPlayer, Float:vecRet[ 3 ] )
{
static Float:vecSrc[ 3 ], Float:vForward[ 3 ], Float:vRight[ 3 ], Float:vUp[ 3 ];
pev( pPlayer, pev_origin, vecSrc );
global_get( glb_v_forward, vForward );
global_get( glb_v_right, vRight );
global_get( glb_v_up, vUp );
vecRet[ 0 ] = vecSrc[ 0 ] + vForward[ 0 ] * 25.0 + vRight[ 0 ] * 20.0 + vUp[ 0 ] * 10.0;
vecRet[ 1 ] = vecSrc[ 1 ] + vForward[ 1 ] * 25.0 + vRight[ 1 ] * 20.0 + vUp[ 1 ] * 10.0;
vecRet[ 2 ] = vecSrc[ 2 ] + vForward[ 2 ] * 25.0 + vRight[ 2 ] * 20.0 + vUp[ 2 ] * 10.0;
}