//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: // //=============================================================================// #include "cbase.h" #include "triggers.h" #include "cs_player.h" #include "cs_team.h" //====================================== // Buy zone // // extern ConVar mp_logdetail; class CBuyZone : public CBaseTrigger { public: DECLARE_CLASS( CBuyZone, CBaseTrigger ); DECLARE_DATADESC(); CBuyZone(); void Spawn(); void EXPORT BuyZoneTouch( CBaseEntity* pOther ); void InputSetTeam_TerroristOnly( inputdata_t& inputdata ); void InputSetTeam_CTOnly( inputdata_t& inputdata ); void InputSetTeam_AllTeams( inputdata_t& inputdata ); void InputSetTeam_None( inputdata_t& inputdata ); // CBaseTrigger override virtual void EndTouch( CBaseEntity *pOther ) OVERRIDE; public: int m_LegacyTeamNum; }; LINK_ENTITY_TO_CLASS( func_buyzone, CBuyZone ); BEGIN_DATADESC( CBuyZone ) DEFINE_FUNCTION( BuyZoneTouch ), // This is here to support maps that haven't updated to using "teamnum" yet. DEFINE_INPUT( m_LegacyTeamNum, FIELD_INTEGER, "team" ), DEFINE_INPUTFUNC( FIELD_VOID, "SetTeam_TerroristOnly", InputSetTeam_TerroristOnly ), DEFINE_INPUTFUNC( FIELD_VOID, "SetTeam_CTOnly", InputSetTeam_CTOnly ), DEFINE_INPUTFUNC( FIELD_VOID, "SetTeam_AllTeams", InputSetTeam_AllTeams ), DEFINE_INPUTFUNC( FIELD_VOID, "SetTeam_None", InputSetTeam_None ) END_DATADESC() CBuyZone::CBuyZone() { m_LegacyTeamNum = -1; } void CBuyZone::Spawn() { InitTrigger(); SetTouch( &CBuyZone::BuyZoneTouch ); // Support for legacy-style teamnums. if ( m_LegacyTeamNum == 1 ) { ChangeTeam( TEAM_TERRORIST ); } else if ( m_LegacyTeamNum == 2 ) { ChangeTeam( TEAM_CT ); } } void CBuyZone::BuyZoneTouch( CBaseEntity* pOther ) { CCSPlayer *p = dynamic_cast< CCSPlayer* >( pOther ); if ( p ) { int nZoneTeam = GetTeamNumber(); if ( nZoneTeam == -1 ) { // -1 mean no team can use it return; } // compare player team with buy zone team number else if ( nZoneTeam == 0 || p->GetTeamNumber() == GetTeamNumber() ) { p->m_bInBuyZone = true; p->AutoBuyAmmo(); } } } void CBuyZone::InputSetTeam_TerroristOnly( inputdata_t& inputdata ) { ChangeTeam( TEAM_TERRORIST ); } void CBuyZone::InputSetTeam_CTOnly( inputdata_t& inputdata ) { ChangeTeam( TEAM_CT ); } void CBuyZone::InputSetTeam_AllTeams( inputdata_t& inputdata ) { // team 0 in this case means that everyone can use it ChangeTeam( 0 ); } void CBuyZone::InputSetTeam_None( inputdata_t& inputdata ) { // team -1 means that no one can use it ChangeTeam( -1 ); } void CBuyZone::EndTouch( CBaseEntity *pOther ) { BaseClass::EndTouch( pOther ); // Feature mostly for tournament organizers to aid match stat log parsing. if ( mp_logdetail.GetInt() >= 3 && pOther->IsPlayer() ) { if ( CCSPlayer *pCSPlayer = ToCSPlayer( pOther ) ) { CUtlString strEquipment( "[ "); for ( int i = 0; i < MAX_WEAPONS; ++i ) { if ( CBaseCombatWeapon* pWeapon = pCSPlayer->GetWeapon( i ) ) strEquipment.Append( CFmtStr( "%s ", pWeapon->GetEconItemView() ? pWeapon->GetEconItemView()->GetItemDefinition()->GetDefinitionName() : pWeapon->GetName() ).Get() ); } if ( pCSPlayer->HasDefuser() ) strEquipment.Append( "defuser " ); if ( pCSPlayer->ArmorValue() > 0 ) strEquipment.Append( CFmtStr( "kevlar(%d) ", pCSPlayer->ArmorValue() ).Get() ); if ( pCSPlayer->m_bHasHelmet ) strEquipment.Append( "helmet " ); if ( pCSPlayer->HasC4() ) strEquipment.Append( "C4 " ); strEquipment.Append( "]" ); UTIL_LogPrintf( "\"%s<%i><%s><%s>\" left buyzone with %s\n", pCSPlayer->GetPlayerName(), pCSPlayer->GetUserID(), pCSPlayer->GetNetworkIDString(), pCSPlayer->GetTeam()->GetName(), strEquipment.Get() ); } } }