void UseSiegeTarget( gentity_t *other, gentity_t *en, char *target ) { //actually use the player which triggered the object which triggered the siege objective to trigger the target gentity_t *t; gentity_t *ent; if ( !en || !en->client ) { //looks like we don't have access to a player, so just use the activating entity ent = other; } else { ent = en; } if ( !en ) { return; } if ( !target ) { return; } t = NULL; while ( (t = G_Find( t, FOFS( targetname ), target )) != NULL ) { if ( t == ent ) { trap->Print( "WARNING: Entity used itself.\n" ); } else { if ( t->use ) { GlobalUse( t, ent, ent ); } } if ( !ent->inuse ) { trap->Print( "entity was removed while using targets\n" ); return; } } }
/*QUAKED target_relay (.5 .5 .5) (-8 -8 -8) (8 8 8) RED_ONLY BLUE_ONLY RANDOM x x x x INACTIVE This doesn't perform any actions except fire its targets. The activator can be forced to be from a certain team. if RANDOM is checked, only one of the targets will be fired, not all of them INACTIVE Can't be used until activated wait - set to -1 to use it only once */ void target_relay_use (gentity_t *self, gentity_t *other, gentity_t *activator) { qboolean ranscript = qfalse; if ( ( self->spawnflags & 1 ) && activator->client && activator->client->sess.sessionTeam != TEAM_RED ) { return; } if ( ( self->spawnflags & 2 ) && activator->client && activator->client->sess.sessionTeam != TEAM_BLUE ) { return; } if ( self->flags & FL_INACTIVE ) {//set by target_deactivate return; } ranscript = G_ActivateBehavior( self, BSET_USE ); if ( self->wait == -1 ) {//never use again if ( ranscript ) {//crap, can't remove! self->use = NULL; } else {//remove self->think = G_FreeEntity; self->nextthink = level.time + FRAMETIME; } } if ( self->spawnflags & 4 ) { gentity_t *ent; ent = G_PickTarget( self->target ); if ( ent && ent->use ) { GlobalUse( ent, self, activator ); } return; } G_UseTargets (self, activator); }
void target_random_use(gentity_t *self, gentity_t *other, gentity_t *activator) { int t_count = 0, pick; gentity_t *t = NULL; //gi.Printf("target_random %s used by %s (entnum %d)\n", self->targetname, activator->targetname, activator->s.number ); G_ActivateBehavior(self,BSET_USE); if(self->spawnflags & 1) { self->use = 0; } while ( (t = G_Find (t, FOFS(targetname), self->target)) != NULL ) { if (t != self) { t_count++; } } if(!t_count) { return; } if(t_count == 1) { G_UseTargets (self, activator); return; } //FIXME: need a seed // FIXME2: Proper numbers now pick = Q_irand(0, t_count-1); t_count = 0; while ( (t = G_Find (t, FOFS(targetname), self->target)) != NULL ) { if (t != self) { t_count++; } else { continue; } if (t == self) { // gi.Printf ("WARNING: Entity used itself.\n"); } else if(t_count == pick) { if (t->use != NULL) // check can be omitted { GlobalUse(t, self, activator); return; } } if (!self->inuse) { Com_Printf("entity was removed while using targets\n"); return; } } }
void target_random_use(gentity_t *self, gentity_t *other, gentity_t *activator) { int t_count = 0, pick; gentity_t *t = NULL; G_ActivateBehavior(self,BSET_USE); if(self->spawnflags & 1) { self->use = 0; } while ( (t = G_Find (t, FOFS(targetname), self->target)) != NULL ) { if (t != self) { t_count++; } } if(!t_count) { return; } if(t_count == 1) { G_UseTargets (self, activator); return; } //FIXME: need a seed pick = Q_irand(1, t_count); t_count = 0; while ( (t = G_Find (t, FOFS(targetname), self->target)) != NULL ) { if (t != self) { t_count++; } else { continue; } if (t == self) { } else if(t_count == pick) { if (t->use != NULL) // check can be omitted { GlobalUse(t, self, activator); return; } } if (!self->inuse) { Com_Printf("entity was removed while using targets\n"); return; } } }