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.
200 lines
6.0 KiB
200 lines
6.0 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: An entity that can be used to control speech behaviour for a group |
|
// of NPCs. |
|
// |
|
//=============================================================================// |
|
|
|
#include "cbase.h" |
|
#include "ai_speechfilter.h" |
|
#ifndef CSTRIKE_DLL |
|
#include "ai_playerally.h" |
|
#endif |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
LINK_ENTITY_TO_CLASS( ai_speechfilter, CAI_SpeechFilter ); |
|
|
|
BEGIN_DATADESC( CAI_SpeechFilter ) |
|
DEFINE_KEYFIELD( m_iszSubject, FIELD_STRING, "subject" ), |
|
DEFINE_KEYFIELD( m_flIdleModifier, FIELD_FLOAT, "IdleModifier" ), |
|
DEFINE_KEYFIELD( m_bNeverSayHello, FIELD_BOOLEAN, "NeverSayHello" ), |
|
DEFINE_KEYFIELD( m_bDisabled, FIELD_BOOLEAN, "StartDisabled" ), |
|
|
|
DEFINE_INPUTFUNC( FIELD_VOID, "Enable", InputEnable ), |
|
DEFINE_INPUTFUNC( FIELD_VOID, "Disable", InputDisable ), |
|
DEFINE_INPUTFUNC( FIELD_FLOAT, "SetIdleModifier", InputSetIdleModifier ), |
|
|
|
END_DATADESC() |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CAI_SpeechFilter::Spawn( void ) |
|
{ |
|
BaseClass::Spawn(); |
|
|
|
gEntList.AddListenerEntity( this ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Connect to all our NPCs |
|
//----------------------------------------------------------------------------- |
|
void CAI_SpeechFilter::Activate( void ) |
|
{ |
|
BaseClass::Activate(); |
|
|
|
PopulateSubjectList( m_bDisabled ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CAI_SpeechFilter::UpdateOnRemove(void) |
|
{ |
|
gEntList.RemoveListenerEntity( this ); |
|
BaseClass::UpdateOnRemove(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
//----------------------------------------------------------------------------- |
|
void CAI_SpeechFilter::Enable( bool bEnable ) |
|
{ |
|
m_bDisabled = !bEnable; |
|
|
|
PopulateSubjectList( m_bDisabled ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
//----------------------------------------------------------------------------- |
|
void CAI_SpeechFilter::InputEnable( inputdata_t &inputdata ) |
|
{ |
|
Enable( true ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
//----------------------------------------------------------------------------- |
|
void CAI_SpeechFilter::InputDisable( inputdata_t &inputdata ) |
|
{ |
|
Enable( false ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
//----------------------------------------------------------------------------- |
|
void CAI_SpeechFilter::InputSetIdleModifier( inputdata_t &inputdata ) |
|
{ |
|
m_flIdleModifier = inputdata.value.Float(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
//----------------------------------------------------------------------------- |
|
void CAI_SpeechFilter::PopulateSubjectList( bool purge ) |
|
{ |
|
// Populate the subject list. Try targetname first. |
|
CBaseEntity *pSearch = NULL; |
|
int iNumSubjects = 0; |
|
do |
|
{ |
|
pSearch = gEntList.FindEntityByName( pSearch, m_iszSubject ); |
|
if ( pSearch ) |
|
{ |
|
#ifndef CSTRIKE_DLL |
|
CAI_PlayerAlly *pAlly = dynamic_cast<CAI_PlayerAlly *>(pSearch); |
|
if ( pAlly ) |
|
{ |
|
if( purge ) |
|
{ |
|
pAlly->SetSpeechFilter( NULL ); |
|
} |
|
else |
|
{ |
|
if( pAlly->GetSpeechFilter() != NULL ) |
|
{ |
|
DevWarning("ai_speechfilter %s is slamming NPC %s's current speech filter.\n", STRING(GetEntityName()), STRING(pSearch->GetEntityName()) ); |
|
} |
|
|
|
pAlly->SetSpeechFilter( this ); |
|
} |
|
} |
|
else if ( pSearch->IsNPC() ) |
|
{ |
|
DevWarning("ai_speechfilter %s tries to use %s as a subject, but it's not a talking NPC.\n", STRING(GetEntityName()), STRING(pSearch->GetEntityName()) ); |
|
} |
|
#endif |
|
iNumSubjects++; |
|
} |
|
} while( pSearch ); |
|
|
|
if ( !iNumSubjects ) |
|
{ |
|
// No subjects found by targetname! Assume classname. |
|
do |
|
{ |
|
pSearch = gEntList.FindEntityByClassname( pSearch, STRING(m_iszSubject) ); |
|
if( pSearch ) |
|
{ |
|
#ifndef CSTRIKE_DLL |
|
CAI_PlayerAlly *pAlly = dynamic_cast<CAI_PlayerAlly *>(pSearch); |
|
if ( pAlly ) |
|
{ |
|
if( purge ) |
|
{ |
|
pAlly->SetSpeechFilter( NULL ); |
|
} |
|
else |
|
{ |
|
if( pAlly->GetSpeechFilter() != NULL ) |
|
{ |
|
DevWarning("ai_speechfilter %s is slamming NPC %s's current speech filter.\n", STRING(GetEntityName()), STRING(pSearch->GetEntityName()) ); |
|
} |
|
|
|
pAlly->SetSpeechFilter( this ); |
|
} |
|
} |
|
else if ( pSearch->IsNPC() ) |
|
{ |
|
DevWarning("ai_speechfilter %s tries to use %s as a subject, but it's not a talking NPC.\n", STRING(GetEntityName()), STRING(pSearch->GetEntityName()) ); |
|
} |
|
#endif |
|
iNumSubjects++; |
|
} |
|
} while( pSearch ); |
|
} |
|
|
|
// If the subject list is still empty, we have an error! |
|
if ( !iNumSubjects ) |
|
{ |
|
DevMsg( 2, "ai_speechfilter finds no subject(s) called: %s\n", STRING( m_iszSubject ) ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : *pEntity - |
|
//----------------------------------------------------------------------------- |
|
void CAI_SpeechFilter::OnEntityCreated( CBaseEntity *pEntity ) |
|
{ |
|
if ( !m_bDisabled && ( pEntity->NameMatches( m_iszSubject ) || pEntity->ClassMatches( m_iszSubject ) ) ) |
|
{ |
|
#ifndef CSTRIKE_DLL |
|
CAI_PlayerAlly *pAlly = dynamic_cast<CAI_PlayerAlly *>(pEntity); |
|
if ( pAlly ) |
|
{ |
|
pAlly->SetSpeechFilter( this ); |
|
} |
|
else if ( pEntity->IsNPC() ) |
|
{ |
|
DevWarning("ai_speechfilter %s tries to use %s as a subject, but it's not a talking NPC.\n", STRING(GetEntityName()), STRING(pEntity->GetEntityName()) ); |
|
} |
|
#endif |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : *pEntity - |
|
//----------------------------------------------------------------------------- |
|
void CAI_SpeechFilter::OnEntityDeleted( CBaseEntity *pEntity ) |
|
{ |
|
}
|
|
|