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.

212 lines
5.9 KiB

5 years ago
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "player.h"
#include "tf_obj.h"
#include "basegrenade_shared.h"
#include "grenade_objectsapper.h"
#include "engine/IEngineSound.h"
// Damage CVars
static ConVar weapon_objectsapper_damage( "weapon_objectsapper_damage","50", FCVAR_NONE, "Damage done, per second, by the object sapper." );
// Global Savedata for friction modifier
BEGIN_DATADESC( CGrenadeObjectSapper )
// Function Pointers
DEFINE_THINKFUNC( SapperThink ),
END_DATADESC()
IMPLEMENT_SERVERCLASS_ST(CGrenadeObjectSapper, DT_GrenadeObjectSapper)
SendPropInt(SENDINFO(m_bSapping), 1, SPROP_UNSIGNED ),
END_SEND_TABLE();
LINK_ENTITY_TO_CLASS( grenade_objectsapper, CGrenadeObjectSapper );
PRECACHE_WEAPON_REGISTER(grenade_objectsapper);
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CGrenadeObjectSapper::Spawn( void )
{
SetMoveType( MOVETYPE_NONE );
SetSolid( SOLID_BBOX );
AddSolidFlags( FSOLID_NOT_SOLID );
SetGravity( 0.0 );
SetFriction( 1.0 );
SetModel( "models/sapper.mdl");
UTIL_SetSize(this, Vector( -8, -8, -8), Vector(8, 8, 8));
SetCollisionGroup( TFCOLLISION_GROUP_WEAPON );
m_takedamage = DAMAGE_NO;
m_iHealth = 50.0;
m_bSapping = false;
// Set my damages to the cvar values
SetDamage( weapon_objectsapper_damage.GetFloat() * 0.1 );
SetDamageRadius( 0 );
SetTouch( NULL );
SetThink( SapperThink );
SetNextThink( gpGlobals->curtime + 0.1f );
m_bArmed = true;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CGrenadeObjectSapper::Precache( void )
{
PrecacheModel( "models/sapper.mdl" );
PrecacheScriptSound( "GrenadeObjectSapper.Arming" );
PrecacheScriptSound( "GrenadeObjectSapper.RemoveSapper" );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CGrenadeObjectSapper::PlayArmingSound( void )
{
EmitSound( "GrenadeObjectSapper.Arming" );
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : armed -
//-----------------------------------------------------------------------------
void CGrenadeObjectSapper::SetArmed( bool armed )
{
bool ch = armed != m_bArmed;
m_bArmed = armed;
// Going armed
if ( ch && m_bArmed )
{
PlayArmingSound();
}
if ( m_bArmed )
{
RemoveEffects( EF_NODRAW );
}
else
{
AddEffects( EF_NODRAW );
}
}
//-----------------------------------------------------------------------------
// Purpose:
// Output : Returns true on success, false on failure.
//-----------------------------------------------------------------------------
bool CGrenadeObjectSapper::GetArmed( void ) const
{
return m_bArmed;
}
//-----------------------------------------------------------------------------
// Purpose: Sap the health from the object I'm attached to
//-----------------------------------------------------------------------------
void CGrenadeObjectSapper::SapperThink( void )
{
SetNextThink( gpGlobals->curtime + 0.1f );
// Not armed yet?
if ( !GetArmed() )
return;
// Remove myself if I'm armed, but don't have an object to sap
if ( !m_hTargetObject )
{
UTIL_Remove( this );
return;
}
m_bSapping = true;
// Damage our target (add DMG_CRUSH to prevent physics damage)
m_hTargetObject->TakeDamage( CTakeDamageInfo( this, GetThrower(), GetDamage(), GetDamageType() | DMG_CRUSH ) );
}
//-----------------------------------------------------------------------------
// Purpose: Set our target object
//-----------------------------------------------------------------------------
void CGrenadeObjectSapper::SetTargetObject( CBaseObject *pObject )
{
// Remove myself from any object I'm on
if ( m_hTargetObject != pObject )
{
if ( m_hTargetObject.Get() )
{
m_hTargetObject->RemoveSapper( this );
SetParent( NULL );
}
m_hTargetObject = pObject;
// Tell any object I've just been attached to
if ( m_hTargetObject )
{
m_hTargetObject->AddSapper( this );
SetParent( m_hTargetObject );
}
}
}
//-----------------------------------------------------------------------------
// Purpose: Allow players to remove sappers from objects
//-----------------------------------------------------------------------------
void CGrenadeObjectSapper::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
{
// Only enemies remove the sapper
if ( !InSameTeam( pActivator ) )
{
// Enemy is grabbing me
EmitSound( "GrenadeObjectSapper.RemoveSapper" );
SetTargetObject( NULL );
UTIL_Remove( this );
}
/*
ROBIN: Removed self-removal of sapper
else
{
// Ignore everyone except my owner
if ( pPlayer != m_hOwner )
return;
if ( pPlayer->GiveAmmo( 1, "Sappers") )
{
// Picked up, remove me
SetTargetObject( NULL );
UTIL_Remove( this );
}
}
*/
}
//-----------------------------------------------------------------------------
// Purpose: Create an object sapper grenade
//-----------------------------------------------------------------------------
CGrenadeObjectSapper *CGrenadeObjectSapper::Create( const Vector &vecOrigin, const Vector &vecForward, CBasePlayer *pOwner, CBaseObject *pObject )
{
CGrenadeObjectSapper *pGrenade = (CGrenadeObjectSapper*)CreateEntityByName("grenade_objectsapper");
UTIL_SetOrigin( pGrenade, vecOrigin );
pGrenade->Spawn();
pGrenade->SetThrower( pOwner );
pGrenade->SetAbsVelocity( vec3_origin );
QAngle angles;
VectorAngles( vecForward, angles );
angles.x -= 90;
pGrenade->SetLocalAngles( angles );
pGrenade->ChangeTeam( pOwner->GetTeamNumber() );
return pGrenade;
}