Add trigger_bit_counter implementation.

This commit is contained in:
Night Owl 2018-09-01 13:00:37 +05:00
parent 1497e23b99
commit 2d472ea0b2
1 changed files with 93 additions and 0 deletions

View File

@ -2159,6 +2159,99 @@ void CTriggerBit::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE u
SUB_UseTargets( this, USE_TOGGLE, 1 );
}
class CTriggerBitCounter : public CMultiSource
{
public:
void KeyValue( KeyValueData *pkvd );
void Spawn();
void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
int Save( CSave &save );
int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[];
private:
int m_initialstate;
int m_iDesiredBit;
};
LINK_ENTITY_TO_CLASS( trigger_bit_counter, CMultiSource )
TYPEDESCRIPTION CTriggerBitCounter::m_SaveData[] =
{
DEFINE_FIELD( CTriggerBitCounter, m_initialstate, FIELD_INTEGER ),
DEFINE_FIELD( CTriggerBitCounter, m_iDesiredBit, FIELD_INTEGER ),
};
IMPLEMENT_SAVERESTORE( CTriggerBitCounter, CMultiSource )
void CTriggerBitCounter::KeyValue( KeyValueData *pkvd )
{
if( FStrEq( pkvd->szKeyName, "triggermask" ) )
{
m_iDesiredBit = atoi( pkvd->szValue );
pkvd->fHandled = TRUE;
}
else if( FStrEq( pkvd->szKeyName, "initialstate" ) )
{
m_initialstate = pev->skin = atoi( pkvd->szValue );
pkvd->fHandled = TRUE;
}
else
CMultiSource::KeyValue( pkvd );
}
void CTriggerBitCounter::Spawn()
{
if( !m_globalstate )
{
REMOVE_ENTITY( ENT( pev ) );
return;
}
if( !gGlobalState.EntityInTable( m_globalstate ) )
gGlobalState.EntityAdd( m_globalstate, gpGlobals->mapname, (GLOBALESTATE)m_initialstate );
}
void CTriggerBitCounter::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
{
int oldState, newState;
if( !pActivator )
return;
if( m_globalstate )
oldState = gGlobalState.EntityGetState( m_globalstate );
else
oldState = pev->skin;
switch( useType )
{
case USE_OFF:
newState = ~pev->skin & oldState;
break;
case USE_ON:
newState = pev->skin | oldState;
break;
case USE_TOGGLE:
default:
newState = pev->skin ^ oldState;
break;
}
if( newState == m_iDesiredBit )
SUB_UseTargets( this, USE_TOGGLE, 0 );
if( m_globalstate )
{
if( gGlobalState.EntityInTable( m_globalstate ) )
gGlobalState.EntitySetState( m_globalstate, (GLOBALESTATE)newState );
else
gGlobalState.EntityAdd( m_globalstate, gpGlobals->mapname, (GLOBALESTATE)newState );
}
else
pev->skin = newState;
}
// this is a really bad idea.
class CTriggerChangeTarget : public CBaseDelay
{