1 #include "../../dpdefs/csprogsdefs.qh"
2 #include "../../common/constants.qh"
3 #include "../../common/stats.qh"
4 #include "../../common/util.qh"
5 #include "../../common/buffs.qh"
6 #include "../../csqcmodellib/cl_model.qh"
7 #include "../../server/t_items.qh"
9 #include "../miscfunctions.qh"
10 #include "../movetypes.qh"
11 #include "../scoreboard.qh"
12 #include "../autocvars.qh"
13 #include "../movetypes.qh"
14 #include "../prandom.qh"
16 #include "vehicles.qh"
20 const string hud_bg = "gfx/vehicles/frame.tga";
21 const string hud_sh = "gfx/vehicles/vh-shield.tga";
23 const string hud_hp_bar = "gfx/vehicles/bar_up_left.tga";
24 const string hud_hp_ico = "gfx/vehicles/health.tga";
25 const string hud_sh_bar = "gfx/vehicles/bar_dwn_left.tga";
26 const string hud_sh_ico = "gfx/vehicles/shield.tga";
28 const string hud_ammo1_bar = "gfx/vehicles/bar_up_right.tga";
29 const string hud_ammo1_ico = "gfx/vehicles/bullets.tga";
30 const string hud_ammo2_bar = "gfx/vehicles/bar_dwn_right.tga";
31 const string hud_ammo2_ico = "gfx/vehicles/rocket.tga";
32 const string hud_energy = "gfx/vehicles/energy.tga";
34 const int SBRM_FIRST = 1;
35 const int SBRM_VOLLY = 1;
36 const int SBRM_GUIDE = 2;
37 const int SBRM_ARTILLERY = 3;
38 const int SBRM_LAST = 3;
40 const int RSM_FIRST = 1;
41 const int RSM_BOMB = 1;
42 const int RSM_FLARE = 2;
43 const int RSM_LAST = 2;
46 float autocvar_cl_vehicles_hudscale = 0.5;
47 float autocvar_cl_vehicles_hudalpha = 0.75;
49 const string raptor_ico = "gfx/vehicles/raptor.tga";
50 const string raptor_gun = "gfx/vehicles/raptor_guns.tga";
51 const string raptor_bomb = "gfx/vehicles/raptor_bombs.tga";
52 const string raptor_drop = "gfx/vehicles/axh-dropcross.tga";
57 const int MAX_AXH = 4;
58 entity AuxiliaryXhair[MAX_AXH];
60 entityclass(AuxiliaryXhair)
61 class(AuxiliaryXhair) .string axh_image;
62 class(AuxiliaryXhair) .float axh_fadetime;
63 class(AuxiliaryXhair) .float axh_drawflag;
64 class(AuxiliaryXhair) .float axh_scale;
66 const string bumb_ico = "gfx/vehicles/bumb.tga";
67 const string bumb_lgun = "gfx/vehicles/bumb_lgun.tga";
68 const string bumb_rgun = "gfx/vehicles/bumb_rgun.tga";
70 const string bumb_gun_ico = "gfx/vehicles/bumb_side.tga";
71 const string bumb_gun_gun = "gfx/vehicles/bumb_side_gun.tga";
73 const string spider_ico = "gfx/vehicles/sbot.tga";
74 const string spider_rkt = "gfx/vehicles/sbot_rpods.tga";
75 const string spider_mgun = "gfx/vehicles/sbot_mguns.tga";
76 string spider_xhair; // = "gfx/vehicles/axh-special1.tga";
78 const string waki_ico = "gfx/vehicles/waki.tga";
79 const string waki_eng = "gfx/vehicles/waki_e.tga";
80 const string waki_gun = "gfx/vehicles/waki_guns.tga";
81 const string waki_rkt = "gfx/vehicles/waki_rockets.tga";
82 const string waki_xhair = "gfx/vehicles/axh-special1.tga";
88 void AuxiliaryXhair_Draw2D()
92 psize = self.axh_scale * draw_getimagesize(self.axh_image);
93 loc = project_3d_to_2d(self.move_origin) - 0.5 * psize;
94 if (!(loc.z < 0 || loc.x < 0 || loc.y < 0 || loc.x > vid_conwidth || loc.y > vid_conheight))
98 drawpic(loc, self.axh_image, psize, self.colormod, self.alpha, self.axh_drawflag);
101 if(time - self.cnt > self.axh_fadetime)
102 self.draw2d = func_null;
105 void Net_AuXair2(bool bIsNew)
107 int axh_id = bound(0, ReadByte(), MAX_AXH);
108 entity axh = AuxiliaryXhair[axh_id];
110 if(axh == world || wasfreed(axh)) // MADNESS? THIS IS QQQQCCCCCCCCC (wasfreed, why do you exsist?)
113 axh.draw2d = func_null;
114 axh.drawmask = MASK_NORMAL;
115 axh.axh_drawflag = DRAWFLAG_ADDITIVE;
116 axh.axh_fadetime = 0.1;
117 axh.axh_image = "gfx/vehicles/axh-ring.tga";
120 AuxiliaryXhair[axh_id] = axh;
123 axh.move_origin_x = ReadCoord();
124 axh.move_origin_y = ReadCoord();
125 axh.move_origin_z = ReadCoord();
126 axh.colormod_x = ReadByte() / 255;
127 axh.colormod_y = ReadByte() / 255;
128 axh.colormod_z = ReadByte() / 255;
130 axh.draw2d = AuxiliaryXhair_Draw2D;
133 void Net_VehicleSetup()
135 int hud_id = ReadByte();
138 if(hud_id > HUD_VEHICLE_LAST)
140 weapon2mode = hud_id - HUD_VEHICLE_LAST;
144 // hud_id == 0 means we exited a vehicle, so stop alarm sound/s
147 sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE);
148 sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE);
152 hud_id = bound(HUD_VEHICLE_FIRST, hud_id, HUD_VEHICLE_LAST);
154 // Init auxiliary crosshairs
156 for(i = 0; i < MAX_AXH; ++i)
158 entity axh = AuxiliaryXhair[i];
159 if(axh != world && !wasfreed(axh)) // MADNESS? THIS IS QQQQCCCCCCCCC (wasfreed, why do you exsist?)
163 axh.draw2d = func_null;
164 axh.drawmask = MASK_NORMAL;
165 axh.axh_drawflag = DRAWFLAG_NORMAL;
166 axh.axh_fadetime = 0.1;
167 axh.axh_image = "gfx/vehicles/axh-ring.tga";
170 AuxiliaryXhair[i] = axh;
177 AuxiliaryXhair[0].axh_image = "gfx/vehicles/axh-ring.tga";
178 AuxiliaryXhair[0].axh_scale = 0.25;
180 AuxiliaryXhair[1].axh_image = "gfx/vehicles/axh-ring.tga";
181 AuxiliaryXhair[1].axh_scale = 0.25;
183 AuxiliaryXhair[2].axh_image = "gfx/vehicles/axh-special1.tga";
184 AuxiliaryXhair[2].axh_scale = 0.5;
188 AuxiliaryXhair[0].axh_image = "gfx/vehicles/axh-bracket.tga";
189 AuxiliaryXhair[0].axh_scale = 0.25;
193 AuxiliaryXhair[0].axh_image = "gfx/vehicles/axh-special2.tga";
194 AuxiliaryXhair[0].axh_scale = 0.5;
195 //AuxiliaryXhair[0].alpha = 0.5;
197 AuxiliaryXhair[1].axh_image = "gfx/vehicles/axh-bracket.tga";
198 AuxiliaryXhair[1].axh_scale = 0.25;
199 //AuxiliaryXhair[1].alpha = 0.75;
200 //AuxiliaryXhair[1].axh_drawflag = DRAWFLAG_NORMAL;
205 AuxiliaryXhair[0].axh_image = "gfx/vehicles/axh-bracket.tga";
206 AuxiliaryXhair[0].axh_scale = 0.5;
209 AuxiliaryXhair[1].axh_image = "gfx/vehicles/axh-target.tga";
210 AuxiliaryXhair[1].axh_scale = 0.75;
213 AuxiliaryXhair[2].axh_image = "gfx/vehicles/axh-target.tga";
214 AuxiliaryXhair[2].axh_scale = 0.75;
216 case HUD_BUMBLEBEE_GUN:
218 AuxiliaryXhair[0].axh_image = "gfx/vehicles/axh-bracket.tga";
219 AuxiliaryXhair[0].axh_scale = 0.25;
221 AuxiliaryXhair[1].axh_image = "gfx/vehicles/axh-bracket.tga";
222 AuxiliaryXhair[1].axh_scale = 0.25;
226 #define HUD_GETSTATS \
227 int vh_health = getstati(STAT_VEHICLESTAT_HEALTH); \
228 float shield = getstati(STAT_VEHICLESTAT_SHIELD); \
229 noref int energy = getstati(STAT_VEHICLESTAT_ENERGY); \
230 noref float ammo1 = getstati(STAT_VEHICLESTAT_AMMO1); \
231 noref float reload1 = getstati(STAT_VEHICLESTAT_RELOAD1); \
232 noref int ammo2 = getstati(STAT_VEHICLESTAT_AMMO2); \
233 noref int reload2 = getstati(STAT_VEHICLESTAT_RELOAD2);
235 void CSQC_BUMBLE_HUD()
238 drawpic(hudloc, waki_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL);
239 drawpic(hudloc, waki_b, picsize, '0 1 0' * health + '1 0 0' * (1 - health), 1, DRAWFLAG_NORMAL);
240 drawpic(hudloc, waki_r, picsize, '1 1 1' * reload1 + '1 0 0' * (1 - reload1), 1, DRAWFLAG_NORMAL);
241 drawpic(hudloc, waki_e, picsize, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL);
243 if(autocvar_r_letterbox)
246 vector picsize, hudloc = '0 0 0', pic2size, picloc;
248 // Fetch health & ammo stats
251 picsize = draw_getimagesize(hud_bg) * autocvar_cl_vehicles_hudscale;
252 hudloc.y = vid_conheight - picsize.y;
253 hudloc.x = vid_conwidth * 0.5 - picsize.x * 0.5;
255 drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL);
262 pic2size = draw_getimagesize(bumb_ico) * (autocvar_cl_vehicles_hudscale * 0.8);
263 picloc = picsize * 0.5 - pic2size * 0.5;
266 drawpic(hudloc + picloc, bumb_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
268 drawpic(hudloc + picloc, bumb_ico, pic2size, '1 1 1' * vh_health + '1 0 0' * (1 - vh_health), 1, DRAWFLAG_NORMAL);
270 drawpic(hudloc + picloc, bumb_lgun, pic2size, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL);
271 drawpic(hudloc + picloc, bumb_lgun, pic2size, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL);
272 drawpic(hudloc + picloc, hud_sh, pic2size, '1 1 1', shield, DRAWFLAG_NORMAL);
275 picsize = draw_getimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale;
276 picloc = '69 69 0' * autocvar_cl_vehicles_hudscale;
277 drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - vh_health)), 0, vid_conwidth, vid_conheight);
278 drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL);
281 picsize = draw_getimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale;
282 picloc = '37 65 0' * autocvar_cl_vehicles_hudscale;
285 if(alarm1time < time)
287 alarm1time = time + 2;
288 sound(self, CH_PAIN_SINGLE, "vehicles/alarm.wav", VOL_BASEVOICE, ATTEN_NONE);
291 drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
295 drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
298 sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE);
304 picsize = draw_getimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale;
305 picloc = '69 140 0' * autocvar_cl_vehicles_hudscale;
306 drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - shield)), 0, vid_conwidth, vid_conheight);
307 drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
310 picloc = '40 136 0' * autocvar_cl_vehicles_hudscale;
311 picsize = draw_getimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale;
314 if(alarm2time < time)
316 alarm2time = time + 1;
317 sound(self, CH_TRIGGER_SINGLE, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTEN_NONE);
319 drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
323 drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
326 sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE);
335 picsize = draw_getimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale;
336 picloc = '450 69 0' * autocvar_cl_vehicles_hudscale;
337 drawsetcliparea(hudloc.x + picloc.x, picloc.y, picsize.x * ammo1, vid_conheight);
338 drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
341 // Right gunner slot occupied?
342 if(!AuxiliaryXhair[1].draw2d)
344 shield = (picsize.x * 0.5) - (0.5 * stringwidth(_("No right gunner!"), false, '1 0 0' * picsize.y + '0 1 0' * picsize.y));
345 drawfill(hudloc + picloc - '0.2 0.2 0', picsize + '0.4 0.4 0', '0.25 0.25 0.25', 0.75, DRAWFLAG_NORMAL);
346 drawstring(hudloc + picloc + '1 0 0' * shield, _("No right gunner!"), '1 0 0' * picsize.y + '0 1 0' * picsize.y, '1 0 0' + '0 1 1' * sin(time * 10), 1, DRAWFLAG_NORMAL);
350 picsize = 1.5 * draw_getimagesize(hud_energy) * autocvar_cl_vehicles_hudscale;
351 picloc = '664 60 0' * autocvar_cl_vehicles_hudscale;
353 drawpic(hudloc + picloc, hud_energy, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
355 drawpic(hudloc + picloc, hud_energy, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
358 picsize = draw_getimagesize(hud_ammo2_bar) * autocvar_cl_vehicles_hudscale;
359 picloc = '450 140 0' * autocvar_cl_vehicles_hudscale;
360 drawsetcliparea(hudloc.x + picloc.x, picloc.y, picsize.x * ammo2, vid_conheight);
361 drawpic(hudloc + picloc, hud_ammo2_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
363 // Left gunner slot occupied?
364 if(!AuxiliaryXhair[2].draw2d)
366 shield = (picsize.x * 0.5) - (0.5 * stringwidth(_("No left gunner!"), false, '1 0 0' * picsize.y + '0 1 0' * picsize.y));
367 drawfill(hudloc + picloc - '0.2 0.2 0', picsize + '0.4 0.4 0', '0.25 0.25 0.25', 0.75, DRAWFLAG_NORMAL);
368 drawstring(hudloc + picloc + '1 0 0' * shield, _("No left gunner!"), '1 0 0' * picsize.y + '0 1 0' * picsize.y, '1 0 0' + '0 1 1' * sin(time * 10), 1, DRAWFLAG_NORMAL);
372 picsize = 1.5 * draw_getimagesize(hud_energy) * autocvar_cl_vehicles_hudscale;
373 picloc = '664 130 0' * autocvar_cl_vehicles_hudscale;
375 drawpic(hudloc + picloc, hud_energy, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
377 drawpic(hudloc + picloc, hud_energy, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
379 if (scoreboard_showscores)
380 HUD_DrawScoreboard();
383 picsize = draw_getimagesize(waki_xhair);
386 drawpic('0.5 0 0' * (vid_conwidth - picsize.x) + '0 0.5 0' * (vid_conheight - picsize.y), waki_xhair, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
391 void CSQC_BUMBLE_GUN_HUD()
394 if(autocvar_r_letterbox)
397 vector picsize, hudloc = '0 0 0', pic2size, picloc;
399 // Fetch health & ammo stats
402 picsize = draw_getimagesize(hud_bg) * autocvar_cl_vehicles_hudscale;
403 hudloc.y = vid_conheight - picsize.y;
404 hudloc.x = vid_conwidth * 0.5 - picsize.x * 0.5;
406 drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL);
413 pic2size = draw_getimagesize(bumb_gun_ico) * (autocvar_cl_vehicles_hudscale * 0.8);
414 picloc = picsize * 0.5 - pic2size * 0.5;
417 drawpic(hudloc + picloc, bumb_gun_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
419 drawpic(hudloc + picloc, bumb_gun_ico, pic2size, '1 1 1' * vh_health + '1 0 0' * (1 - vh_health), 1, DRAWFLAG_NORMAL);
421 drawpic(hudloc + picloc, bumb_gun_gun, pic2size, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL);
422 drawpic(hudloc + picloc, hud_sh, pic2size, '1 1 1', shield, DRAWFLAG_NORMAL);
425 picsize = draw_getimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale;
426 picloc = '69 69 0' * autocvar_cl_vehicles_hudscale;
427 drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - vh_health)), 0, vid_conwidth, vid_conheight);
428 drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL);
431 picsize = draw_getimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale;
432 picloc = '37 65 0' * autocvar_cl_vehicles_hudscale;
435 if(alarm1time < time)
437 alarm1time = time + 2;
438 sound(self, CH_PAIN_SINGLE, "vehicles/alarm.wav", VOL_BASEVOICE, ATTEN_NONE);
441 drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
445 drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
448 sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE);
454 picsize = draw_getimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale;
455 picloc = '69 140 0' * autocvar_cl_vehicles_hudscale;
456 drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - shield)), 0, vid_conwidth, vid_conheight);
457 drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
460 picloc = '40 136 0' * autocvar_cl_vehicles_hudscale;
461 picsize = draw_getimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale;
464 if(alarm2time < time)
466 alarm2time = time + 1;
467 sound(self, CH_TRIGGER_SINGLE, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTEN_NONE);
469 drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
473 drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
476 sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE);
482 picsize = draw_getimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale;
483 picloc = '450 69 0' * autocvar_cl_vehicles_hudscale;
484 drawsetcliparea(hudloc.x + picloc.x, picloc.y, picsize.x * energy, vid_conheight);
485 drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
489 picsize = 1.5 * draw_getimagesize(hud_energy) * autocvar_cl_vehicles_hudscale;
490 picloc = '664 60 0' * autocvar_cl_vehicles_hudscale;
492 drawpic(hudloc + picloc, hud_energy, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
494 drawpic(hudloc + picloc, hud_energy, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
496 if (scoreboard_showscores)
497 HUD_DrawScoreboard();
501 picsize = draw_getimagesize(waki_xhair);
506 drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), waki_xhair, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
513 void CSQC_SPIDER_HUD()
515 if(autocvar_r_letterbox)
518 vector picsize, hudloc = '0 0 0', pic2size, picloc;
521 // Fetch health & ammo stats
524 picsize = draw_getimagesize(hud_bg) * autocvar_cl_vehicles_hudscale;
525 hudloc.y = vid_conheight - picsize.y;
526 hudloc.x = vid_conwidth * 0.5 - picsize.x * 0.5;
528 drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL);
535 pic2size = draw_getimagesize(spider_ico) * (autocvar_cl_vehicles_hudscale * 0.8);
536 picloc = picsize * 0.5 - pic2size * 0.5;
538 drawpic(hudloc + picloc, spider_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
540 drawpic(hudloc + picloc, spider_ico, pic2size, '1 1 1' * vh_health + '1 0 0' * (1 - vh_health), 1, DRAWFLAG_NORMAL);
541 drawpic(hudloc + picloc, spider_rkt, pic2size, '1 1 1' * reload2 + '1 0 0' * (1 - reload2), 1, DRAWFLAG_NORMAL);
542 drawpic(hudloc + picloc, spider_mgun, pic2size, '1 1 1' * ammo1 + '1 0 0' * (1 - ammo1), 1, DRAWFLAG_NORMAL);
543 drawpic(hudloc + picloc, hud_sh, pic2size, '1 1 1', shield, DRAWFLAG_NORMAL);
546 picsize = draw_getimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale;
547 picloc = '69 69 0' * autocvar_cl_vehicles_hudscale;
548 drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - vh_health)), 0, vid_conwidth, vid_conheight);
549 drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL);
552 picsize = draw_getimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale;
553 picloc = '37 65 0' * autocvar_cl_vehicles_hudscale;
556 if(alarm1time < time)
558 alarm1time = time + 2;
559 sound(self, CH_PAIN_SINGLE, "vehicles/alarm.wav", VOL_BASEVOICE, ATTEN_NONE);
561 drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
565 drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
568 sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE);
573 picsize = draw_getimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale;
574 picloc = '69 140 0' * autocvar_cl_vehicles_hudscale;
575 drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - shield)), 0, vid_conwidth, vid_conheight);
576 drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
579 picloc = '40 136 0' * autocvar_cl_vehicles_hudscale;
580 picsize = draw_getimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale;
583 if(alarm2time < time)
585 alarm2time = time + 1;
586 sound(self, CH_TRIGGER_SINGLE, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTEN_NONE);
588 drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
592 drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
595 sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE);
601 picsize = draw_getimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale;
602 picloc = '450 69 0' * autocvar_cl_vehicles_hudscale;
603 drawsetcliparea(hudloc.x + picloc.x, picloc.y, picsize.x * ammo1, vid_conheight);
604 drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
607 picsize = draw_getimagesize(hud_ammo1_ico) * autocvar_cl_vehicles_hudscale;
608 picloc = '664 60 0' * autocvar_cl_vehicles_hudscale;
610 drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
612 drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
615 picsize = draw_getimagesize(hud_ammo2_bar) * autocvar_cl_vehicles_hudscale;
616 ammo1 = picsize.x / 8;
617 picloc = '450 140 0' * autocvar_cl_vehicles_hudscale;
618 drawsetcliparea(hudloc.x + picloc.x, hudloc.y + picloc.y, picsize.x * reload2, vid_conheight);
619 drawpic(hudloc + picloc, hud_ammo2_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
623 pic2size = 0.35 * draw_getimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale;
624 picloc.x -= pic2size.x;
625 picloc.y += pic2size.y * 2.25;
628 for(i = 1; i < 9; ++i)
631 drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, ((8 * reload2 <= i) ? '0 0 0' : '1 1 1'), 0.75, DRAWFLAG_NORMAL);
636 for(i = 1; i < 9; ++i)
639 drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, ((i >= ammo2) ? '1 1 1' : '0 0 0'), 0.75, DRAWFLAG_NORMAL);
642 pic2size = draw_getimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale;
643 picloc = '664 130 0' * autocvar_cl_vehicles_hudscale;
645 drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
647 drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 1 1', 1, DRAWFLAG_NORMAL);
649 if (scoreboard_showscores)
650 HUD_DrawScoreboard();
656 spider_xhair = "gfx/vehicles/axh-bracket.tga";
659 spider_xhair = "gfx/vehicles/axh-cross.tga";
662 spider_xhair = "gfx/vehicles/axh-tag.tga";
665 spider_xhair= "gfx/vehicles/axh-tag.tga";
668 picsize = draw_getimagesize(spider_xhair);
669 picsize.x *= autocvar_cl_vehicle_spiderbot_cross_size;
670 picsize.y *= autocvar_cl_vehicle_spiderbot_cross_size;
672 drawpic('0.5 0 0' * (vid_conwidth - picsize.x) + '0 0.5 0' * (vid_conheight - picsize.y), spider_xhair, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_ADDITIVE);
676 void CSQC_RAPTOR_HUD()
678 if(autocvar_r_letterbox)
681 vector picsize, hudloc = '0 0 0', pic2size, picloc;
683 // Fetch health & ammo stats
686 picsize = draw_getimagesize(hud_bg) * autocvar_cl_vehicles_hudscale;
687 hudloc.y = vid_conheight - picsize.y;
688 hudloc.x = vid_conwidth * 0.5 - picsize.x * 0.5;
690 drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL);
697 reload1 = reload2 * 0.01;
700 pic2size = draw_getimagesize(spider_ico) * (autocvar_cl_vehicles_hudscale * 0.8);
701 picloc = picsize * 0.5 - pic2size * 0.5;
703 drawpic(hudloc + picloc, raptor_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
705 drawpic(hudloc + picloc, raptor_ico, pic2size, '1 1 1' * vh_health + '1 0 0' * (1 - vh_health), 1, DRAWFLAG_NORMAL);
706 drawpic(hudloc + picloc, raptor_bomb, pic2size, '1 1 1' * reload1 + '1 0 0' * (1 - reload1), 1, DRAWFLAG_NORMAL);
707 drawpic(hudloc + picloc, raptor_gun, pic2size, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL);
708 drawpic(hudloc + picloc, hud_sh, pic2size, '1 1 1', shield, DRAWFLAG_NORMAL);
711 picsize = draw_getimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale;
712 picloc = '69 69 0' * autocvar_cl_vehicles_hudscale;
713 drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - vh_health)), 0, vid_conwidth, vid_conheight);
714 drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL);
717 picsize = draw_getimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale;
718 picloc = '37 65 0' * autocvar_cl_vehicles_hudscale;
721 if(alarm1time < time)
723 alarm1time = time + 2;
724 sound(self, CH_PAIN_SINGLE, "vehicles/alarm.wav", VOL_BASEVOICE, ATTEN_NONE);
727 drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
731 drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
734 sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE);
740 picsize = draw_getimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale;
741 picloc = '69 140 0' * autocvar_cl_vehicles_hudscale;
742 drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - shield)), 0, vid_conwidth, vid_conheight);
743 drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
746 picloc = '40 136 0' * autocvar_cl_vehicles_hudscale;
747 picsize = draw_getimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale;
750 if(alarm2time < time)
752 alarm2time = time + 1;
753 sound(self, CH_TRIGGER_SINGLE, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTEN_NONE);
755 drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
759 drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
762 sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE);
768 picsize = draw_getimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale;
769 picloc = '450 69 0' * autocvar_cl_vehicles_hudscale;
770 drawsetcliparea(hudloc.x + picloc.x, picloc.y, picsize.x * energy, vid_conheight);
771 drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
774 picsize = draw_getimagesize(hud_ammo1_ico) * autocvar_cl_vehicles_hudscale;
775 picloc = '664 60 0' * autocvar_cl_vehicles_hudscale;
777 drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
779 drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
782 picsize = draw_getimagesize(hud_ammo2_bar) * autocvar_cl_vehicles_hudscale;
783 picloc = '450 140 0' * autocvar_cl_vehicles_hudscale;
784 drawsetcliparea(hudloc.x + picloc.x, hudloc.y + picloc.y, picsize.x * reload1, vid_conheight);
785 drawpic(hudloc + picloc, hud_ammo2_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
788 pic2size = draw_getimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale;
789 picloc = '664 130 0' * autocvar_cl_vehicles_hudscale;
791 drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
793 drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 1 1', 1, DRAWFLAG_NORMAL);
795 if(weapon2mode == RSM_FLARE)
797 raptor_xhair = "gfx/vehicles/axh-bracket.tga";
801 raptor_xhair = "gfx/vehicles/axh-ring.tga";
807 dropmark.owner = self;
808 dropmark.gravity = 1;
815 setorigin(dropmark, pmove_org);
816 dropmark.velocity = pmove_vel;
817 tracetoss(dropmark, self);
819 where = project_3d_to_2d(trace_endpos);
821 setorigin(dropmark, trace_endpos);
822 picsize = draw_getimagesize(raptor_drop) * 0.2;
824 if (!(where.z < 0 || where.x < 0 || where.y < 0 || where.x > vid_conwidth || where.y > vid_conheight))
826 where.x -= picsize.x * 0.5;
827 where.y -= picsize.y * 0.5;
829 drawpic(where, raptor_drop, picsize, '0 2 0', 1, DRAWFLAG_ADDITIVE);
831 dropmark.cnt = time + 5;
836 if(dropmark.cnt > time)
838 where = project_3d_to_2d(dropmark.origin);
839 picsize = draw_getimagesize(raptor_drop) * 0.25;
841 if (!(where.z < 0 || where.x < 0 || where.y < 0 || where.x > vid_conwidth || where.y > vid_conheight))
843 where.x -= picsize.x * 0.5;
844 where.y -= picsize.y * 0.5;
846 drawpic(where, raptor_drop, picsize, '2 0 0', 1, DRAWFLAG_ADDITIVE);
852 if (scoreboard_showscores)
853 HUD_DrawScoreboard();
856 picsize = draw_getimagesize(raptor_xhair);
860 drawpic('0.5 0 0' * (vid_conwidth - picsize.x) + '0 0.5 0' * (vid_conheight - picsize.y), raptor_xhair, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
864 void CSQC_WAKIZASHI_HUD()
867 drawpic(hudloc, waki_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL);
868 drawpic(hudloc, waki_b, picsize, '0 1 0' * health + '1 0 0' * (1 - health), 1, DRAWFLAG_NORMAL);
869 drawpic(hudloc, waki_r, picsize, '1 1 1' * reload1 + '1 0 0' * (1 - reload1), 1, DRAWFLAG_NORMAL);
870 drawpic(hudloc, waki_e, picsize, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL);
872 if(autocvar_r_letterbox)
875 vector picsize, hudloc = '0 0 0', pic2size, picloc;
877 // Fetch health & ammo stats
880 picsize = draw_getimagesize(hud_bg) * autocvar_cl_vehicles_hudscale;
881 hudloc.y = vid_conheight - picsize.y;
882 hudloc.x = vid_conwidth * 0.5 - picsize.x * 0.5;
884 drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL);
891 pic2size = draw_getimagesize(spider_ico) * (autocvar_cl_vehicles_hudscale * 0.8);
892 picloc = picsize * 0.5 - pic2size * 0.5;
894 drawpic(hudloc + picloc, waki_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
896 drawpic(hudloc + picloc, waki_ico, pic2size, '1 1 1' * vh_health + '1 0 0' * (1 - vh_health), 1, DRAWFLAG_NORMAL);
897 drawpic(hudloc + picloc, waki_eng, pic2size, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL);
898 drawpic(hudloc + picloc, waki_gun, pic2size, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL);
899 drawpic(hudloc + picloc, waki_rkt, pic2size, '1 1 1' * reload1 + '1 0 0' * (1 - reload1), 1, DRAWFLAG_NORMAL);
900 drawpic(hudloc + picloc, hud_sh, pic2size, '1 1 1', shield, DRAWFLAG_NORMAL);
903 picsize = draw_getimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale;
904 picloc = '69 69 0' * autocvar_cl_vehicles_hudscale;
905 drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - vh_health)), 0, vid_conwidth, vid_conheight);
906 drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL);
909 picsize = draw_getimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale;
910 picloc = '37 65 0' * autocvar_cl_vehicles_hudscale;
913 if(alarm1time < time)
915 alarm1time = time + 2;
916 sound(self, CH_PAIN_SINGLE, "vehicles/alarm.wav", VOL_BASEVOICE, ATTEN_NONE);
919 drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
923 drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
926 sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE);
933 picsize = draw_getimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale;
934 picloc = '69 140 0' * autocvar_cl_vehicles_hudscale;
935 drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - shield)), 0, vid_conwidth, vid_conheight);
936 drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
939 picloc = '40 136 0' * autocvar_cl_vehicles_hudscale;
940 picsize = draw_getimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale;
943 if(alarm2time < time)
945 alarm2time = time + 1;
946 sound(self, CH_TRIGGER_SINGLE, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTEN_NONE);
948 drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
952 drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
955 sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE);
961 picsize = draw_getimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale;
962 picloc = '450 69 0' * autocvar_cl_vehicles_hudscale;
963 drawsetcliparea(hudloc.x + picloc.x, picloc.y, picsize.x * energy, vid_conheight);
964 drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
967 picsize = draw_getimagesize(hud_ammo1_ico) * autocvar_cl_vehicles_hudscale;
968 picloc = '664 60 0' * autocvar_cl_vehicles_hudscale;
970 drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
972 drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
975 picsize = draw_getimagesize(hud_ammo2_bar) * autocvar_cl_vehicles_hudscale;
976 picloc = '450 140 0' * autocvar_cl_vehicles_hudscale;
977 drawsetcliparea(hudloc.x + picloc.x, hudloc.y + picloc.y, picsize.x * reload1, vid_conheight);
978 drawpic(hudloc + picloc, hud_ammo2_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
981 pic2size = draw_getimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale;
982 picloc = '664 130 0' * autocvar_cl_vehicles_hudscale;
984 drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
986 drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 1 1', 1, DRAWFLAG_NORMAL);
988 if (scoreboard_showscores)
989 HUD_DrawScoreboard();
992 picsize = draw_getimagesize(waki_xhair);
997 drawpic('0.5 0 0' * (vid_conwidth - picsize.x) + '0 0.5 0' * (vid_conheight - picsize.y), waki_xhair, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
1001 void Vehicles_Precache()
1003 precache_model("models/vehicles/bomblet.md3");
1004 precache_model("models/vehicles/clusterbomb.md3");
1005 precache_model("models/vehicles/clusterbomb_fragment.md3");
1006 precache_model("models/vehicles/rocket01.md3");
1007 precache_model("models/vehicles/rocket02.md3");
1009 precache_sound ("vehicles/alarm.wav");
1010 precache_sound ("vehicles/alarm_shield.wav");
1013 void RaptorCBShellfragDraw()
1018 Movetype_Physics_MatchTicrate(autocvar_cl_gibs_ticrate, autocvar_cl_gibs_sloppy);
1019 self.move_avelocity += randomvec() * 15;
1020 self.renderflags = 0;
1023 self.alpha = bound(0, self.nextthink - time, 1);
1025 if(self.alpha < ALPHA_MIN_VISIBLE)
1029 void RaptorCBShellfragToss(vector _org, vector _vel, vector _ang)
1034 setmodel(sfrag, "models/vehicles/clusterbomb_fragment.md3");
1035 setorigin(sfrag, _org);
1037 sfrag.move_movetype = MOVETYPE_BOUNCE;
1038 sfrag.gravity = 0.15;
1039 sfrag.solid = SOLID_CORPSE;
1041 sfrag.draw = RaptorCBShellfragDraw;
1043 sfrag.move_origin = sfrag.origin = _org;
1044 sfrag.move_velocity = _vel;
1045 sfrag.move_avelocity = prandomvec() * vlen(sfrag.move_velocity);
1046 sfrag.angles = self.move_angles = _ang;
1048 sfrag.move_time = time;
1049 sfrag.damageforcescale = 4;
1051 sfrag.nextthink = time + 3;
1052 sfrag.cnt = time + 2;
1054 sfrag.drawmask = MASK_NORMAL;