char* CTFInventory::GetWeaponBucket(int iWeapon, int iTeam) { if (iWeapon == TF_WEAPON_BUILDER) //shit but works return "sprites/bucket_sapper"; CTFWeaponInfo* pWeaponInfo = GetTFWeaponInfo(iWeapon); if (!pWeaponInfo) return ""; CHudTexture *pHudTexture = (iTeam == TF_TEAM_RED ? pWeaponInfo->iconInactive : pWeaponInfo->iconActive); if (!pHudTexture) return ""; return pHudTexture->szTextureFile; };
void CTFPlayerEquip::EquipPlayer(CBaseEntity *pEntity) { CTFPlayer *pTFPlayer = ToTFPlayer(pEntity); if (!pTFPlayer) return; for (int i = 0; i < TF_PLAYER_WEAPON_COUNT; i++) { if (m_bStripWeapons) { CTFWeaponBase *pWeapon = pTFPlayer->Weapon_GetWeaponByType(i); if (pWeapon) { pTFPlayer->Weapon_Detach(pWeapon); pTFPlayer->SwitchToNextBestWeapon(NULL); UTIL_Remove(pWeapon); } } if (m_iWeaponNumber[i]) { if (!m_bStripWeapons) { CTFWeaponBase *pWeapon = pTFPlayer->Weapon_GetWeaponByType(GetTFWeaponInfo(m_iWeaponNumber[i])->m_iWeaponType); if (pWeapon) { pTFPlayer->Weapon_Detach(pWeapon); pTFPlayer->SwitchToNextBestWeapon(NULL); UTIL_Remove(pWeapon); } } pTFPlayer->GiveNamedItem(GetTFWeaponInfo(m_iWeaponNumber[i])->szClassName); } } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void TFExplosionCallback( const Vector &vecOrigin, const Vector &vecNormal, int iWeaponID, ClientEntityHandle_t hEntity, C_TFPlayer *pPlayer, int iTeam, bool bCrit, int iItemID ) { // Get the weapon information. CTFWeaponInfo *pWeaponInfo = NULL; switch ( iWeaponID ) { case TF_WEAPON_GRENADE_PIPEBOMB: case TF_WEAPON_GRENADE_DEMOMAN: pWeaponInfo = GetTFWeaponInfo( TF_WEAPON_PIPEBOMBLAUNCHER ); break; default: pWeaponInfo = GetTFWeaponInfo( iWeaponID ); break; } bool bIsPlayer = false; if ( hEntity.Get() ) { C_BaseEntity *pEntity = C_BaseEntity::Instance( hEntity ); if ( pEntity && pEntity->IsPlayer() ) { bIsPlayer = true; } } // Calculate the angles, given the normal. bool bIsWater = ( UTIL_PointContents( vecOrigin ) & CONTENTS_WATER ); bool bInAir = false; QAngle angExplosion( 0.0f, 0.0f, 0.0f ); // Cannot use zeros here because we are sending the normal at a smaller bit size. if ( fabs( vecNormal.x ) < 0.05f && fabs( vecNormal.y ) < 0.05f && fabs( vecNormal.z ) < 0.05f ) { bInAir = true; angExplosion.Init(); } else { VectorAngles( vecNormal, angExplosion ); bInAir = false; } bool bDeathmatchOverride = ( pPlayer && TFGameRules()->IsDeathmatch() ); // Base explosion effect and sound. const char *pszEffect = "explosion"; const char *pszSound = "BaseExplosionEffect.Sound"; if ( pWeaponInfo ) { // Explosions. if ( bIsWater ) { if ( bCrit && pWeaponInfo->m_szExplosionWaterEffect_Crit[0] ) { pszEffect = ConstructTeamParticle( pWeaponInfo->m_szExplosionWaterEffect_Crit, iTeam, bDeathmatchOverride ); } else if ( pWeaponInfo->m_szExplosionWaterEffect[0] ) { pszEffect = pWeaponInfo->m_szExplosionWaterEffect; } } else { if ( bIsPlayer || bInAir ) { if ( bCrit && pWeaponInfo->m_szExplosionPlayerEffect_Crit[0] ) { pszEffect = ConstructTeamParticle( pWeaponInfo->m_szExplosionPlayerEffect_Crit, iTeam, bDeathmatchOverride ); } else if ( pWeaponInfo->m_szExplosionPlayerEffect[0] ) { pszEffect = pWeaponInfo->m_szExplosionPlayerEffect; } } else { if ( bCrit && pWeaponInfo->m_szExplosionEffect_Crit[0] ) { pszEffect = ConstructTeamParticle( pWeaponInfo->m_szExplosionEffect_Crit, iTeam, bDeathmatchOverride ); } else if ( pWeaponInfo->m_szExplosionEffect[0] ) { pszEffect = pWeaponInfo->m_szExplosionEffect; } } } // Sound. if ( pWeaponInfo->m_szExplosionSound[0] != '\0' ) { pszSound = pWeaponInfo->m_szExplosionSound; } } // Allow schema to override explosion sound. if ( iItemID >= 0 ) { CEconItemDefinition *pItemDef = GetItemSchema()->GetItemDefinition( iItemID ); if ( pItemDef && pItemDef->GetVisuals()->aWeaponSounds[SPECIAL1][0] != '\0' ) { pszSound = pItemDef->GetVisuals()->aWeaponSounds[SPECIAL1]; } } CLocalPlayerFilter filter; C_BaseEntity::EmitSound( filter, SOUND_FROM_WORLD, pszSound, &vecOrigin ); if ( bDeathmatchOverride ) { DispatchParticleEffect( pszEffect, vecOrigin, angExplosion, pPlayer->m_vecPlayerColor, vec3_origin, true ); } else { DispatchParticleEffect( pszEffect, vecOrigin, angExplosion ); } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool CTFDroppedWeapon::MyTouch( CBasePlayer *pPlayer ) { bool bSuccess = false; CTFPlayer *pTFPlayer = dynamic_cast<CTFPlayer *>( pPlayer ); if ( ValidTouch( pTFPlayer ) && pTFPlayer->IsPlayerClass( TF_CLASS_MERCENARY ) ) { // Don't remove weapon while a player is standing over it. SetThink( NULL ); #ifndef DM_WEAPON_BUCKET int iSlot = m_Item.GetStaticData()->GetLoadoutSlot( TF_CLASS_MERCENARY ); CTFWeaponBase *pWeapon = (CTFWeaponBase *)pTFPlayer->GetEntityForLoadoutSlot( iSlot ); const char *pszWeaponName = m_Item.GetEntityName(); int iAmmoType = m_pWeaponInfo->iAmmoType; if ( pWeapon ) { if ( pWeapon->GetItemID() == m_Item.GetItemDefIndex() ) { // Give however many ammo we have if ( pTFPlayer->GiveAmmo( m_iAmmo, iAmmoType, true, TF_AMMO_SOURCE_AMMOPACK ) ) bSuccess = true; } else if ( !(pTFPlayer->m_nButtons & IN_ATTACK) && ( pTFPlayer->m_nButtons & IN_USE ) ) // Check Use button { // Drop a usable weapon pTFPlayer->DropWeapon( pWeapon ); if ( pWeapon == pTFPlayer->GetActiveTFWeapon() ) { pWeapon->Holster(); } pTFPlayer->Weapon_Detach( pWeapon ); UTIL_Remove( pWeapon ); pWeapon = NULL; } else { pTFPlayer->m_Shared.SetDesiredWeaponIndex( m_Item.GetItemDefIndex() ); } } #else CTFWeaponBase *pWeapon = pTFPlayer->Weapon_OwnsThisID( m_nWeaponID ); if ( pWeapon ) { if ( pTFPlayer->GiveAmmo( 999, GetTFWeaponInfo( m_nWeaponID )->iAmmoType ) ); bSuccess = true; } #endif if ( !pWeapon ) { CTFWeaponBase *pNewWeapon = (CTFWeaponBase *)pTFPlayer->GiveNamedItem( pszWeaponName, 0, &m_Item ); if ( pNewWeapon ) { pPlayer->SetAmmoCount( m_iAmmo, iAmmoType ); pNewWeapon->DefaultTouch( pPlayer ); if ( pPlayer == GetOwnerEntity() ) { // If this is the same guy who dropped it restore old clip size to avoid exploiting swapping // weapons for faster reload. pNewWeapon->m_iClip1 = m_iClip; } pTFPlayer->m_Shared.SetDesiredWeaponIndex( -1 ); bSuccess = true; } } if ( bSuccess ) { CSingleUserRecipientFilter user( pPlayer ); user.MakeReliable(); UserMessageBegin( user, "ItemPickup" ); WRITE_STRING( GetClassname() ); MessageEnd(); pPlayer->EmitSound( "BaseCombatCharacter.AmmoPickup" ); } } return bSuccess; }