]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/triggers/func/button.qc
Fix the use of self, activator and other globals in .use
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / triggers / func / button.qc
1 #ifdef SVQC
2 // button and multiple button
3
4 void() button_wait;
5 void() button_return;
6
7 void button_wait()
8 {SELFPARAM();
9         self.state = STATE_TOP;
10         self.SUB_NEXTTHINK = self.SUB_LTIME + self.wait;
11         self.SUB_THINK = button_return;
12         SUB_UseTargets(self, self.enemy, NULL);
13         self.frame = 1;                 // use alternate textures
14 }
15
16 void button_done()
17 {SELFPARAM();
18         self.state = STATE_BOTTOM;
19 }
20
21 void button_return()
22 {SELFPARAM();
23         self.state = STATE_DOWN;
24         SUB_CalcMove (self.pos1, TSPEED_LINEAR, self.speed, button_done);
25         self.frame = 0;                 // use normal textures
26         if (self.health)
27                 self.takedamage = DAMAGE_YES;   // can be shot again
28 }
29
30
31 void button_blocked()
32 {
33         // do nothing, just don't come all the way back out
34 }
35
36
37 void button_fire()
38 {SELFPARAM();
39         self.health = self.max_health;
40         self.takedamage = DAMAGE_NO;    // will be reset upon return
41
42         if (self.state == STATE_UP || self.state == STATE_TOP)
43                 return;
44
45         if (self.noise != "")
46                 _sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM);
47
48         self.state = STATE_UP;
49         SUB_CalcMove (self.pos2, TSPEED_LINEAR, self.speed, button_wait);
50 }
51
52 void button_reset()
53 {SELFPARAM();
54         self.health = self.max_health;
55         setorigin(self, self.pos1);
56         self.frame = 0;                 // use normal textures
57         self.state = STATE_BOTTOM;
58         if (self.health)
59                 self.takedamage = DAMAGE_YES;   // can be shot again
60 }
61
62 void button_use(entity this, entity actor, entity trigger)
63 {
64         if(this.active != ACTIVE_ACTIVE)
65                 return;
66
67         this.enemy = actor;
68         WITHSELF(this, button_fire());
69 }
70
71 void button_touch()
72 {SELFPARAM();
73         if (!other)
74                 return;
75         if (!other.iscreature)
76                 return;
77         if(other.velocity * self.movedir < 0)
78                 return;
79         self.enemy = other;
80         if (other.owner)
81                 self.enemy = other.owner;
82         button_fire ();
83 }
84
85 void button_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force)
86 {
87         if(this.spawnflags & DOOR_NOSPLASH)
88                 if(!(DEATH_ISSPECIAL(deathtype)) && (deathtype & HITTYPE_SPLASH))
89                         return;
90         this.health = this.health - damage;
91         if (this.health <= 0)
92         {
93                 this.enemy = damage_attacker;
94                 WITHSELF(this, button_fire());
95         }
96 }
97
98
99 /*QUAKED spawnfunc_func_button (0 .5 .8) ?
100 When a button is touched, it moves some distance in the direction of it's angle, triggers all of it's targets, waits some time, then returns to it's original position where it can be triggered again.
101
102 "angle"         determines the opening direction
103 "target"        all entities with a matching targetname will be used
104 "speed"         override the default 40 speed
105 "wait"          override the default 1 second wait (-1 = never return)
106 "lip"           override the default 4 pixel lip remaining at end of move
107 "health"        if set, the button must be killed instead of touched. If set to -1, the button will fire on ANY attack, even damageless ones like the InstaGib laser
108 "sounds"
109 0) steam metal
110 1) wooden clunk
111 2) metallic click
112 3) in-out
113 */
114 spawnfunc(func_button)
115 {
116         SetMovedir(self);
117
118         if (!InitMovingBrushTrigger())
119                 return;
120         self.effects |= EF_LOWPRECISION;
121
122         self.blocked = button_blocked;
123         self.use1 = button_use;
124
125 //      if (self.health == 0) // all buttons are now shootable
126 //              self.health = 10;
127         if (self.health)
128         {
129                 self.max_health = self.health;
130                 self.event_damage = button_damage;
131                 self.takedamage = DAMAGE_YES;
132         }
133         else
134                 self.touch = button_touch;
135
136         if (!self.speed)
137                 self.speed = 40;
138         if (!self.wait)
139                 self.wait = 1;
140         if (!self.lip)
141                 self.lip = 4;
142
143     if(self.noise != "")
144         precache_sound(self.noise);
145
146         self.active = ACTIVE_ACTIVE;
147
148         self.pos1 = self.origin;
149         self.pos2 = self.pos1 + self.movedir*(fabs(self.movedir*self.size) - self.lip);
150     self.flags |= FL_NOTARGET;
151
152         button_reset();
153 }
154 #endif