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
140 lines
3.8 KiB
//========= 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 ); |
|
} |