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.
 
 
 
 
 
 

233 lines
5.8 KiB

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#include "cbase.h"
#include "tf_extra_map_entity.h"
#include "KeyValues.h"
#include "filesystem.h"
struct EntityWhiteList_t
{
const char *pszKeyName;
const char *pszEntName;
};
// limit the entities that can be created using this method
EntityWhiteList_t g_szEntityWhiteList[] =
{
// { "rocket", "entity_rocket" },
// { "carrier", "entity_carrier" },
{ "sign", "entity_sign" },
// { "saucer", "entity_saucer" },
};
LINK_ENTITY_TO_CLASS( entity_rocket, CExtraMapEntity_Rocket );
LINK_ENTITY_TO_CLASS( entity_carrier, CExtraMapEntity_Carrier );
LINK_ENTITY_TO_CLASS( entity_sign, CExtraMapEntity_Sign );
LINK_ENTITY_TO_CLASS( entity_saucer, CExtraMapEntity_Saucer );
BEGIN_DATADESC( CExtraMapEntity )
DEFINE_THINKFUNC( AnimThink ),
END_DATADESC();
IMPLEMENT_AUTO_LIST( IExtraMapEntityAutoList );
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CExtraMapEntity::Spawn( void )
{
Precache();
BaseClass::Spawn();
SetModel( STRING( GetModelName() ) );
SetMoveType( MOVETYPE_NONE );
SetSequence( 0 );
if ( ShouldAnimate() )
{
ResetSequenceInfo();
SetThink( &CExtraMapEntity::AnimThink );
SetNextThink( gpGlobals->curtime + 0.1f );
}
}
void CExtraMapEntity::AnimThink( void )
{
StudioFrameAdvance();
DispatchAnimEvents( this );
SetNextThink( gpGlobals->curtime + 0.1f );
}
void CExtraMapEntity::Precache( void )
{
BaseClass::Precache();
bool bAllowPrecache = CBaseEntity::IsPrecacheAllowed();
CBaseEntity::SetAllowPrecache( true );
Precache_Internal();
CBaseEntity::SetAllowPrecache( bAllowPrecache );
}
void CExtraMapEntity::Precache_Internal( void )
{
PrecacheModel( STRING( GetModelName() ) );
}
const char *CExtraMapEntity::ValidateKeyName( const char *pszKey )
{
if ( pszKey && pszKey[0] )
{
for ( int i = 0; i < ARRAYSIZE( g_szEntityWhiteList ); i++ )
{
if ( FStrEq( pszKey, g_szEntityWhiteList[i].pszKeyName ) )
{
return g_szEntityWhiteList[i].pszEntName;
}
}
}
return NULL;
}
void CExtraMapEntity::PrepareModelName( const char *szModelName )
{
const char *pszTemp = GetDefaultModel();
if ( szModelName && szModelName[0] )
{
pszTemp = szModelName;
}
SetModelName( AllocPooledString( pszTemp ) );
}
void CExtraMapEntity::SpawnExtraModel( void )
{
/*
const char *pszMapName = STRING( gpGlobals->mapname );
if ( !pszMapName || !pszMapName[0] )
return;
KeyValues *pFileKV = new KeyValues( "models" );
if ( !pFileKV->LoadFromFile( g_pFullFileSystem, "scripts/extra_models.txt", "MOD" ) )
return;
// See if we have an entry for this map.
KeyValues *pMapKV = pFileKV->FindKey( pszMapName );
if ( pMapKV )
{
FOR_EACH_SUBKEY( pMapKV, pSubKeyEnt )
{
const char *pszEntName = ValidateKeyName( pSubKeyEnt->GetName() );
if ( !pszEntName )
continue;
FOR_EACH_SUBKEY( pSubKeyEnt, pSubKeyCount )
{
Vector loc = vec3_origin;
QAngle rot( 0, 0, 0 );
char szModelName[MAX_PATH];
szModelName[0] = '\0';
float flChance = 1.0f; // assume we want to show everything unless specified in the .txt file
FOR_EACH_SUBKEY( pSubKeyCount, pSubKey )
{
if ( FStrEq( pSubKey->GetName(), "location" ) )
{
const char *pszLoc = pSubKey->GetString();
UTIL_StringToVector( loc.Base(), pszLoc );
}
else if ( FStrEq( pSubKey->GetName(), "rotation" ) )
{
const char *pszRot = pSubKey->GetString();
UTIL_StringToVector( rot.Base(), pszRot );
}
else if ( FStrEq( pSubKey->GetName(), "model" ) )
{
V_strcpy_safe( szModelName, pSubKey->GetString() );
}
else if ( FStrEq( pSubKey->GetName(), "chance" ) )
{
flChance = pSubKey->GetFloat();
if ( flChance > 1.0f )
{
flChance = 1.0f;
}
}
}
if ( ( flChance > 0.0f ) && ( RandomFloat( 0, 1 ) < flChance ) )
{
CExtraMapEntity *pExtraMapEntity = static_cast< CExtraMapEntity* >( CBaseEntity::CreateNoSpawn( pszEntName, loc, rot ) );
if ( pExtraMapEntity )
{
pExtraMapEntity->PrepareModelName( szModelName );
DispatchSpawn( pExtraMapEntity );
}
}
}
}
}
pFileKV->deleteThis();
*/
}
//-----------------------------------------------------------------------------
// Purpose: Grordbort rocket model in the skybox
//-----------------------------------------------------------------------------
void CExtraMapEntity_Rocket::Spawn( void )
{
BaseClass::Spawn();
SetSolid( SOLID_BBOX );
SetSize( -Vector( 8, 8, 0 ), Vector( 8, 8, 16 ) );
}
void CExtraMapEntity_Rocket::Precache_Internal( void )
{
BaseClass::Precache_Internal();
PrecacheParticleSystem( "smoke_blackbillow_skybox" );
}
//-----------------------------------------------------------------------------
// Purpose: Mann vs. Machine carrier model in the skybox
//-----------------------------------------------------------------------------
void CExtraMapEntity_Carrier::Spawn( void )
{
BaseClass::Spawn();
SetSolid( SOLID_BBOX );
SetSize( -Vector( 8, 8, 0 ), Vector( 8, 8, 16 ) );
}
//-----------------------------------------------------------------------------
// Purpose: Sign models to tease future updates
//-----------------------------------------------------------------------------
void CExtraMapEntity_Sign::Spawn( void )
{
BaseClass::Spawn();
SetSolid( SOLID_NONE );
AddEffects( EF_NOSHADOW );
}
//-----------------------------------------------------------------------------
// Purpose: Saucer models to tease future updates
//-----------------------------------------------------------------------------
void CExtraMapEntity_Saucer::Spawn( void )
{
BaseClass::Spawn();
SetSolid( SOLID_NONE );
AddEffects( EF_NOSHADOW );
}