mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-08 09:49:36 +00:00
1
This commit is contained in:
@@ -0,0 +1,233 @@
|
||||
//========= 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 );
|
||||
}
|
||||
Reference in New Issue
Block a user