6 activator = self.enemy;
12 ==============================
15 the global "activator" should be set to the entity that initiated the firing.
17 If self.delay is set, a DelayedUse entity will be created that will actually
18 do the SUB_UseTargets after that many seconds have passed.
20 Centerprints any self.message to the activator.
22 Removes all entities with a targetname that match self.killtarget,
23 and removes them, so some events can remove other triggers.
25 Search for (string)targetname in all entities that
26 match (string)self.target and call their .use function
28 ==============================
30 void() SUB_UseTargets =
32 local entity t, stemp, otemp, act;
39 // create a temp object to fire at a later time
41 t.classname = "DelayedUse";
42 t.nextthink = time + self.delay;
45 t.message = self.message;
46 t.killtarget = self.killtarget;
47 t.target = self.target;
55 if (activator.classname == "player" && self.message != "")
57 centerprint (activator, self.message);
59 sound (activator, CHAN_VOICE, "misc/talk.wav", 1, ATTN_NORM);
63 // kill the killtagets
70 t = find (t, targetname, self.killtarget);
86 t = find (t, targetname, self.target);
95 if (self.use != SUB_Null)
109 entity stemp, otemp, s, old;
112 void() trigger_reactivate =
114 self.solid = SOLID_TRIGGER;
117 //=============================================================================
119 float SPAWNFLAG_NOMESSAGE = 1;
120 float SPAWNFLAG_NOTOUCH = 1;
122 // the wait time has passed, so set back up for another activation
127 self.health = self.max_health;
128 self.takedamage = DAMAGE_YES;
129 self.solid = SOLID_BBOX;
134 // the trigger was just touched/killed/used
135 // self.enemy should be set to the activator so it can be held through a delay
136 // so wait for the delay time before firing
137 void() multi_trigger =
139 if (self.nextthink > time)
141 return; // allready been triggered
144 if (self.classname == "trigger_secret")
146 if (self.enemy.classname != "player")
148 found_secrets = found_secrets + 1;
149 WriteByte (MSG_ALL, SVC_FOUNDSECRET);
153 sound (self, CHAN_VOICE, self.noise, 1, ATTN_NORM);
155 // don't trigger again until reset
156 self.takedamage = DAMAGE_NO;
158 activator = self.enemy;
164 self.think = multi_wait;
165 self.nextthink = time + self.wait;
168 { // we can't just remove (self) here, because this is a touch function
169 // called wheil C code is looping through area links...
170 self.touch = SUB_Null;
171 self.nextthink = time + 0.1;
172 self.think = SUB_Remove;
178 self.enemy = activator;
184 if (other.classname != "player")
187 // if the trigger has an angles field, check player's facing direction
188 if (self.movedir != '0 0 0')
190 makevectors (other.angles);
191 if (v_forward * self.movedir < 0)
192 return; // not facing the right way
199 void multi_eventdamage (vector hitloc, float damage, entity inflictor, entity attacker, float deathtype)
201 if (!self.takedamage)
203 self.health = self.health - damage;
204 if (self.health <= 0)
206 self.enemy = attacker;
211 /*QUAKED trigger_multiple (.5 .5 .5) ? notouch
212 Variable sized repeatable trigger. Must be targeted at one or more entities. If "health" is set, the trigger must be killed to activate each time.
213 If "delay" is set, the trigger waits some time after activating before firing.
214 "wait" : Seconds between triggerings. (.2 default)
215 If notouch is set, the trigger is only fired by other entities, not by touching.
216 NOTOUCH has been obsoleted by trigger_relay!
222 set "message" to text string
224 void() trigger_multiple =
226 if (self.sounds == 1)
228 precache_sound ("misc/secret.wav");
229 self.noise = "misc/secret.wav";
231 else if (self.sounds == 2)
233 precache_sound ("misc/talk.wav");
234 self.noise = "misc/talk.wav";
236 else if (self.sounds == 3)
238 precache_sound ("misc/trigger1.wav");
239 self.noise = "misc/trigger1.wav";
244 self.use = multi_use;
250 if (self.spawnflags & SPAWNFLAG_NOTOUCH)
251 objerror ("health and notouch don't make sense\n");
252 self.max_health = self.health;
253 self.event_damage = multi_eventdamage;
254 self.takedamage = DAMAGE_YES;
255 self.solid = SOLID_BBOX;
256 setorigin (self, self.origin); // make sure it links into the world
260 if ( !(self.spawnflags & SPAWNFLAG_NOTOUCH) )
262 self.touch = multi_touch;
268 /*QUAKED trigger_once (.5 .5 .5) ? notouch
269 Variable sized trigger. Triggers once, then removes itself. You must set the key "target" to the name of another object in the level that has a matching
270 "targetname". If "health" is set, the trigger must be killed to activate.
271 If notouch is set, the trigger is only fired by other entities, not by touching.
272 if "killtarget" is set, any objects that have a matching "target" will be removed when the trigger is fired.
273 if "angle" is set, the trigger will only fire when someone is facing the direction of the angle. Use "360" for an angle of 0.
279 set "message" to text string
281 void() trigger_once =
287 //=============================================================================
289 /*QUAKED trigger_relay (.5 .5 .5) (-8 -8 -8) (8 8 8)
290 This fixed size trigger cannot be touched, it can only be fired by other events. It can contain killtargets, targets, delays, and messages.
292 void() trigger_relay =
294 self.use = SUB_UseTargets;
298 //=============================================================================
305 self.count = self.count - 1;
311 if (activator.classname == "player"
312 && (self.spawnflags & SPAWNFLAG_NOMESSAGE) == 0)
315 centerprint (activator, "There are more to go...");
316 else if (self.count == 3)
317 centerprint (activator, "Only 3 more to go...");
318 else if (self.count == 2)
319 centerprint (activator, "Only 2 more to go...");
321 centerprint (activator, "Only 1 more to go...");
326 if (activator.classname == "player"
327 && (self.spawnflags & SPAWNFLAG_NOMESSAGE) == 0)
328 centerprint(activator, "Sequence completed!");
329 self.enemy = activator;
333 /*QUAKED trigger_counter (.5 .5 .5) ? nomessage
334 Acts as an intermediary for an action that takes multiple inputs.
336 If nomessage is not set, t will print "1 more.. " etc when triggered and "sequence complete" when finished.
338 After the counter has been triggered "count" times (default 2), it will fire all of it's targets and remove itself.
340 void() trigger_counter =
346 self.use = counter_use;
351 self.solid = SOLID_TRIGGER;
357 if (other.takedamage)
359 self.solid = SOLID_NOT;
360 Damage (other, self, self, self.dmg, 1, '0 0 0', '0 0 0');
361 self.think = hurt_on;
362 self.nextthink = time + 1;
368 /*QUAKED trigger_hurt (.5 .5 .5) ?
369 Any object touching this will be hurt
370 set dmg to damage amount
373 void() trigger_hurt =
376 self.touch = hurt_touch;
381 //void() target_speaker_use = {sound(self, CHAN_VOICE, self.noise, 1, 1);}
382 //void() target_speaker = {self.use = target_speaker_use;}
384 void() target_speaker =
387 precache_sound (self.noise);
388 ambientsound (self.origin, self.noise, 1, ATTN_STATIC);