]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/triggers/trigger/gravity.qc
Merge branch 'master' into Mirio/balance
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / triggers / trigger / gravity.qc
1 #include "gravity.qh"
2 #ifdef SVQC
3 .entity trigger_gravity_check;
4 void trigger_gravity_remove(entity own)
5 {
6         if(own.trigger_gravity_check.owner == own)
7         {
8                 UpdateCSQCProjectile(own);
9                 own.gravity = own.trigger_gravity_check.gravity;
10                 delete(own.trigger_gravity_check);
11         }
12         else
13                 backtrace("Removing a trigger_gravity_check with no valid owner");
14         own.trigger_gravity_check = NULL;
15 }
16 void trigger_gravity_check_think(entity this)
17 {
18         // This spawns when a player enters the gravity zone and checks if he left.
19         // Each frame, this.count is set to 2 by trigger_gravity_touch() and decreased by 1 here.
20         // It the player has left the gravity trigger, this will be allowed to reach 0 and indicate that.
21         if(this.count <= 0)
22         {
23                 if(this.owner.trigger_gravity_check == this)
24                         trigger_gravity_remove(this.owner);
25                 else
26                         delete(this);
27                 return;
28         }
29         else
30         {
31                 this.count -= 1;
32                 this.nextthink = time;
33         }
34 }
35
36 void trigger_gravity_use(entity this, entity actor, entity trigger)
37 {
38         this.state = !this.state;
39 }
40
41 void trigger_gravity_touch(entity this, entity toucher)
42 {
43         float g;
44
45         if(this.state != true)
46                 return;
47
48         EXACTTRIGGER_TOUCH(this, toucher);
49
50         g = this.gravity;
51
52         if (!(this.spawnflags & 1))
53         {
54                 if(toucher.trigger_gravity_check)
55                 {
56                         if(this == toucher.trigger_gravity_check.enemy)
57                         {
58                                 // same?
59                                 toucher.trigger_gravity_check.count = 2; // gravity one more frame...
60                                 return;
61                         }
62
63                         // compare prio
64                         if(this.cnt > toucher.trigger_gravity_check.enemy.cnt)
65                                 trigger_gravity_remove(toucher);
66                         else
67                                 return;
68                 }
69                 toucher.trigger_gravity_check = spawn();
70                 toucher.trigger_gravity_check.enemy = this;
71                 toucher.trigger_gravity_check.owner = toucher;
72                 toucher.trigger_gravity_check.gravity = toucher.gravity;
73                 setthink(toucher.trigger_gravity_check, trigger_gravity_check_think);
74                 toucher.trigger_gravity_check.nextthink = time;
75                 toucher.trigger_gravity_check.count = 2;
76                 if(toucher.gravity)
77                         g *= toucher.gravity;
78         }
79
80         if (toucher.gravity != g)
81         {
82                 toucher.gravity = g;
83                 if(this.noise != "")
84                         _sound (toucher, CH_TRIGGER, this.noise, VOL_BASE, ATTEN_NORM);
85                 UpdateCSQCProjectile(this.owner);
86         }
87 }
88
89 spawnfunc(trigger_gravity)
90 {
91         if(this.gravity == 1)
92                 return;
93
94         EXACTTRIGGER_INIT;
95         settouch(this, trigger_gravity_touch);
96         if(this.noise != "")
97                 precache_sound(this.noise);
98
99         this.state = true;
100         IFTARGETED
101         {
102                 this.use = trigger_gravity_use;
103                 if(this.spawnflags & 2)
104                         this.state = false;
105         }
106 }
107 #endif