//----------------------------------------------------------------------------- // Purpose: Returns true if there are any undetonated charges in the world // that belong to this player // Input : // Output : //----------------------------------------------------------------------------- bool CWeapon_SLAM::AnyUndetonatedCharges(void) { CBaseEntity *pEntity = NULL; while ((pEntity = gEntList.FindEntityByClassname( pEntity, "npc_satchel" )) != NULL) { CSatchelCharge* pSatchel = dynamic_cast<CSatchelCharge *>(pEntity); if (pSatchel->m_bIsLive && pSatchel->GetThrower() && pSatchel->GetThrower() == GetOwner()) { return true; } } return false; }
//----------------------------------------------------------------------------- // Purpose: // Input : // Output : //----------------------------------------------------------------------------- void CWeapon_SLAM::SatchelThrow( void ) { // Only the player fires this way so we can cast CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); #ifndef CLIENT_DLL m_bThrowSatchel = false; Vector vecSrc = pPlayer->WorldSpaceCenter(); Vector vecFacing = pPlayer->BodyDirection3D( ); vecSrc = vecSrc + vecFacing * 18.0; // BUGBUG: is this because vecSrc is not from Weapon_ShootPosition()??? vecSrc.z += 24.0f; Vector vecThrow; GetOwner()->GetVelocity( &vecThrow, NULL ); vecThrow += vecFacing * 500; // Player may have turned to face a wall during the throw anim in which case // we don't want to throw the SLAM into the wall if (CanAttachSLAM()) { vecThrow = vecFacing; vecSrc = pPlayer->WorldSpaceCenter() + vecFacing * 5.0; } CSatchelCharge *pSatchel = (CSatchelCharge*)Create( "npc_satchel", vecSrc, vec3_angle, GetOwner() ); if ( pSatchel ) { pSatchel->SetThrower( GetOwner() ); pSatchel->ApplyAbsVelocityImpulse( vecThrow ); pSatchel->SetLocalAngularVelocity( QAngle( 0, 400, 0 ) ); pSatchel->m_bIsLive = true; pSatchel->m_pMyWeaponSLAM = this; } pPlayer->RemoveAmmo( 1, m_iSecondaryAmmoType ); pPlayer->SetAnimation( PLAYER_ATTACK1 ); #endif //Tony; is there a different anim in the player? must check.. ToHL2MPPlayer(pPlayer)->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_PRIMARY ); // Play throw sound EmitSound( "Weapon_SLAM.SatchelThrow" ); }
void CHL2MP_Player::DetonateTripmines( void ) { CBaseEntity *pEntity = NULL; while ((pEntity = gEntList.FindEntityByClassname( pEntity, "npc_satchel" )) != NULL) { CSatchelCharge *pSatchel = dynamic_cast<CSatchelCharge *>(pEntity); if (pSatchel->m_bIsLive && pSatchel->GetThrower() == this ) { g_EventQueue.AddEvent( pSatchel, "Explode", 0.20, this, this ); } } // Play sound for pressing the detonator EmitSound( "Weapon_SLAM.SatchelDetonate" ); }
//----------------------------------------------------------------------------- // Purpose: // Input : // Output : //----------------------------------------------------------------------------- void CWeapon_SLAM::SatchelDetonate() { CBaseEntity *pEntity = NULL; while ((pEntity = gEntList.FindEntityByClassname( pEntity, "npc_satchel" )) != NULL) { CSatchelCharge *pSatchel = dynamic_cast<CSatchelCharge *>(pEntity); if (pSatchel->m_bIsLive && pSatchel->GetThrower() && GetOwner() && pSatchel->GetThrower() == GetOwner()) { pSatchel->Use( GetOwner(), GetOwner(), USE_ON, 0 ); } } // Play sound for pressing the detonator EmitSound( "Weapon_SLAM.SatchelDetonate" ); m_bDetonatorArmed = false; }
//========================================================= // DeactivateSatchels - removes all satchels owned by // the provided player. Should only be used upon death. // // Made this global on purpose. //========================================================= void DeactivateSatchels(CBasePlayer *pOwner) { edict_t *pFind; pFind = FIND_ENTITY_BY_CLASSNAME(NULL, "monster_satchel"); while (!FNullEnt(pFind)) { CBaseEntity *pEnt = CBaseEntity::Instance(pFind); CSatchelCharge *pSatchel = (CSatchelCharge *)pEnt; if (pSatchel) { if (pSatchel->pev->owner == pOwner->edict()) pSatchel->Deactivate(); } pFind = FIND_ENTITY_BY_CLASSNAME(pFind, "monster_satchel"); } }
//----------------------------------------------------------------------------- // Purpose: // Input : // Output : //----------------------------------------------------------------------------- void CWeapon_SLAM::SatchelAttach( void ) { CBaseCombatCharacter *pOwner = GetOwner(); if (!pOwner) { return; } m_bAttachSatchel = false; Vector vecSrc = pOwner->Weapon_ShootPosition( ); Vector vecAiming = pOwner->BodyDirection2D( ); trace_t tr; UTIL_TraceLine( vecSrc, vecSrc + (vecAiming * 128), MASK_SOLID, pOwner, COLLISION_GROUP_NONE, &tr ); if (tr.fraction < 1.0) { CBaseEntity *pEntity = tr.m_pEnt; if (pEntity && !(pEntity->GetFlags() & FL_CONVEYOR)) { QAngle angles; VectorAngles(tr.plane.normal, angles); angles.y -= 90; angles.z -= 90; tr.endpos.z -= 6.0f; EmitSound( "Weapon_SLAM.SatchelAttach" ); CSatchelCharge *pSatchel = (CSatchelCharge*)CBaseEntity::Create( "npc_satchel", tr.endpos + tr.plane.normal * 3, angles, NULL ); pSatchel->SetMoveType( MOVETYPE_FLY ); // no gravity pSatchel->m_bIsAttached = true; pSatchel->m_bIsLive = true; pSatchel->SetThrower( GetOwner() ); pSatchel->SetOwnerEntity( ((CBaseEntity*)GetOwner()) ); pSatchel->m_pMyWeaponSLAM = this; pOwner->RemoveAmmo( 1, m_iSecondaryAmmoType ); } } }
//----------------------------------------------------------------------------- // Purpose: // Input : // Output : //----------------------------------------------------------------------------- void CWeapon_SLAM::SatchelDetonate() { #ifndef CLIENT_DLL CBaseEntity *pEntity = NULL; while ((pEntity = gEntList.FindEntityByClassname( pEntity, "npc_satchel" )) != NULL) { CSatchelCharge *pSatchel = dynamic_cast<CSatchelCharge *>(pEntity); if (pSatchel->m_bIsLive && pSatchel->GetThrower() && GetOwner() && pSatchel->GetThrower() == GetOwner()) { //pSatchel->Use( GetOwner(), GetOwner(), USE_ON, 0 ); //variant_t emptyVariant; //pSatchel->AcceptInput( "Explode", NULL, NULL, emptyVariant, 5 ); g_EventQueue.AddEvent( pSatchel, "Explode", 0.20, GetOwner(), GetOwner() ); } } #endif // Play sound for pressing the detonator EmitSound( "Weapon_SLAM.SatchelDetonate" ); m_bDetonatorArmed = false; }