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.

140 lines
3.8 KiB

5 years ago
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "tf_player.h"
#include "tf_team.h"
#include "tf_gamerules.h"
#include "tf_obj.h"
#include "tf_obj_mapdefined.h"
#include "ndebugoverlay.h"
extern ConVar obj_damage_factor;
// Map defined object spawnflags
#define SF_MAPDEFOBJ_SUPPRESS_MINIMAP 0x0001
#define SF_MAPDEFOBJ_SUPPRESS_ATTACKNOTIFY 0x0002
#define SF_MAPDEFOBJ_DOESNT_NEED_POWER 0x0004
BEGIN_DATADESC( CObjectMapDefined )
// keys
DEFINE_KEYFIELD_NOT_SAVED( m_iszCustomName , FIELD_STRING, "CustomName" ),
END_DATADESC()
IMPLEMENT_SERVERCLASS_ST(CObjectMapDefined, DT_ObjectMapDefined)
SendPropString( SENDINFO( m_szCustomName ) ),
END_SEND_TABLE();
LINK_ENTITY_TO_CLASS(obj_mapdefined, CObjectMapDefined);
LINK_ENTITY_TO_CLASS(func_obj_mapdefined, CObjectMapDefined);
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
CObjectMapDefined::CObjectMapDefined()
{
UseClientSideAnimation();
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CObjectMapDefined::Spawn()
{
// Get the model from the map
char *szModel = (char *)STRING( GetModelName() );
if (!szModel || !*szModel)
{
Warning( "obj_mapdefined at %.0f %.0f %0.f missing modelname\n", GetAbsOrigin().x, GetAbsOrigin().y, GetAbsOrigin().z );
UTIL_Remove( this );
return;
}
memset( m_szCustomName.GetForModify(), 0, sizeof(m_szCustomName) );
if ( m_iszCustomName != NULL_STRING )
{
Q_strncpy( m_szCustomName.GetForModify(), STRING(m_iszCustomName), sizeof(m_szCustomName) );
}
Precache();
// Get the bounding box from the model
if ( szModel[0] != '*' )
{
SetModel( szModel );
Vector vecMins, vecMaxs;
const model_t *pModel = GetModel();
modelinfo->GetModelBounds( pModel, vecMins, vecMaxs );
UTIL_SetSize(this, vecMins, vecMaxs );
}
else
{
// Don't call our internal setmodel to avoid the error
UTIL_SetModel( this, szModel );
// No control panels / power on map geometry objects
m_fObjectFlags |= OF_DOESNT_HAVE_A_MODEL;
m_fObjectFlags |= OF_DOESNT_NEED_POWER;
}
SetSolid( SOLID_VPHYSICS );
SetType( OBJ_MAPDEFINED );
// Setup object flags
if ( HasSpawnFlags( SF_MAPDEFOBJ_SUPPRESS_MINIMAP ) )
{
m_fObjectFlags |= OF_SUPPRESS_APPEAR_ON_MINIMAP;
}
if ( HasSpawnFlags( SF_MAPDEFOBJ_SUPPRESS_ATTACKNOTIFY ) )
{
m_fObjectFlags |= OF_SUPPRESS_NOTIFY_UNDER_ATTACK;
}
if ( HasSpawnFlags( SF_MAPDEFOBJ_DOESNT_NEED_POWER ) )
{
m_fObjectFlags |= OF_DOESNT_NEED_POWER;
}
// If I don't have health, make me invulnerable
if ( !m_iHealth )
{
m_bInvulnerable = true;
}
BaseClass::Spawn();
// Override base object settings
SetCollisionGroup( COLLISION_GROUP_NONE );
FinishedBuilding();
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CObjectMapDefined::Precache()
{
PrecacheModel( STRING( GetModelName() ) );
BaseClass::Precache();
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
int CObjectMapDefined::OnTakeDamage( const CTakeDamageInfo &info )
{
CTakeDamageInfo childInfo = info;
// Hack around the damage factor applied to objects
if ( obj_damage_factor.GetFloat() )
{
float flDamage = info.GetDamage() * (1 / obj_damage_factor.GetFloat());
childInfo.SetDamage( flDamage );
}
return BaseClass::OnTakeDamage( childInfo );
}