1 // NOTE: also contains trigger_once at bottom
4 // the wait time has passed, so set back up for another activation
9 self.health = self.max_health;
10 self.takedamage = DAMAGE_YES;
11 self.solid = SOLID_BBOX;
16 // the trigger was just touched/killed/used
17 // self.enemy should be set to the activator so it can be held through a delay
18 // so wait for the delay time before firing
21 if (self.nextthink > time)
23 return; // allready been triggered
26 if (self.classname == "trigger_secret")
28 if (!IS_PLAYER(self.enemy))
30 found_secrets = found_secrets + 1;
31 WriteByte (MSG_ALL, SVC_FOUNDSECRET);
35 sound (self.enemy, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM);
37 // don't trigger again until reset
38 self.takedamage = DAMAGE_NO;
40 activator = self.enemy;
41 other = self.goalentity;
46 self.think = multi_wait;
47 self.nextthink = time + self.wait;
49 else if (self.wait == 0)
51 multi_wait(); // waiting finished
54 { // we can't just remove (self) here, because this is a touch function
55 // called wheil C code is looping through area links...
56 self.touch = func_null;
62 self.goalentity = other;
63 self.enemy = activator;
69 if(!(self.spawnflags & 2))
74 if(((self.spawnflags & 4) == 0) == (self.team != other.team))
77 // if the trigger has an angles field, check player's facing direction
78 if (self.movedir != '0 0 0')
80 makevectors (other.angles);
81 if (v_forward * self.movedir < 0)
82 return; // not facing the right way
88 self.goalentity = other;
92 void multi_eventdamage (entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force)
96 if(self.spawnflags & DOOR_NOSPLASH)
97 if(!(DEATH_ISSPECIAL(deathtype)) && (deathtype & HITTYPE_SPLASH))
99 self.health = self.health - damage;
100 if (self.health <= 0)
102 self.enemy = attacker;
103 self.goalentity = inflictor;
110 if ( !(self.spawnflags & SPAWNFLAG_NOTOUCH) )
111 self.touch = multi_touch;
114 self.health = self.max_health;
115 self.takedamage = DAMAGE_YES;
116 self.solid = SOLID_BBOX;
118 self.think = func_null;
120 self.team = self.team_saved;
123 /*QUAKED spawnfunc_trigger_multiple (.5 .5 .5) ? notouch
124 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.
125 If "delay" is set, the trigger waits some time after activating before firing.
126 "wait" : Seconds between triggerings. (.2 default)
127 If notouch is set, the trigger is only fired by other entities, not by touching.
128 NOTOUCH has been obsoleted by spawnfunc_trigger_relay!
134 set "message" to text string
136 void spawnfunc_trigger_multiple()
138 self.reset = multi_reset;
139 if (self.sounds == 1)
141 precache_sound ("misc/secret.wav");
142 self.noise = "misc/secret.wav";
144 else if (self.sounds == 2)
146 precache_sound ("misc/talk.wav");
147 self.noise = "misc/talk.wav";
149 else if (self.sounds == 3)
151 precache_sound ("misc/trigger1.wav");
152 self.noise = "misc/trigger1.wav";
157 else if(self.wait < -1)
159 self.use = multi_use;
163 self.team_saved = self.team;
167 if (self.spawnflags & SPAWNFLAG_NOTOUCH)
168 objerror ("health and notouch don't make sense\n");
169 self.max_health = self.health;
170 self.event_damage = multi_eventdamage;
171 self.takedamage = DAMAGE_YES;
172 self.solid = SOLID_BBOX;
173 setorigin (self, self.origin); // make sure it links into the world
177 if ( !(self.spawnflags & SPAWNFLAG_NOTOUCH) )
179 self.touch = multi_touch;
180 setorigin (self, self.origin); // make sure it links into the world
186 /*QUAKED spawnfunc_trigger_once (.5 .5 .5) ? notouch
187 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
188 "targetname". If "health" is set, the trigger must be killed to activate.
189 If notouch is set, the trigger is only fired by other entities, not by touching.
190 if "killtarget" is set, any objects that have a matching "target" will be removed when the trigger is fired.
191 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.
197 set "message" to text string
199 void spawnfunc_trigger_once()
202 spawnfunc_trigger_multiple();