Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

167 lines
3.7 KiB

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
// Author: Michael S. Booth (mike@turtlerockstudios.com), 2003
#include "cbase.h"
#include "cs_gamerules.h"
#include "KeyValues.h"
#include "cs_bot.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
//--------------------------------------------------------------------------------------------------------------
void CCSBot::OnWeaponFire( IGameEvent *event )
{
if ( !IsAlive() )
return;
// don't react to our own events
CBasePlayer *player = UTIL_PlayerByUserId( event->GetInt( "userid" ) );
if ( player == this )
return;
// for knife fighting - if our victim is attacking or reloading, rush him
/// @todo Propagate events into active state
if (GetEnemy() == player && IsUsingKnife())
{
ForceRun( 5.0f );
}
const float ShortRange = 1000.0f;
const float NormalRange = 2000.0f;
float range;
/// @todo Check weapon type (knives are pretty quiet)
/// @todo Use actual volume, account for silencers, etc.
CWeaponCSBase *weapon = (CWeaponCSBase *)((player)?player->GetActiveWeapon():NULL);
if (weapon == NULL)
return;
switch( weapon->GetWeaponID() )
{
// silent "firing"
case WEAPON_HEGRENADE:
case WEAPON_SMOKEGRENADE:
case WEAPON_FLASHBANG:
case WEAPON_SHIELDGUN:
case WEAPON_C4:
return;
// quiet
case WEAPON_KNIFE:
case WEAPON_TMP:
range = ShortRange;
break;
// M4A1 - check for silencer
case WEAPON_M4A1:
{
if (weapon->IsSilenced())
{
range = ShortRange;
}
else
{
range = NormalRange;
}
break;
}
// USP - check for silencer
case WEAPON_USP:
{
if (weapon->IsSilenced())
{
range = ShortRange;
}
else
{
range = NormalRange;
}
break;
}
// loud
case WEAPON_AWP:
range = 99999.0f;
break;
// normal
default:
range = NormalRange;
break;
}
OnAudibleEvent( event, player, range, PRIORITY_HIGH, true ); // weapon_fire
}
//--------------------------------------------------------------------------------------------------------------
void CCSBot::OnWeaponFireOnEmpty( IGameEvent *event )
{
if ( !IsAlive() )
return;
// don't react to our own events
CBasePlayer *player = UTIL_PlayerByUserId( event->GetInt( "userid" ) );
if ( player == this )
return;
// for knife fighting - if our victim is attacking or reloading, rush him
/// @todo Propagate events into active state
if (GetEnemy() == player && IsUsingKnife())
{
ForceRun( 5.0f );
}
OnAudibleEvent( event, player, 1100.0f, PRIORITY_LOW, false ); // weapon_fire_on_empty
}
//--------------------------------------------------------------------------------------------------------------
void CCSBot::OnWeaponReload( IGameEvent *event )
{
if ( !IsAlive() )
return;
// don't react to our own events
CBasePlayer *player = UTIL_PlayerByUserId( event->GetInt( "userid" ) );
if ( player == this )
return;
// for knife fighting - if our victim is attacking or reloading, rush him
/// @todo Propagate events into active state
if (GetEnemy() == player && IsUsingKnife())
{
ForceRun( 5.0f );
}
OnAudibleEvent( event, player, 1100.0f, PRIORITY_LOW, false ); // weapon_reload
}
//--------------------------------------------------------------------------------------------------------------
void CCSBot::OnWeaponZoom( IGameEvent *event )
{
if ( !IsAlive() )
return;
// don't react to our own events
CBasePlayer *player = UTIL_PlayerByUserId( event->GetInt( "userid" ) );
if ( player == this )
return;
OnAudibleEvent( event, player, 1100.0f, PRIORITY_LOW, false ); // weapon_zoom
}