void multi_trigger( gentity_t *ent, gentity_t *activator ) { if ( ent->e_ThinkFunc == thinkF_multi_trigger_run ) {//already triggered, just waiting to run return; } if ( ent->nextthink > level.time ) { if( ent->spawnflags & 2048 ) // MULTIPLE - allow multiple entities to touch this trigger in a single frame { if ( ent->painDebounceTime && ent->painDebounceTime != level.time ) {//this should still allow subsequent ents to fire this trigger in the current frame return; // can't retrigger until the wait is over } } else { return; } } if ( ent->spawnflags & 32) { ent->nextthink = level.time + ent->delay; // trace_t viewTrace; // gi.trace(&viewTrace, ent->currentOrigin, 0, 0, activator->currentOrigin, ent->s.number, MASK_SHOT); // if ((viewTrace.allsolid) || (viewTrace.startsolid) || (viewTrace.entityNum!=activator->s.number)) // { // return; // } } // if the player has already activated this trigger this frame if( activator && !activator->s.number && ent->aimDebounceTime == level.time ) { return; } if ( ent->svFlags & SVF_INACTIVE ) {//Not active at this time return; } ent->activator = activator; if(ent->delay && ent->painDebounceTime < (level.time + ent->delay) ) {//delay before firing trigger ent->e_ThinkFunc = thinkF_multi_trigger_run; ent->nextthink = level.time + ent->delay; ent->painDebounceTime = level.time; } else { multi_trigger_run (ent); } }
void multi_trigger( gentity_t *ent, gentity_t *activator ) { qboolean haltTrigger = qfalse; if ( ent->think == multi_trigger_run ) {//already triggered, just waiting to run return; } if (haltTrigger) { //This is an objective trigger and the activator is not carrying an objective item that matches the targetname. return; } if ( ent->nextthink > level.time ) { if( ent->spawnflags & 2048 ) // MULTIPLE - allow multiple entities to touch this trigger in a single frame { if ( ent->painDebounceTime && ent->painDebounceTime != level.time ) {//this should still allow subsequent ents to fire this trigger in the current frame return; // can't retrigger until the wait is over } } else { return; } } // if the player has already activated this trigger this frame if( activator && activator->s.number < MAX_CLIENTS && ent->aimDebounceTime == level.time ) { return; } if ( ent->flags & FL_INACTIVE ) {//Not active at this time return; } ent->activator = activator; if(ent->delay && ent->painDebounceTime < (level.time + ent->delay) ) {//delay before firing trigger ent->think = multi_trigger_run; ent->nextthink = level.time + ent->delay; ent->painDebounceTime = level.time; } else { multi_trigger_run (ent); } }