void CWeaponBox::Touch( CBaseEntity *pOther ) { if ( !(pev->flags & FL_ONGROUND ) ) return; if ( !pOther->IsPlayer() ) return; if ( !pOther->IsAlive() ) return; CBasePlayer *pPlayer = (CBasePlayer *)pOther; int i; // dole out ammo for ( i = 0 ; i < MAX_AMMO_SLOTS ; i++ ) { if ( !FStringNull( m_rgiszAmmo[ i ] ) ) { // there's some ammo of this type. pPlayer->GiveAmmo( m_rgAmmo[ i ], (char *)STRING( m_rgiszAmmo[ i ] ), MaxAmmoCarry( m_rgiszAmmo[ i ] ) ); // now empty the ammo from the weaponbox since we just gave it to the player m_rgiszAmmo[ i ] = iStringNull; m_rgAmmo[ i ] = 0; } } // go through my weapons and try to give the usable ones to the player. // it's important the the player be given ammo first, so the weapons code doesn't refuse // to deploy a better weapon that the player may pick up because he has no ammo for it. for ( i = 0 ; i < MAX_ITEM_TYPES ; i++ ) { if ( m_rgpPlayerItems[ i ] ) { CBasePlayerWeapon *pItem; // have at least one weapon in this slot while ( m_rgpPlayerItems[i] ) { pItem = m_rgpPlayerItems[i]; m_rgpPlayerItems[i] = m_rgpPlayerItems[i]->m_pNext; // unlink this weapon from the box if( pPlayer->AddPlayerItem( pItem )) pItem->AttachToPlayer( pPlayer ); } } } EMIT_SOUND( pOther->edict(), CHAN_BODY, "items/gunpickup2.wav", 1, ATTN_NORM ); SetTouch( NULL ); UTIL_Remove( this ); }
BOOL CWeaponBox::PackAmmo( int iszName, int iCount ) { int iMaxCarry; if ( FStringNull( iszName ) ) { // error here Msg( "NULL String in PackAmmo!\n" ); return FALSE; } iMaxCarry = MaxAmmoCarry( iszName ); if ( iMaxCarry != -1 && iCount > 0 ) { GiveAmmo( iCount, (char *)STRING( iszName ), iMaxCarry ); return TRUE; } return FALSE; }
//========================================================= // CWeaponBox - PackAmmo //========================================================= BOOL CWeaponBox::PackAmmo( int iszName, int iCount ) { int iMaxCarry; if ( FStringNull( iszName ) ) { // error here ALERT ( at_console, "NULL String in PackAmmo!\n" ); return FALSE; } iMaxCarry = MaxAmmoCarry( iszName ); if ( iMaxCarry != -1 && iCount > 0 ) { //ALERT ( at_console, "Packed %d rounds of %s\n", iCount, STRING(iszName) ); GiveAmmo( iCount, (char *)STRING( iszName ), iMaxCarry ); return TRUE; } return FALSE; }