// // ButtonShot // int CBaseButton::TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) { BUTTON_CODE code = ButtonResponseToTouch(); if(code == BUTTON_NOTHING) return 0; // Temporarily disable the touch function, until movement is finished. SetTouch(NULL); m_hActivator = CBaseEntity::Instance(pevAttacker); if(m_hActivator == NULL) return 0; if(code == BUTTON_RETURN) { EMIT_SOUND(ENT(pev), CHAN_VOICE, (char *)STRING(pev->noise), 1, ATTN_NORM); // Toggle buttons fire when they get back to their "home" position if(!(pev->spawnflags & SF_BUTTON_TOGGLE)) SUB_UseTargets(m_hActivator, USE_TOGGLE, 0); ButtonReturn(); } else // code == BUTTON_ACTIVATE ButtonActivate(); return 0; }
// // Touching a button simply "activates" it. // void CBaseButton::ButtonTouch(CBaseEntity *pOther) { // Ignore touches by anything but players if(!FClassnameIs(pOther->pev, "player")) return; m_hActivator = pOther; BUTTON_CODE code = ButtonResponseToTouch(); if(code == BUTTON_NOTHING) return; if(!UTIL_IsMasterTriggered(m_sMaster, pOther)) { // play button locked sound PlayLockSounds(pev, &m_ls, TRUE, TRUE); return; } // Temporarily disable the touch function, until movement is finished. SetTouch(NULL); if(code == BUTTON_RETURN) { EMIT_SOUND(ENT(pev), CHAN_VOICE, (char *)STRING(pev->noise), 1, ATTN_NORM); SUB_UseTargets(m_hActivator, USE_TOGGLE, 0); ButtonReturn(); } else // code == BUTTON_ACTIVATE ButtonActivate(); }
void CBaseButton:: ButtonTouch( CBaseEntity *pOther ) { // ignore touches by anything but players if( !pOther->IsPlayer( )) return; m_hActivator = pOther; BUTTON_CODE code = ButtonResponseToTouch(); if( code == BUTTON_NOTHING ) return; if( IsLockedByMaster( )) { // play button locked sound PlayLockSounds( pev, &m_ls, TRUE, TRUE ); return; } // temporarily disable the touch function, until movement is finished. SetTouch( NULL ); if( code == BUTTON_RETURN ) { EMIT_SOUND( edict(), CHAN_VOICE, STRING( pev->noise ), 1, ATTN_NORM ); SUB_UseTargets( m_hActivator, USE_TOGGLE, 0 ); ButtonReturn(); } else { ButtonActivate( ); } }
int CBaseButton :: TakeDamage( entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType ) { if( FBitSet( pev->spawnflags, SF_BUTTON_DAMAGED_AT_LASER ) && !( bitsDamageType & DMG_ENERGYBEAM )) return 0; BUTTON_CODE code = ButtonResponseToTouch(); if( code == BUTTON_NOTHING ) return 0; // temporarily disable the touch function, until movement is finished. SetTouch( NULL ); m_hActivator = CBaseEntity::Instance( pevAttacker ); if( m_hActivator == NULL ) return 0; if( code == BUTTON_RETURN ) { EMIT_SOUND( edict(), CHAN_VOICE, STRING( pev->noise ), 1, ATTN_NORM ); // toggle buttons fire when they get back to their "home" position if( !FBitSet( pev->spawnflags, SF_BUTTON_TOGGLE )) SUB_UseTargets( m_hActivator, USE_TOGGLE, 0 ); ButtonReturn(); } else { // code == BUTTON_ACTIVATE ButtonActivate( ); } return 0; }
int CBaseButton::TakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) { BUTTON_CODE code = ButtonResponseToTouch(); if (code == BUTTON_NOTHING) return 0; SetTouch(NULL); m_hActivator = CBaseEntity::Instance(pevAttacker); if (m_hActivator == NULL) return 0; if (code == BUTTON_RETURN) { EMIT_SOUND(ENT(pev), CHAN_VOICE, STRING(pev->noise), VOL_NORM, ATTN_NORM); if (!(pev->spawnflags & SF_BUTTON_TOGGLE)) SUB_UseTargets(m_hActivator, USE_TOGGLE, 0); ButtonReturn(); } else ButtonActivate(); return 0; }
void CBaseButton::ButtonTouch(CBaseEntity *pOther) { if (!FClassnameIs(pOther->pev, "player")) return; m_hActivator = pOther; BUTTON_CODE code = ButtonResponseToTouch(); if (code == BUTTON_NOTHING) return; if (!UTIL_IsMasterTriggered(m_sMaster, pOther)) { PlayLockSounds(pev, &m_ls, TRUE, TRUE); return; } SetTouch(NULL); if (code == BUTTON_RETURN) { EMIT_SOUND(ENT(pev), CHAN_VOICE, STRING(pev->noise), VOL_NORM, ATTN_NORM); SUB_UseTargets(m_hActivator, USE_TOGGLE, 0); ButtonReturn(); } else ButtonActivate(); }
//----------------------------------------------------------------------------- // Purpose: We have been damaged. Possibly activate, depending on our flags. // Input : pInflictor - // pAttacker - // flDamage - // bitsDamageType - // Output : //----------------------------------------------------------------------------- int CBaseButton::OnTakeDamage( const CTakeDamageInfo &info ) { m_OnDamaged.FireOutput(m_hActivator, this); // dvsents2: remove obselete health keyvalue from func_button if (!HasSpawnFlags(SF_BUTTON_DAMAGE_ACTIVATES) && (m_iHealth == 0)) { return(0); } BUTTON_CODE code = ButtonResponseToTouch(); if ( code == BUTTON_NOTHING ) return 0; m_hActivator = info.GetAttacker(); // dvsents2: why would activator be NULL here? if ( m_hActivator == NULL ) return 0; if (m_bLocked) { return(0); } // Temporarily disable the touch function, until movement is finished. SetTouch( NULL ); if ( code == BUTTON_RETURN ) { if ( m_sNoise != NULL_STRING ) { CPASAttenuationFilter filter( this ); EmitSound_t ep; ep.m_nChannel = CHAN_VOICE; ep.m_pSoundName = (char*)STRING(m_sNoise); ep.m_flVolume = 1; ep.m_SoundLevel = SNDLVL_NORM; EmitSound( filter, entindex(), ep ); } m_OnPressed.FireOutput(m_hActivator, this); ButtonReturn(); } else { // code == BUTTON_ACTIVATE m_OnPressed.FireOutput(m_hActivator, this); ButtonActivate( ); } return 0; }
//----------------------------------------------------------------------------- // Presses or unpresses the button. //----------------------------------------------------------------------------- void CBaseButton::Press( CBaseEntity *pActivator, BUTTON_CODE eCode ) { if ( ( eCode == BUTTON_PRESS ) && ( m_toggle_state == TS_GOING_UP || m_toggle_state == TS_GOING_DOWN ) ) { return; } if ( ( eCode == BUTTON_ACTIVATE ) && ( m_toggle_state == TS_GOING_UP || m_toggle_state == TS_AT_TOP ) ) { return; } if ( ( eCode == BUTTON_RETURN ) && ( m_toggle_state == TS_GOING_DOWN || m_toggle_state == TS_AT_BOTTOM ) ) { return; } // FIXME: consolidate all the button press code into one place! if (m_bLocked) { // play button locked sound PlayLockSounds(this, &m_ls, TRUE, TRUE); return; } // Temporarily disable the touch function, until movement is finished. SetTouch( NULL ); if ( ( eCode == BUTTON_PRESS ) && ( m_toggle_state == TS_AT_TOP ) || ( ( eCode == BUTTON_RETURN ) && ( m_toggle_state == TS_AT_TOP || m_toggle_state == TS_GOING_UP ) ) ) { if ( m_sNoise != NULL_STRING ) { CPASAttenuationFilter filter( this ); EmitSound_t ep; ep.m_nChannel = CHAN_VOICE; ep.m_pSoundName = (char*)STRING(m_sNoise); ep.m_flVolume = 1; ep.m_SoundLevel = SNDLVL_NORM; EmitSound( filter, entindex(), ep ); } m_OnPressed.FireOutput(pActivator, this); ButtonReturn(); } else if ( ( eCode == BUTTON_PRESS ) || ( ( eCode == BUTTON_ACTIVATE ) && ( m_toggle_state == TS_AT_BOTTOM || m_toggle_state == TS_GOING_DOWN ) ) ) { m_OnPressed.FireOutput(pActivator, this); ButtonActivate(); } }
//----------------------------------------------------------------------------- // Purpose: Touch function that activates the button if it responds to touch. // Input : pOther - The entity that touched us. //----------------------------------------------------------------------------- void CBaseButton::ButtonTouch( CBaseEntity *pOther ) { // Ignore touches by anything but players if ( !pOther->IsPlayer() ) return; m_hActivator = pOther; BUTTON_CODE code = ButtonResponseToTouch(); if ( code == BUTTON_NOTHING ) return; if (!UTIL_IsMasterTriggered(m_sMaster, pOther) || m_bLocked) { // play button locked sound PlayLockSounds(this, &m_ls, TRUE, TRUE); return; } // Temporarily disable the touch function, until movement is finished. SetTouch( NULL ); if ( code == BUTTON_RETURN ) { if ( m_sNoise != NULL_STRING ) { CPASAttenuationFilter filter( this ); EmitSound_t ep; ep.m_nChannel = CHAN_VOICE; ep.m_pSoundName = (char*)STRING(m_sNoise); ep.m_flVolume = 1; ep.m_SoundLevel = SNDLVL_NORM; EmitSound( filter, entindex(), ep ); } m_OnPressed.FireOutput(m_hActivator, this); ButtonReturn(); } else { // code == BUTTON_ACTIVATE m_OnPressed.FireOutput(m_hActivator, this); ButtonActivate( ); } }
void CBaseButton::Restart() { m_hActivator = NULL; SetMovedir(pev); ButtonReturn(); if (pev->spawnflags & SF_BUTTON_TOUCH_ONLY) { SetTouch(&CBaseButton::ButtonTouch); } else { SetTouch(NULL); SetUse(&CBaseButton::ButtonUse); } }
//----------------------------------------------------------------------------- // Purpose: Use function that starts the button moving. // Input : pActivator - // pCaller - // useType - // value - //----------------------------------------------------------------------------- void CBaseButton::ButtonUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) { // Ignore touches if button is moving, or pushed-in and waiting to auto-come-out. // UNDONE: Should this use ButtonResponseToTouch() too? if (m_toggle_state == TS_GOING_UP || m_toggle_state == TS_GOING_DOWN ) return; if (m_bLocked) { OnUseLocked( pActivator ); return; } m_hActivator = pActivator; if ( m_toggle_state == TS_AT_TOP) { // // If it's a toggle button it can return now. Otherwise, it will either // return on its own or will stay pressed indefinitely. // if ( HasSpawnFlags(SF_BUTTON_TOGGLE)) { if ( m_sNoise != NULL_STRING ) { CPASAttenuationFilter filter( this ); EmitSound_t ep; ep.m_nChannel = CHAN_VOICE; ep.m_pSoundName = (char*)STRING(m_sNoise); ep.m_flVolume = 1; ep.m_SoundLevel = SNDLVL_NORM; EmitSound( filter, entindex(), ep ); } m_OnPressed.FireOutput(m_hActivator, this); ButtonReturn(); } } else { m_OnPressed.FireOutput(m_hActivator, this); ButtonActivate( ); } }
void CBaseButton::ButtonUse(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { if (m_toggle_state == TS_GOING_UP || m_toggle_state == TS_GOING_DOWN) return; m_hActivator = pActivator; if (m_toggle_state == TS_AT_TOP) { if (!m_fStayPushed && FBitSet(pev->spawnflags, SF_BUTTON_TOGGLE)) { EMIT_SOUND(ENT(pev), CHAN_VOICE, STRING(pev->noise), VOL_NORM, ATTN_NORM); ButtonReturn(); } } else ButtonActivate(); }
// Button's Use function void CBaseButton::ButtonUse(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value) { // Ignore touches if button is moving, or pushed-in and waiting to auto-come-out. // UNDONE: Should this use ButtonResponseToTouch() too? if (m_toggle_state == TS_GOING_UP || m_toggle_state == TS_GOING_DOWN) return; m_hActivator = pActivator; if (m_toggle_state == TS_AT_TOP) { if (!m_fStayPushed && (pev->spawnflags & SF_BUTTON_TOGGLE)) { EMIT_SOUND(ENT(pev), CHAN_VOICE, (char *)STRING(pev->noise), VOL_NORM, ATTN_NORM); //SUB_UseTargets(m_eoActivator); ButtonReturn(); } } else ButtonActivate(); }
void CBaseButton::TriggerAndWait( void ) { ASSERT( m_iState == STATE_TURN_ON ); if( IsLockedByMaster( )) return; m_iState = STATE_ON; // if button automatically comes back out, start it moving out. // else re-instate touch method if( m_fStayPushed || FBitSet( pev->spawnflags, SF_BUTTON_TOGGLE )) { // this button only works if USED, not touched! if( !FBitSet( pev->spawnflags, SF_BUTTON_TOUCH_ONLY )) { // all buttons are now use only SetTouch( NULL ); } else { SetTouch( &CBaseButton::ButtonTouch ); } } else { SetThink( &CBaseButton::ButtonReturn ); if( m_flWait ) { SetNextThink( m_flWait ); } else { ButtonReturn(); } } // use alternate textures pev->frame = 1; SUB_UseTargets( m_hActivator, USE_TOGGLE, 0 ); }
void CBaseButton :: ButtonUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) { // ignore touches if button is moving, or pushed-in and waiting to auto-come-out. if( m_iState == STATE_TURN_ON || m_iState == STATE_TURN_OFF ) return; m_hActivator = pActivator; if( m_iState == STATE_ON ) { if( !m_fStayPushed && FBitSet( pev->spawnflags, SF_BUTTON_TOGGLE )) { EMIT_SOUND( edict(), CHAN_VOICE, STRING( pev->noise ), 1, ATTN_NORM ); ButtonReturn(); } } else { ButtonActivate( ); } }