]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/triggers/trigger/multivibrator.qc
Move mod directory below qcsrc
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / triggers / trigger / multivibrator.qc
1 #ifdef SVQC
2 void multivibrator_send()
3 {
4         float newstate;
5         float cyclestart;
6
7         cyclestart = floor((time + self.phase) / (self.wait + self.respawntime)) * (self.wait + self.respawntime) - self.phase;
8
9         newstate = (time < cyclestart + self.wait);
10
11         activator = self;
12         if(self.state != newstate)
13                 SUB_UseTargets();
14         self.state = newstate;
15
16         if(self.state)
17                 self.nextthink = cyclestart + self.wait + 0.01;
18         else
19                 self.nextthink = cyclestart + self.wait + self.respawntime + 0.01;
20 }
21
22 void multivibrator_toggle()
23 {
24         if(self.nextthink == 0)
25         {
26                 multivibrator_send();
27         }
28         else
29         {
30                 if(self.state)
31                 {
32                         SUB_UseTargets();
33                         self.state = 0;
34                 }
35                 self.nextthink = 0;
36         }
37 }
38
39 void multivibrator_reset()
40 {
41         if(!(self.spawnflags & 1))
42                 self.nextthink = 0; // wait for a trigger event
43         else
44                 self.nextthink = max(1, time);
45 }
46
47 /*QUAKED trigger_multivibrator (.5 .5 .5) (-8 -8 -8) (8 8 8) START_ON
48 "Multivibrator" trigger gate... repeatedly sends trigger events. When triggered, turns on or off.
49 -------- KEYS --------
50 target: trigger all entities with this targetname when it goes off
51 targetname: name that identifies this entity so it can be triggered; when off, it always uses the OFF state
52 phase: offset of the timing
53 wait: "on" cycle time (default: 1)
54 respawntime: "off" cycle time (default: same as wait)
55 -------- SPAWNFLAGS --------
56 START_ON: assume it is already turned on (when targeted)
57 */
58 void spawnfunc_trigger_multivibrator()
59 {
60         if(!self.wait)
61                 self.wait = 1;
62         if(!self.respawntime)
63                 self.respawntime = self.wait;
64
65         self.state = 0;
66         self.use = multivibrator_toggle;
67         self.think = multivibrator_send;
68         self.nextthink = max(1, time);
69
70         IFTARGETED
71                 multivibrator_reset();
72 }
73 #endif