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