122 lines
2.5 KiB
C++
122 lines
2.5 KiB
C++
/***
|
|
*
|
|
* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved.
|
|
*
|
|
* See the file LICENSE attached with the sources for usage details.
|
|
*
|
|
****/
|
|
|
|
enum {
|
|
USE_TOGGLE,
|
|
USE_CONTINOUS
|
|
};
|
|
|
|
class CBaseTrigger : CBaseEntity
|
|
{
|
|
int m_strGlobalState;
|
|
string m_strTarget;
|
|
string m_strTargetName;
|
|
string m_strKillTarget;
|
|
string m_strMessage;
|
|
int m_iUseType;
|
|
void() CBaseTrigger;
|
|
virtual void() Trigger;
|
|
virtual void() UseTargets;
|
|
virtual int() GetValue;
|
|
virtual void( float del ) UseTargets_Delay;
|
|
virtual void() InitBrushTrigger;
|
|
virtual void() InitPointTrigger;
|
|
};
|
|
|
|
void CBaseTrigger :: UseTargets ( void )
|
|
{
|
|
for ( entity eFind = world; ( eFind = find( eFind, CBaseTrigger::m_strTargetName, m_strTarget ) ); ) {
|
|
CBaseTrigger trigger = (CBaseTrigger) eFind;
|
|
#ifdef GS_DEVELOPER
|
|
print( sprintf( "%s: Triggering %s `%s`\n",
|
|
this.classname, eFind.classname, trigger.m_strTargetName ) );
|
|
#endif
|
|
trigger.Trigger();
|
|
}
|
|
|
|
if ( m_strKillTarget ) {
|
|
entity eKill = find( world, CBaseTrigger::m_strTargetName, m_strKillTarget );
|
|
if ( eKill ) {
|
|
remove( eKill );
|
|
}
|
|
}
|
|
}
|
|
|
|
int CBaseTrigger :: GetValue ( void )
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
void CBaseTrigger :: UseTargets_Delay ( float fDelay )
|
|
{
|
|
static void Entities_UseTargets_Delay_Think( void ) {
|
|
CBaseTrigger::UseTargets();
|
|
remove( self );
|
|
}
|
|
|
|
#ifdef GS_DEVELOPER
|
|
print( sprintf( "CBaseTrigger: Delaying trigger of `%s`\n", m_strTarget ) );
|
|
#endif
|
|
|
|
CBaseTrigger eTimer = spawn( CBaseTrigger );
|
|
eTimer.owner = self;
|
|
eTimer.think = Entities_UseTargets_Delay_Think;
|
|
eTimer.m_strTarget = m_strTarget;
|
|
eTimer.nextthink = time + fDelay;
|
|
}
|
|
|
|
void CBaseTrigger :: Trigger ( void )
|
|
{
|
|
|
|
}
|
|
|
|
void CBaseTrigger :: InitPointTrigger ( void )
|
|
{
|
|
setsize( this, VEC_HULL_MIN, VEC_HULL_MAX );
|
|
solid = SOLID_TRIGGER;
|
|
}
|
|
|
|
void CBaseTrigger :: InitBrushTrigger ( void )
|
|
{
|
|
precache_model( model );
|
|
setmodel( this, model );
|
|
movetype = MOVETYPE_NONE;
|
|
#ifdef GS_DEVELOPER
|
|
alpha = 0.5f;
|
|
effects = EF_ADDITIVE;
|
|
#else
|
|
modelindex = 0;
|
|
model = "";
|
|
#endif
|
|
solid = SOLID_TRIGGER;
|
|
}
|
|
|
|
void CBaseTrigger :: CBaseTrigger ( void )
|
|
{
|
|
for ( int i = 1; i < ( tokenize( __fullspawndata ) - 1 ); i += 2 ) {
|
|
switch ( argv( i ) ) {
|
|
case "target":
|
|
m_strTarget = argv( i + 1 );
|
|
target = __NULL__;
|
|
break;
|
|
case "targetname":
|
|
m_strTargetName = argv( i + 1 );
|
|
targetname = __NULL__;
|
|
break;
|
|
case "killtarget":
|
|
m_strKillTarget = argv( i + 1 );
|
|
break;
|
|
case "message":
|
|
m_strMessage = argv( i + 1);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
CBaseEntity::CBaseEntity();
|
|
}
|