]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/generator.qc
Merge branch 'terencehill/menu_weaponarena_selection_fix' into 'master'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / generator.qc
1 #include "generator.qh"
2
3 bool generator_precached;
4 .int count;
5 .float max_health;
6
7 void generator_precache()
8 {
9         if(generator_precached)
10                 return; // already precached
11
12         precache_model("models/onslaught/generator.md3");
13         precache_model("models/onslaught/generator_dead.md3");
14         precache_model("models/onslaught/generator_dmg1.md3");
15         precache_model("models/onslaught/generator_dmg2.md3");
16         precache_model("models/onslaught/generator_dmg3.md3");
17         precache_model("models/onslaught/generator_dmg4.md3");
18         precache_model("models/onslaught/generator_dmg5.md3");
19         precache_model("models/onslaught/generator_dmg6.md3");
20         precache_model("models/onslaught/generator_dmg7.md3");
21         precache_model("models/onslaught/generator_dmg8.md3");
22         precache_model("models/onslaught/generator_dmg9.md3");
23         precache_model("models/onslaught/generator_dead.md3");
24
25         precache_model("models/onslaught/ons_ray.md3");
26         precache_sound("onslaught/shockwave.wav");
27         precache_sound(W_Sound("grenade_impact"));
28         precache_sound(W_Sound("rocket_impact"));
29         precache_sound("onslaught/electricity_explode.wav");
30
31         generator_precached = true;
32 }
33
34 void ons_generator_ray_draw()
35 {
36         if(time < self.move_time)
37                 return;
38
39         self.move_time = time + 0.05;
40
41         if(self.count > 10)
42         {
43                 remove(self);
44                 return;
45         }
46
47         if(self.count > 5)
48                 self.alpha -= 0.1;
49         else
50                 self.alpha += 0.1;
51
52         self.scale += 0.2;
53         self.count +=1;
54 }
55
56 void ons_generator_ray_spawn(vector org)
57 {
58         entity e;
59         e = spawn();
60         e.classname = "ons_ray";
61         setmodel(e, "models/onslaught/ons_ray.md3");
62         setorigin(e, org);
63         e.angles = randomvec() * 360;
64         e.move_origin = org;
65         e.movetype = MOVETYPE_NONE;
66         e.alpha = 0;
67         e.scale = random() * 5 + 8;
68         e.move_time = time + 0.05;
69         e.drawmask = MASK_NORMAL;
70         e.draw = ons_generator_ray_draw;
71 }
72
73 void generator_draw()
74 {
75         if(time < self.move_time)
76                 return;
77
78         if(self.health > 0)
79         {
80                 // damaged fx (less probable the more damaged is the generator)
81                 if(random() < 0.9 - self.health / self.max_health)
82                 if(random() < 0.01)
83                 {
84                         pointparticles(particleeffectnum(EFFECT_ELECTRO_BALLEXPLODE), self.origin + randompos('-50 -50 -20', '50 50 50'), '0 0 0', 1);
85                         sound(self, CH_TRIGGER, "onslaught/electricity_explode.wav", VOL_BASE, ATTEN_NORM);
86                 }
87                 else
88                         pointparticles(particleeffectnum(EFFECT_ONS_GENERATOR_DAMAGED), self.origin + randompos('-60 -60 -20', '60 60 60'), '0 0 0', 1);
89
90                 self.move_time = time + 0.1;
91
92                 return;
93         }
94
95         if(self.count <= 0)
96                 return;
97
98         vector org;
99         int i;
100
101         // White shockwave
102         if(self.count==40||self.count==20)
103         {
104                 sound(self, CH_TRIGGER, "onslaught/shockwave.wav", VOL_BASE, ATTEN_NORM);
105                 pointparticles(particleeffectnum(EFFECT_ELECTRO_COMBO), self.origin, '0 0 0', 6);
106         }
107
108         // rays
109         if(random() > 0.25)
110         {
111                 ons_generator_ray_spawn(self.origin);
112         }
113
114         // Spawn fire balls
115         for(i=0;i < 10;++i)
116         {
117                 org = self.origin + randompos('-30 -30 -30' * i + '0 0 -20', '30 30 30' * i + '0 0 20');
118                 pointparticles(particleeffectnum(EFFECT_ONS_GENERATOR_GIB), org, '0 0 0', 1);
119         }
120
121         // Short explosion sound + small explosion
122         if(random() < 0.25)
123         {
124                 te_explosion(self.origin);
125                 sound(self, CH_TRIGGER, W_Sound("grenade_impact"), VOL_BASE, ATTEN_NORM);
126         }
127
128         // Particles
129         org = self.origin + randompos(self.mins + '8 8 8', self.maxs + '-8 -8 -8');
130         pointparticles(particleeffectnum(EFFECT_ONS_GENERATOR_EXPLODE), org, '0 0 0', 1);
131
132         // Final explosion
133         if(self.count==1)
134         {
135                 org = self.origin;
136                 te_explosion(org);
137                 pointparticles(particleeffectnum(EFFECT_ONS_GENERATOR_EXPLODE2), org, '0 0 0', 1);
138                 sound(self, CH_TRIGGER, W_Sound("rocket_impact"), VOL_BASE, ATTEN_NORM);
139         }
140
141         self.move_time = time + 0.05;
142
143         self.count -= 1;
144 }
145
146 void generator_damage(float hp)
147 {
148         if(hp <= 0)
149                 setmodel(self, "models/onslaught/generator_dead.md3");
150         else if(hp < self.max_health * 0.10)
151                 setmodel(self, "models/onslaught/generator_dmg9.md3");
152         else if(hp < self.max_health * 0.20)
153                 setmodel(self, "models/onslaught/generator_dmg8.md3");
154         else if(hp < self.max_health * 0.30)
155                 setmodel(self, "models/onslaught/generator_dmg7.md3");
156         else if(hp < self.max_health * 0.40)
157                 setmodel(self, "models/onslaught/generator_dmg6.md3");
158         else if(hp < self.max_health * 0.50)
159                 setmodel(self, "models/onslaught/generator_dmg5.md3");
160         else if(hp < self.max_health * 0.60)
161                 setmodel(self, "models/onslaught/generator_dmg4.md3");
162         else if(hp < self.max_health * 0.70)
163                 setmodel(self, "models/onslaught/generator_dmg3.md3");
164         else if(hp < self.max_health * 0.80)
165                 setmodel(self, "models/onslaught/generator_dmg2.md3");
166         else if(hp < self.max_health * 0.90)
167                 setmodel(self, "models/onslaught/generator_dmg1.md3");
168         else if(hp <= self.max_health || hp >= self.max_health)
169                 setmodel(self, "models/onslaught/generator.md3");
170
171         setsize(self, GENERATOR_MIN, GENERATOR_MAX);
172 }
173
174 void generator_construct()
175 {
176         self.netname = "Generator";
177         self.classname = "onslaught_generator";
178
179         setorigin(self, self.origin);
180         setmodel(self, "models/onslaught/generator.md3");
181         setsize(self, GENERATOR_MIN, GENERATOR_MAX);
182
183         self.move_movetype      = MOVETYPE_NOCLIP;
184         self.solid                      = SOLID_BBOX;
185         self.movetype           = MOVETYPE_NOCLIP;
186         self.move_origin        = self.origin;
187         self.move_time          = time;
188         self.drawmask           = MASK_NORMAL;
189         self.alpha                      = 1;
190         self.draw                       = generator_draw;
191 }
192
193 .vector glowmod;
194 void generator_changeteam()
195 {
196         if(self.team)
197         {
198                 self.glowmod = Team_ColorRGB(self.team - 1);
199                 self.teamradar_color = Team_ColorRGB(self.team - 1);
200                 self.colormap = 1024 + (self.team - 1) * 17;
201         }
202         else
203         {
204                 self.colormap = 1024;
205                 self.glowmod = '1 1 0';
206                 self.teamradar_color = '1 1 0';
207         }
208 }
209
210 void ent_generator()
211 {
212         int sf = ReadByte();
213
214         if(sf & GSF_SETUP)
215         {
216                 self.origin_x = ReadCoord();
217                 self.origin_y = ReadCoord();
218                 self.origin_z = ReadCoord();
219                 setorigin(self, self.origin);
220
221                 self.health = ReadByte();
222                 self.max_health = ReadByte();
223                 self.count = ReadByte();
224                 self.team = ReadByte();
225
226                 if(!self.count)
227                         self.count = 40;
228
229                 generator_changeteam();
230                 generator_precache();
231                 generator_construct();
232         }
233
234         if(sf & GSF_STATUS)
235         {
236                 int _tmp;
237                 _tmp = ReadByte();
238                 if(_tmp != self.team)
239                 {
240                         self.team = _tmp;
241                         generator_changeteam();
242                 }
243
244                 _tmp = ReadByte();
245
246                 if(_tmp != self.health)
247                         generator_damage(_tmp);
248
249                 self.health = _tmp;
250         }
251 }