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