Чисто теоретически, граната в руках - это однозарядный гранатомёт. Так что, думаю, подойдёт код от Бульдога.
Код: //********************************************** //* 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; }
|