Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
bumblebee.qc
Go to the documentation of this file.
1#include "bumblebee.qh"
2
3#ifdef SVQC
5#endif
6
7#ifdef GAMEQC
8
9const float BRG_SETUP = 2;
10const float BRG_START = 4;
11const float BRG_END = 8;
12
13#ifdef SVQC
15
25
29
33
37
41
43
49
50
55
61
68
74
76
77bool bumblebee_gunner_frame(entity this, float dt)
78{
79 entity vehic = this.vehicle.owner;
80 entity gun = this.vehicle;
81 return = true;
82
83 // this isn't technically a vehicle (yet), let's not do frame functions on it (yet)
84 //vehicles_frame(gun, player);
85
86 vehic.solid = SOLID_NOT;
87 //setorigin(this, vehic.origin);
88 this.velocity = vehic.velocity;
89
90 float _in, _out;
91 vehic.angles.x = -vehic.angles.x;
92 makevectors(vehic.angles);
93 vehic.angles.x = -vehic.angles.x;
94 if (gun == vehic.gun1)
95 {
98 setorigin(this, vehic.origin + v_up * -16 + v_forward * -16 + v_right * 128);
99 }
100 else
101 {
104 setorigin(this, vehic.origin + v_up * -16 + v_forward * -16 + v_right * -128);
105 }
106 this.oldorigin = this.origin; // negate fall damage
107
108 crosshair_trace(this);
109 vector _ct = trace_endpos;
110
112 {
113 if (gun.lock_time < time || IS_DEAD(gun.enemy) || STAT(FROZEN, gun.enemy))
114 gun.enemy = NULL;
115
116 if (trace_ent
117 && trace_ent.move_movetype
118 && trace_ent.takedamage
119 && !IS_DEAD(trace_ent) && !STAT(FROZEN, trace_ent))
120 {
121 if (teamplay)
122 {
123 if (DIFF_TEAM(trace_ent, this))
124 {
125 gun.enemy = trace_ent;
126 gun.lock_time = time + 2.5;
127 }
128 }
129 else
130 {
131 gun.enemy = trace_ent;
132 gun.lock_time = time + 0.5;
133 }
134 }
135 }
136
137 vector ad;
138 if (gun.enemy)
139 {
140 float distance, impact_time;
141
142 vector vf = real_origin(gun.enemy);
143 vector _vel = gun.enemy.velocity;
144 if (gun.enemy.move_movetype == MOVETYPE_WALK)
145 _vel.z *= 0.1;
146
147 ad = vf;
148 distance = vlen(ad - this.origin);
149 impact_time = distance / autocvar_g_vehicle_bumblebee_cannon_speed;
150 ad = vf + _vel * impact_time;
151 trace_endpos = ad;
152
153 UpdateAuxiliaryXhair(this, ad, '1 0 1', 1);
154 vehicle_aimturret(vehic, trace_endpos, gun, "fire",
157
158 }
159 else
160 vehicle_aimturret(vehic, _ct, gun, "fire",
163
164 if (!weaponLocked(this) && !weaponUseForbidden(this)
166 && time > gun.attack_finished_single[0]
167 && gun.vehicle_energy >= autocvar_g_vehicle_bumblebee_cannon_cost)
168 {
169 gun.vehicle_energy -= autocvar_g_vehicle_bumblebee_cannon_cost;
170 bumblebee_fire_cannon(vehic, gun, "fire", this);
171 gun.delay = time;
172 gun.attack_finished_single[0] = time + autocvar_g_vehicle_bumblebee_cannon_refire;
173 }
174
175 VEHICLE_UPDATE_PLAYER_RESOURCE(this, vehic, health, bumblebee, RES_HEALTH);
176
177 if (vehic.vehicle_flags & VHF_HASSHIELD)
178 VEHICLE_UPDATE_PLAYER(this, vehic, shield, bumblebee);
179
180 ad = gettaginfo(gun, gettagindex(gun, "fire"));
181 traceline(ad, ad + v_forward * max_shot_distance, MOVE_NORMAL, gun);
182
183 UpdateAuxiliaryXhair(this, trace_endpos, ('1 0 0' * this.vehicle_reload1) + ('0 1 0' * (1 - this.vehicle_reload1)), 0);
184
185 if (vehic.owner)
186 UpdateAuxiliaryXhair(vehic.owner, trace_endpos, ('1 0 0' * this.vehicle_reload1) + ('0 1 0' * (1 - this.vehicle_reload1)), (this == vehic.gunner1 ? 1 : 2));
187
188 vehic.solid = SOLID_BBOX;
190 this.vehicle_energy = (gun.vehicle_energy / autocvar_g_vehicle_bumblebee_cannon_ammo) * 100;
191}
192
194{
195 //vector exitspot;
196 tracebox(gunner.origin + '0 0 32', STAT(PL_MIN, player), STAT(PL_MAX, player), prefer_spot, MOVE_NORMAL, player);
198 return prefer_spot;
199
200 float mysize = 1.5 * vlen(STAT(PL_MAX, player) - STAT(PL_MIN, player)); // can't use gunner's size, as they don't have a size
201 vector v;
202 vector v2 = 0.5 * (gunner.absmin + gunner.absmax);
203 for (int i = 0; i < 100; ++i)
204 {
205 v = randomvec();
206 v.z = 0;
207 v = v2 + normalize(v) * mysize;
208 tracebox(v2, STAT(PL_MIN, player), STAT(PL_MAX, player), v, MOVE_NORMAL, player);
210 return v;
211 }
212
213 return prefer_spot; // this should be considered a fallback?!
214}
215
216void bumblebee_gunner_exit(entity this, int _exitflag)
217{
218 entity player = (this.owner.gun1 == this ? this.owner.gunner1 : this.owner.gunner2);
219 entity gunner = this;
220 entity vehic = gunner.owner;
221
222 if (IS_REAL_CLIENT(player))
223 {
224 msg_entity = player;
226 WriteEntity(MSG_ONE, player);
227
228 // NOTE: engine networked
231 WriteAngle(MSG_ONE, vehic.angles.y);
233 }
234
236
237 player.takedamage = DAMAGE_AIM;
238 player.solid = SOLID_SLIDEBOX;
240 player.effects &= ~EF_NODRAW;
241 player.alpha = 1;
242 player.PlayerPhysplug = func_null;
243 player.view_ofs = STAT(PL_VIEW_OFS, player);
244 player.event_damage = PlayerDamage;
245 STAT(HUD, player) = HUD_NORMAL;
246 player.teleportable = TELEPORT_NORMAL;
247 for (int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
248 {
249 .entity weaponentity = weaponentities[slot];
250 player.(weaponentity).m_switchweapon = gunner.(weaponentity).m_switchweapon;
251 delete(gunner.(weaponentity));
252 }
253 player.vehicle_enter_delay = time + 2;
254 setsize(player, STAT(PL_MIN, player), STAT(PL_MAX, player));
255
256 fixedmakevectors(vehic.angles);
257
258 if (player == vehic.gunner1)
259 vehic.gunner1 = NULL;
260 if (player == vehic.gunner2)
261 {
262 vehic.gunner2 = NULL;
263 v_right = -v_right;
264 }
265
266 vector spot = real_origin(gunner);
267 spot += v_up * 128 + v_forward * 300 + v_right * 150;
268 spot = bumblebee_gunner_findgoodexit(spot, gunner, player);
269
270 // TODO: figure a way to move player out of the gunner
271
272 player.velocity = 0.75 * vehic.velocity + normalize(spot - vehic.origin) * 200;
273 player.velocity.z += 10;
274
275 gunner.phase = time + 5;
276 gunner.vehicle_hudmodel.viewmodelforclient = gunner;
277
278 MUTATOR_CALLHOOK(VehicleExit, player, gunner);
279
280 player.vehicle = NULL;
281}
282
284{
285 entity vehic = this;
286 entity gunner = NULL;
287
288 if (!vehic.gunner1 && !vehic.gunner2
289 && time >= vehic.gun1.phase && time >= vehic.gun2.phase)
290 {
291 // we can have some fun
292 vector v1 = gettaginfo(vehic, gettagindex(vehic, "cannon_right"));
293 vector v2 = gettaginfo(vehic, gettagindex(vehic, "cannon_left"));
294 if (vlen2(player.origin - v1) < vlen2(player.origin - v2))
295 {
296 gunner = vehic.gun1;
297 vehic.gunner1 = player;
298 }
299 else
300 {
301 gunner = vehic.gun2;
302 vehic.gunner2 = player;
303 }
304 }
305 else if (!vehic.gunner1 && time >= vehic.gun1.phase)
306 {
307 gunner = vehic.gun1;
308 vehic.gunner1 = player;
309 }
310 else if (!vehic.gunner2 && time >= vehic.gun2.phase)
311 {
312 gunner = vehic.gun2;
313 vehic.gunner2 = player;
314 }
315 else
316 {
317 LOG_TRACE("Vehicle is full, fail");
318 return false;
319 }
320
321 player.vehicle = gunner;
322 player.angles = vehic.angles;
323 player.takedamage = DAMAGE_NO;
324 player.solid = SOLID_NOT;
325 player.alpha = -1;
327 player.event_damage = func_null;
328 player.view_ofs = '0 0 0';
329 STAT(HUD, player) = STAT(HUD, gunner);
330 player.teleportable = false;
331 player.PlayerPhysplug = gunner.PlayerPhysplug;
332 player.vehicle_ammo1 = vehic.vehicle_ammo1;
333 player.vehicle_ammo2 = vehic.vehicle_ammo2;
334 player.vehicle_reload1 = vehic.vehicle_reload1;
335 player.vehicle_reload2 = vehic.vehicle_reload2;
336 player.vehicle_energy = vehic.vehicle_energy;
337 UNSET_ONGROUND(player);
338
339 RemoveGrapplingHooks(player);
340
341 for (int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
342 {
343 .entity weaponentity = weaponentities[slot];
344 gunner.(weaponentity) = new(temp_wepent);
345 gunner.(weaponentity).m_switchweapon = player.(weaponentity).m_switchweapon;
346 }
347 gunner.vehicle_exit = bumblebee_gunner_exit;
348 gunner.vehicle_hudmodel.viewmodelforclient = player;
349
350 if (IS_REAL_CLIENT(player))
351 {
352 msg_entity = player;
354 WriteEntity(MSG_ONE, gunner.vehicle_viewport);
355
356 // NOTE: engine networked
358 WriteAngle(MSG_ONE, gunner.angles.x + vehic.angles.x); // tilt
359 WriteAngle(MSG_ONE, gunner.angles.y + vehic.angles.y); // yaw
360 WriteAngle(MSG_ONE, 0); // roll
361 }
362
363 CSQCVehicleSetup(player, STAT(HUD, player));
364
365 MUTATOR_CALLHOOK(VehicleEnter, player, gunner);
366
367 return true;
368}
369
371{
373 return false;
374
375 if (!IS_PLAYER(toucher)
376 || IS_DEAD(toucher)
377 || toucher.vehicle
378 || DIFF_TEAM(toucher, this))
379 return false;
380
381 return true;
382}
383
385{
386 if (autocvar_g_vehicles_enter)
387 return;
388
389 if (this.gunner1 != NULL && this.gunner2 != NULL)
390 {
391 vehicles_touch(this, toucher);
392 return;
393 }
394
395 if (vehicles_valid_pilot(this, toucher))
396 {
397 bool phase_time = (time >= this.gun1.phase || time >= this.gun2.phase);
398
399 if (time >= toucher.vehicle_enter_delay && phase_time
401 return;
402 }
403
404 vehicles_touch(this, toucher);
405}
406
426
427bool bumblebee_pilot_frame(entity this, float dt)
428{
429 entity vehic = this.vehicle;
430 return = true;
431
432 if (game_stopped)
433 {
434 vehic.solid = SOLID_NOT;
435 vehic.takedamage = DAMAGE_NO;
437 return;
438 }
439
440 vehicles_frame(vehic, this);
441
442 if (IS_DEAD(vehic))
443 {
445 return;
446 }
447
448 bumblebee_regen(vehic, dt);
449
450 crosshair_trace(this);
451
452 vector vang = vehic.angles;
453 vector newvel = vectoangles(normalize(trace_endpos - vehic.origin + '0 0 32'));
454 vang.x = -vang.x;
455 newvel.x = -newvel.x;
456 if (newvel.x > 180) newvel.x -= 360;
457 if (newvel.x < -180) newvel.x += 360;
458 if (newvel.y > 180) newvel.y -= 360;
459 if (newvel.y < -180) newvel.y += 360;
460
461 float ftmp = shortangle_f(this.v_angle.y - vang.y, vang.y);
462 if (ftmp > 180) ftmp -= 360;
463 if (ftmp < -180) ftmp += 360;
464 vehic.avelocity.y = bound(-autocvar_g_vehicle_bumblebee_turnspeed, ftmp + vehic.avelocity.y * 0.9, autocvar_g_vehicle_bumblebee_turnspeed);
465
466 // Pitch
467 ftmp = 0;
468 if (CS(this).movement.x > 0 && vang.x < autocvar_g_vehicle_bumblebee_pitchlimit)
469 ftmp = 4;
470 else if (CS(this).movement.x < 0 && vang.x > -autocvar_g_vehicle_bumblebee_pitchlimit)
471 ftmp = -8;
472
475 vehic.avelocity.x = bound(-autocvar_g_vehicle_bumblebee_pitchspeed, ftmp + vehic.avelocity.x * 0.9, autocvar_g_vehicle_bumblebee_pitchspeed);
476
477 vehic.angles.x = anglemods(vehic.angles.x);
478 vehic.angles.y = anglemods(vehic.angles.y);
479 vehic.angles.z = anglemods(vehic.angles.z);
480
481 makevectors('0 1 0' * vehic.angles.y);
482 newvel = vehic.velocity * -autocvar_g_vehicle_bumblebee_friction;
483
484 if (CS(this).movement.x != 0)
485 {
486 if (CS(this).movement.x > 0)
488 else if (CS(this).movement.x < 0)
490 }
491
492 if (CS(this).movement.y != 0)
493 {
494 if (CS(this).movement.y < 0)
496 else if (CS(this).movement.y > 0)
498 ftmp = newvel * v_right;
499 ftmp *= dt * 0.1;
500 vehic.angles.z = bound(-15, vehic.angles.z + ftmp, 15);
501 }
502 else
503 {
504 vehic.angles.z *= 0.95;
505 if (vehic.angles.z >= -1 && vehic.angles.z <= -1)
506 vehic.angles.z = 0;
507 }
508
509 if (PHYS_INPUT_BUTTON_CROUCH(this))
511 else if (PHYS_INPUT_BUTTON_JUMP(this))
513
514 vehic.velocity += newvel * dt;
515 this.velocity = CS(this).movement = vehic.velocity;
516
517
519 {
520 if (vehic.tur_head.lock_time < time || IS_DEAD(vehic.tur_head.enemy) || STAT(FROZEN, vehic.tur_head.enemy))
521 vehic.tur_head.enemy = NULL;
522
523 if (trace_ent
524 && trace_ent.move_movetype
525 && trace_ent.takedamage
526 && !IS_DEAD(trace_ent) && !STAT(FROZEN, trace_ent))
527 {
528 if (teamplay)
529 {
530 if (trace_ent.team == this.team)
531 {
532 vehic.tur_head.enemy = trace_ent;
533 vehic.tur_head.lock_time = time + autocvar_g_vehicle_bumblebee_healgun_locktime;
534 }
535 }
536 else
537 {
538 vehic.tur_head.enemy = trace_ent;
539 vehic.tur_head.lock_time = time + autocvar_g_vehicle_bumblebee_healgun_locktime;
540 }
541 }
542
543 if (vehic.tur_head.enemy)
544 {
545 trace_endpos = real_origin(vehic.tur_head.enemy);
546 UpdateAuxiliaryXhair(this, trace_endpos, '0 0.75 0', 0);
547 }
548 }
549
550 vang = vehicle_aimturret(vehic, trace_endpos, vehic.gun3, "fire",
553
554 if (!weaponLocked(this) && !weaponUseForbidden(this)
557 {
558 vehic.gun3.enemy.realowner = this;
559 vehic.gun3.enemy.effects &= ~EF_NODRAW;
560
561 vehic.gun3.enemy.hook_start = gettaginfo(vehic.gun3, gettagindex(vehic.gun3, "fire"));
562 vehic.gun3.enemy.SendFlags |= BRG_START;
563
564 traceline(vehic.gun3.enemy.hook_start, vehic.gun3.enemy.hook_start + v_forward * autocvar_g_vehicle_bumblebee_raygun_range, MOVE_NORMAL, vehic);
565
566 if (trace_ent)
567 {
569 {
570 Damage(trace_ent, vehic, this,
572 DEATH_GENERIC.m_id,
573 DMG_NOWEP,
576 );
578 }
579 else
580 {
581 if (!IS_DEAD(trace_ent))
582 {
583 if ((teamplay && trace_ent.team == this.team) || !teamplay)
584 {
586 {
589 }
590
592 {
594 trace_ent.vehicle_shield = min(trace_ent.vehicle_shield + autocvar_g_vehicle_bumblebee_healgun_sps * dt, trace_ent.tur_head.max_health);
595 }
596 else if (IS_CLIENT(trace_ent))
597 {
601 }
602 }
603 }
604 }
605 }
606
607 vehic.gun3.enemy.hook_end = trace_endpos;
608 setorigin(vehic.gun3.enemy, trace_endpos);
609 vehic.gun3.enemy.SendFlags |= BRG_END;
610
611 vehic.wait = time + 1;
612 }
613 else
614 vehic.gun3.enemy.effects |= EF_NODRAW;
615 /*{
616 if (vehic.gun3.enemy)
617 remove(vehic.gun3.enemy);
618
619 vehic.gun3.enemy = NULL;
620 }
621 */
622
623 VEHICLE_UPDATE_PLAYER_RESOURCE(this, vehic, health, bumblebee, RES_HEALTH);
624 VEHICLE_UPDATE_PLAYER(this, vehic, energy, bumblebee);
625
626 this.vehicle_ammo1 = (vehic.gun1.vehicle_energy / autocvar_g_vehicle_bumblebee_cannon_ammo) * 100;
627 this.vehicle_ammo2 = (vehic.gun2.vehicle_energy / autocvar_g_vehicle_bumblebee_cannon_ammo) * 100;
628
629 if (vehic.vehicle_flags & VHF_HASSHIELD)
630 VEHICLE_UPDATE_PLAYER(this, vehic, shield, bumblebee);
631
632 vehic.angles.x = -vehic.angles.x;
633 makevectors(vehic.angles);
634 vehic.angles.x = -vehic.angles.x;
635 setorigin(this, vehic.origin + v_up * 48 + v_forward * 160);
636 this.oldorigin = this.origin; // negate fall damage
637
639}
640
642{
643 float hgt = vehicle_altitude(this, 512);
644 this.velocity = (this.velocity * 0.9) + ('0 0 -1800' * (hgt / 256) * PHYS_INPUT_FRAMETIME);
645 this.angles.x *= 0.95;
646 this.angles.z *= 0.95;
647
648 if (hgt < 16)
650
651 this.nextthink = time;
652
654}
655
656void bumblebee_exit(entity this, int eject)
657{
658 if (this.owner.vehicleid == VEH_BUMBLEBEE.vehicleid)
659 {
660 bumblebee_gunner_exit(this, eject);
661 return;
662 }
663
665
666 if (!IS_DEAD(this))
667 {
669 this.nextthink = time;
670 }
671
673
674 if (!this.owner)
675 return;
676
678 vector spot;
680 spot = this.origin + v_up * 128 + v_forward * 300;
681 else
682 spot = this.origin + v_up * 128 - v_forward * 300;
683
684 spot = vehicles_findgoodexit(this, this.owner, spot);
685
686 // Hide beam
687 if (this.gun3.enemy || !wasfreed(this.gun3.enemy))
688 this.gun3.enemy.effects |= EF_NODRAW;
689
690 this.owner.velocity = 0.75 * this.vehicle.velocity + normalize(spot - this.vehicle.origin) * 200;
691 this.owner.velocity.z += 10;
692 setorigin(this.owner, spot);
693
694 antilag_clear(this.owner, CS(this.owner));
695 this.owner = NULL;
696}
697
699{
700 RadiusDamage(this, this.enemy,
704 this,
705 NULL,
707 DEATH_VH_BUMB_DEATH.m_id,
708 DMG_NOWEP,
709 NULL
710 );
711
712 sound(this, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
713 Send_Effect(EFFECT_EXPLOSION_BIG, (this.origin + '0 0 100') + (randomvec() * 80), '0 0 0', 1);
714
715 if (this.owner.deadflag == DEAD_DYING)
716 this.owner.deadflag = DEAD_DEAD;
717
718 delete(this);
719}
720
725
727{
728 if (time >= this.wait)
730
731 if (random() < 0.1)
732 {
733 sound(this, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
734 Send_Effect(EFFECT_EXPLOSION_SMALL, randomvec() * 80 + (this.origin + '0 0 100'), '0 0 0', 1);
735 }
736
737 this.nextthink = time + 0.1;
738}
739
740spawnfunc(vehicle_bumblebee)
741{
743 || !vehicle_initialize(this, VEH_BUMBLEBEE, false))
744 {
745 delete(this);
746 return;
747 }
748}
749
750METHOD(Bumblebee, vr_impact, void(Bumblebee thisveh, entity instance))
751{
754}
755METHOD(Bumblebee, vr_enter, void(Bumblebee thisveh, entity instance))
756{
757 settouch(instance, bumblebee_touch);
758 instance.nextthink = 0;
760}
761METHOD(Bumblebee, vr_gunner_enter, void(Bumblebee thisveh, entity instance, entity actor))
762{
763 if (!instance.gunner1
764 && time >= instance.gun1.phase
765 && instance.gun1.vehicle_enter
766 && instance.gun1.vehicle_enter(instance, actor))
767 return;
768
769 if (!instance.gunner2
770 && time >= instance.gun2.phase
771 && instance.gun2.vehicle_enter
772 && instance.gun2.vehicle_enter(instance, actor))
773 return;
774}
775METHOD(Bumblebee, vr_think, void(Bumblebee thisveh, entity instance))
776{
777 instance.angles.z *= 0.8;
778 instance.angles.x *= 0.8;
779
780 instance.nextthink = time;
781
782 if (!instance.owner)
783 {
784 if (instance.gunner1)
785 {
786 instance.gun1.vehicle_exit(instance.gun1, VHEF_EJECT);
787 instance.phase = 0;
788 gettouch(instance)(instance, instance.gunner1);
789 return;
790 }
791
792 if (instance.gunner2)
793 {
794 instance.gun2.vehicle_exit(instance.gun2, VHEF_EJECT);
795 instance.phase = 0;
796 gettouch(instance)(instance, instance.gunner2);
797 return;
798 }
799 }
800}
801METHOD(Bumblebee, vr_death, void(Bumblebee thisveh, entity instance))
802{
803 CSQCModel_UnlinkEntity(instance);
804
805 // hide beam
806 if (instance.gun3.enemy || !wasfreed(instance.gun3.enemy))
807 instance.gun3.enemy.effects |= EF_NODRAW;
808
809 if (instance.gunner1)
810 instance.gun1.vehicle_exit(instance.gun1, VHEF_EJECT);
811 if (instance.gunner2)
812 instance.gun2.vehicle_exit(instance.gun2, VHEF_EJECT);
813
814 instance.vehicle_exit(instance, VHEF_EJECT);
815
816 fixedmakevectors(instance.angles);
817 vehicle_tossgib(instance, instance.gun1, instance.velocity + 300 * v_right + 100 * v_up + 200 * randomvec(), "cannon_right", rint(random()), rint(random()), 6, randomvec() * 200);
818 vehicle_tossgib(instance, instance.gun2, instance.velocity + -300 * v_right + 100 * v_up + 200 * randomvec(), "cannon_left", rint(random()), rint(random()), 6, randomvec() * 200);
819 vehicle_tossgib(instance, instance.gun3, instance.velocity + 300 * v_forward + -100 * v_up + 200 * randomvec(), "raygun", rint(random()), rint(random()), 6, randomvec() * 300);
820
821 entity _body = vehicle_tossgib(instance, instance, instance.velocity + randomvec() * 200, "", rint(random()), rint(random()), 6, randomvec() * 100);
822
823 if (random() > 0.5)
825 else
826 settouch(_body, func_null);
827
829 _body.nextthink = time;
830 _body.wait = time + 2 + (random() * 8);
831 _body.owner = instance;
832 _body.enemy = instance.enemy;
833 _body.scale = 1.5;
834 _body.angles = instance.angles;
835
836 Send_Effect(EFFECT_EXPLOSION_MEDIUM, findbetterlocation(instance.origin, 16), '0 0 0', 1);
837
838 SetResourceExplicit(instance, RES_HEALTH, 0);
839 instance.event_damage = func_null;
840 instance.solid = SOLID_NOT;
841 instance.takedamage = DAMAGE_NO;
842 instance.deadflag = DEAD_DYING;
843 set_movetype(instance, MOVETYPE_NONE);
844 instance.effects = EF_NODRAW;
845 instance.colormod = '0 0 0';
846 instance.avelocity = '0 0 0';
847 instance.velocity = '0 0 0';
848 settouch(instance, func_null);
849 instance.nextthink = 0;
850
851 setorigin(instance, instance.pos1);
852}
853METHOD(Bumblebee, vr_spawn, void(Bumblebee thisveh, entity instance))
854{
855 if (!instance.gun1)
856 {
857 // for some reason, autosizing of the shield entity refuses to work for this one so set it up in advance.
858 instance.vehicle_shieldent = new(vehicle_shieldent);
859 instance.vehicle_shieldent.effects = EF_LOWPRECISION;
860 setmodel(instance.vehicle_shieldent, MDL_VEH_BUMBLEBEE_SHIELD);
861 setattachment(instance.vehicle_shieldent, instance, "");
862 setorigin(instance.vehicle_shieldent, real_origin(instance) - instance.origin);
863 instance.vehicle_shieldent.scale = 512 / vlen(instance.maxs - instance.mins);
864 setthink(instance.vehicle_shieldent, shieldhit_think);
865 instance.vehicle_shieldent.alpha = -1;
866 instance.vehicle_shieldent.effects = EF_LOWPRECISION | EF_NODRAW;
867
868 instance.gun1 = new(vehicle_playerslot);
869 instance.gun2 = new(vehicle_playerslot);
870 instance.gun3 = new(bumblebee_raygun);
871
872 instance.vehicle_flags |= VHF_MULTISLOT;
873
874 instance.gun1.owner = instance;
875 instance.gun2.owner = instance;
876 instance.gun3.owner = instance;
877
878 setmodel(instance.gun1, MDL_VEH_BUMBLEBEE_CANNON_RIGHT);
879 setmodel(instance.gun2, MDL_VEH_BUMBLEBEE_CANNON_LEFT);
880 setmodel(instance.gun3, MDL_VEH_BUMBLEBEE_CANNON_CENTER);
881
882 setattachment(instance.gun1, instance, "cannon_right");
883 setattachment(instance.gun2, instance, "cannon_left");
884
885 // Angled bones are no fun, messes up gun-aim; so work arround it.
886 instance.gun3.pos1 = instance.angles;
887 instance.angles = '0 0 0';
888 vector ofs = gettaginfo(instance, gettagindex(instance, "raygun"));
889 ofs -= instance.origin;
890 setattachment(instance.gun3, instance, "");
891 setorigin(instance.gun3, ofs);
892 instance.angles = instance.gun3.pos1;
893
894 vehicle_addplayerslot(instance, instance.gun1, HUD_BUMBLEBEE_GUN, MDL_VEH_BUMBLEBEE_GUNCOCKPIT, bumblebee_gunner_frame, bumblebee_gunner_exit, bumblebee_gunner_enter);
895 vehicle_addplayerslot(instance, instance.gun2, HUD_BUMBLEBEE_GUN, MDL_VEH_BUMBLEBEE_GUNCOCKPIT, bumblebee_gunner_frame, bumblebee_gunner_exit, bumblebee_gunner_enter);
896
897 setorigin(instance.vehicle_hudmodel, '50 0 -5'); // Move cockpit forward - down.
898 setorigin(instance.vehicle_viewport, '5 0 2'); // Move camera forward up
899
900 //fixme-model-bones
901 setorigin(instance.gun1.vehicle_hudmodel, '90 -27 -23');
902 setorigin(instance.gun1.vehicle_viewport, '-85 0 50');
903 //fixme-model-bones
904 setorigin(instance.gun2.vehicle_hudmodel, '90 27 -23');
905 setorigin(instance.gun2.vehicle_viewport, '-85 0 50');
906
907 instance.scale = 1.5;
908
909 // Raygun beam
910 if (instance.gun3.enemy == NULL)
911 {
912 instance.gun3.enemy = new(bumble_raygun);
913 Net_LinkEntity(instance.gun3.enemy, true, 0, bumble_raygun_send);
914 instance.gun3.enemy.SendFlags = BRG_SETUP;
915 instance.gun3.enemy.cnt = autocvar_g_vehicle_bumblebee_raygun;
916 instance.gun3.enemy.effects = EF_NODRAW | EF_LOWPRECISION;
917 }
918 }
919
921 instance.dphitcontentsmask |= DPCONTENTS_LIQUIDSMASK;
922
924 instance.vehicle_shield = autocvar_g_vehicle_bumblebee_shield;
925 instance.solid = SOLID_BBOX;
926 set_movetype(instance, MOVETYPE_TOSS);
927 instance.damageforcescale = 0.025;
928
929 instance.PlayerPhysplug = bumblebee_pilot_frame;
930
931 setorigin(instance, instance.origin + '0 0 25');
932}
933METHOD(Bumblebee, vr_setup, void(Bumblebee thisveh, entity instance))
934{
937 instance.vehicle_flags |= VHF_ENERGYREGEN;
938
940 instance.vehicle_flags |= VHF_HASSHIELD;
941
943 instance.vehicle_flags |= VHF_SHIELDREGEN;
944
946 instance.vehicle_flags |= VHF_HEALTHREGEN;
947
948 instance.vehicle_exit = bumblebee_exit;
949 instance.respawntime = autocvar_g_vehicle_bumblebee_respawntime;
951 instance.max_health = GetResource(instance, RES_HEALTH);
952 instance.vehicle_shield = autocvar_g_vehicle_bumblebee_shield;
953}
954
955#endif // SVQC
956#ifdef CSQC
957
959{
960 Vehicles_drawHUD("vehicle_gunner", "vehicle_gunner_weapon1", string_null,
962 string_null, '0 0 0');
963}
964
965METHOD(Bumblebee, vr_hud, void(Bumblebee thisveh))
966{
967 Vehicles_drawHUD(VEH_BUMBLEBEE.m_icon, "vehicle_bumble_weapon1", "vehicle_bumble_weapon2",
970
971 float hudAlpha = autocvar_hud_panel_fg_alpha;
972 float blinkValue = 0.55 + sin(time * 7) * 0.45;
973 vector tmpPos = '0 0 0';
974 vector tmpSize = hud_fontsize;
975 tmpPos.x = vehicleHud_Pos.x + vehicleHud_Size.x * (520/768);
976
977 if (!AuxiliaryXhair[1].draw2d)
978 {
979 tmpPos.y = vehicleHud_Pos.y + vehicleHud_Size.y * (96/256) - tmpSize.y;
980 drawstring(tmpPos, _("No right gunner!"), tmpSize, '1 1 1', hudAlpha * blinkValue, DRAWFLAG_NORMAL);
981 }
982
983 if (!AuxiliaryXhair[2].draw2d)
984 {
985 tmpPos.y = vehicleHud_Pos.y + vehicleHud_Size.y * (160/256);
986 drawstring(tmpPos, _("No left gunner!"), tmpSize, '1 1 1', hudAlpha * blinkValue, DRAWFLAG_NORMAL);
987 }
988}
989METHOD(Bumblebee, vr_crosshair, void(Bumblebee thisveh, entity player))
990{
992}
993METHOD(Bumblebee, vr_setup, void(Bumblebee thisveh, entity instance))
994{
995 AuxiliaryXhair[0].axh_image = vCROSS_LOCK; // Raygun-locked
996 AuxiliaryXhair[1].axh_image = vCROSS_BURST; // Gunner1
997 AuxiliaryXhair[2].axh_image = vCROSS_BURST; // Gunner2
998}
999
1000#endif // CSQC
1001
1002#endif // GAMEQC
1003#ifdef MENUQC
1004
1005METHOD(Bumblebee, describe, string(Bumblebee this))
1006{
1007 TC(Bumblebee, this);
1009 PAR(_("The %s vehicle seats up to three passengers, who are given different roles based on the order they enter."), COLORED_NAME(this));
1010 PAR(_("The first player to enter will be the pilot, flying the vehicle up into the skies. "
1011 "The first player can also shoot a green healing wave to heal other teammates on the ground."));
1012 PAR(_("The second player to enter is the right gunner and the third player to enter is the left gunner."));
1013 PAR(_("When the pilot exits the vehicle, the players switch roles by moving up in position."));
1014 return PAGE_TEXT;
1015}
1016
1017#endif // MENUQC
ERASEABLE float anglemods(float v)
Definition angle.qc:13
ERASEABLE float shortangle_f(float ang1, float ang2)
Definition angle.qc:29
void fixedmakevectors(vector a)
void antilag_clear(entity e, entity store)
Definition antilag.qc:114
#define MUTATOR_CALLHOOK(id,...)
Definition base.qh:143
#define MUTATOR_IS_ENABLED(this)
Definition base.qh:193
bool autocvar_g_vehicle_bumblebee_raygun
Definition bumblebee.qc:56
float autocvar_g_vehicle_bumblebee_cannon_lock
Definition bumblebee.qc:42
float autocvar_g_vehicle_bumblebee_health_regen
Definition bumblebee.qc:31
float autocvar_g_vehicle_bumblebee_raygun_turnspeed
Definition bumblebee.qc:51
float autocvar_g_vehicle_bumblebee_respawntime
Definition bumblebee.qc:14
bool bumblebee_gunner_enter(entity this, entity player)
Definition bumblebee.qc:283
float autocvar_g_vehicle_bumblebee_healgun_locktime
Definition bumblebee.qc:67
float autocvar_g_vehicle_bumblebee_shield_regen
Definition bumblebee.qc:35
float autocvar_g_vehicle_bumblebee_energy_regen
Definition bumblebee.qc:27
float autocvar_g_vehicle_bumblebee_pitchspeed
Definition bumblebee.qc:21
float autocvar_g_vehicle_bumblebee_healgun_sps
Definition bumblebee.qc:66
float autocvar_g_vehicle_bumblebee_healgun_hmax
Definition bumblebee.qc:63
void bumblebee_exit(entity this, int eject)
Definition bumblebee.qc:656
float autocvar_g_vehicle_bumblebee_blowup_forceintensity
Definition bumblebee.qc:72
float autocvar_g_vehicle_bumblebee_cannon_ammo_regen
Definition bumblebee.qc:39
float autocvar_g_vehicle_bumblebee_cannon_turnlimit_out
Definition bumblebee.qc:48
void bumblebee_diethink(entity this)
Definition bumblebee.qc:726
float autocvar_g_vehicle_bumblebee_raygun_aps
Definition bumblebee.qc:59
void bumblebee_blowup(entity this)
Definition bumblebee.qc:698
bool vehicles_valid_pilot(entity this, entity toucher)
Definition bumblebee.qc:370
float autocvar_g_vehicle_bumblebee_cannon_ammo
Definition bumblebee.qc:38
bool bumblebee_gunner_frame(entity this, float dt)
Definition bumblebee.qc:77
float autocvar_g_vehicle_bumblebee_turnspeed
Definition bumblebee.qc:20
float autocvar_g_vehicle_bumblebee_blowup_edgedamage
Definition bumblebee.qc:71
bool bumblebee_pilot_frame(entity this, float dt)
Definition bumblebee.qc:427
float autocvar_g_vehicle_bumblebee_raygun_pitchlimit_down
Definition bumblebee.qc:52
float autocvar_g_vehicle_bumblebee_healgun_aps
Definition bumblebee.qc:64
float autocvar_g_vehicle_bumblebee_speed_strafe
Definition bumblebee.qc:17
float autocvar_g_vehicle_bumblebee_healgun_hps
Definition bumblebee.qc:62
float autocvar_g_vehicle_bumblebee_speed_forward
Definition bumblebee.qc:16
float autocvar_g_vehicle_bumblebee_raygun_range
Definition bumblebee.qc:57
float autocvar_g_vehicle_bumblebee_blowup_coredamage
Definition bumblebee.qc:70
float autocvar_g_vehicle_bumblebee_blowup_radius
Definition bumblebee.qc:69
float autocvar_g_vehicle_bumblebee_energy_regen_pause
Definition bumblebee.qc:28
float autocvar_g_vehicle_bumblebee_cannon_ammo_regen_pause
Definition bumblebee.qc:40
void bumblebee_regen(entity this, float dt)
Definition bumblebee.qc:407
bool autocvar_g_vehicle_bumblebee
Definition bumblebee.qc:75
float autocvar_g_vehicle_bumblebee_raygun_turnlimit_sides
Definition bumblebee.qc:54
vector bumblebee_gunner_findgoodexit(vector prefer_spot, entity gunner, entity player)
Definition bumblebee.qc:193
vector autocvar_g_vehicle_bumblebee_bouncepain
Definition bumblebee.qc:73
float autocvar_g_vehicle_bumblebee_healgun_amax
Definition bumblebee.qc:65
float autocvar_g_vehicle_bumblebee_cannon_pitchlimit_up
Definition bumblebee.qc:46
float autocvar_g_vehicle_bumblebee_raygun_fps
Definition bumblebee.qc:60
float autocvar_g_vehicle_bumblebee_health
Definition bumblebee.qc:30
void bumblebee_land(entity this)
Definition bumblebee.qc:641
void bumblebee_gunner_exit(entity this, int _exitflag)
Definition bumblebee.qc:216
float autocvar_g_vehicle_bumblebee_shield
Definition bumblebee.qc:34
const float BRG_SETUP
Definition bumblebee.qc:9
float autocvar_g_vehicle_bumblebee_cannon_turnlimit_in
Definition bumblebee.qc:47
float autocvar_g_vehicle_bumblebee_pitchlimit
Definition bumblebee.qc:22
void bumblebee_dead_touch(entity this, entity toucher)
Definition bumblebee.qc:721
float autocvar_g_vehicle_bumblebee_shield_regen_pause
Definition bumblebee.qc:36
float autocvar_g_vehicle_bumblebee_raygun_dps
Definition bumblebee.qc:58
const float BRG_START
Definition bumblebee.qc:10
const float BRG_END
Definition bumblebee.qc:11
bool autocvar_g_vehicle_bumblebee_swim
Definition bumblebee.qc:24
float autocvar_g_vehicle_bumblebee_raygun_pitchlimit_up
Definition bumblebee.qc:53
float autocvar_g_vehicle_bumblebee_friction
Definition bumblebee.qc:23
float autocvar_g_vehicle_bumblebee_cannon_turnspeed
Definition bumblebee.qc:44
void CSQC_BUMBLE_GUN_HUD()
Definition bumblebee.qc:958
float autocvar_g_vehicle_bumblebee_cannon_pitchlimit_down
Definition bumblebee.qc:45
float autocvar_g_vehicle_bumblebee_health_regen_pause
Definition bumblebee.qc:32
float autocvar_g_vehicle_bumblebee_energy
Definition bumblebee.qc:26
float autocvar_g_vehicle_bumblebee_speed_down
Definition bumblebee.qc:19
void bumblebee_touch(entity this, entity toucher)
Definition bumblebee.qc:384
float autocvar_g_vehicle_bumblebee_speed_up
Definition bumblebee.qc:18
void bumblebee_fire_cannon(entity this, entity _gun, string _tagname, entity _owner)
bool bumble_raygun_send(entity this, entity to, float sf)
float autocvar_g_vehicle_bumblebee_cannon_speed
float autocvar_g_vehicle_bumblebee_cannon_refire
float autocvar_g_vehicle_bumblebee_cannon_cost
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
float GetResource(entity e, Resource res_type)
Returns the current amount of resource the given entity has.
bool SetResourceExplicit(entity e, Resource res_type, float amount)
Sets the resource amount of an entity without calling any hooks.
void Vehicles_drawCrosshair(string crosshair)
void Vehicles_drawHUD(string vehicle, string vehicleWeapon1, string vehicleWeapon2, string iconAmmo1, vector colorAmmo1, string iconAmmo2, vector colorAmmo2)
vector vehicleHud_Pos
const string vCROSS_LOCK
vector vehicleHud_Size
const string vCROSS_HEAL
vector autocvar_hud_progressbar_vehicles_ammo1_color
const string vCROSS_BURST
entity AuxiliaryXhair[MAX_AXH]
#define drawstring(position, text, scale, rgb, alpha, flag)
Definition draw.qh:27
float wait
Definition items.qc:17
vector hud_fontsize
Definition main.qh:77
entity owner
Definition main.qh:87
#define COLORED_NAME(this)
Definition color.qh:195
#define setmodel(this, m)
Definition model.qh:26
#define PHYS_INPUT_BUTTON_CROUCH(s)
Definition player.qh:156
vector movement
Definition player.qh:228
#define IS_CLIENT(s)
Definition player.qh:241
#define IS_DEAD(s)
Definition player.qh:244
#define PHYS_INPUT_BUTTON_JUMP(s)
Definition player.qh:153
#define PHYS_INPUT_FRAMETIME
Definition player.qh:254
vector v_angle
Definition player.qh:236
#define IS_PLAYER(s)
Definition player.qh:242
#define PHYS_INPUT_BUTTON_ATCK(s)
Definition player.qh:152
#define PHYS_INPUT_BUTTON_ATCK2(s)
Definition player.qh:154
float game_stopped
Definition stats.qh:81
vector real_origin(entity ent)
Definition util.qc:147
vector findbetterlocation(vector org, float mindist)
Definition util.qc:116
const int HUD_BUMBLEBEE_GUN
Definition constants.qh:48
const int HUD_NORMAL
Definition constants.qh:47
vector v_up
const float DRAWFLAG_NORMAL
const float SOLID_SLIDEBOX
entity trace_ent
const float MOVE_NORMAL
float DPCONTENTS_LIQUIDSMASK
vector velocity
const float SOLID_BBOX
const float SOLID_NOT
float time
vector v_right
vector trace_endpos
float trace_startsolid
float nextthink
vector v_forward
vector origin
float trace_fraction
vector oldorigin
float trace_allsolid
const float EF_NODRAW
#define CSQCMODEL_AUTOUPDATE(e)
void Damage(entity targ, entity inflictor, entity attacker, float damage, int deathtype,.entity weaponentity, vector hitloc, vector force)
Definition damage.qc:493
bool Heal(entity targ, entity inflictor, float amount, float limit)
Definition damage.qc:957
float RadiusDamage(entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity cantbe, entity mustbe, float forceintensity, int deathtype,.entity weaponentity, entity directhitentity)
Definition damage.qc:943
#define DMG_NOWEP
Definition damage.qh:104
float EF_LOWPRECISION
#define gettagindex
void Send_Effect(entity eff, vector eff_loc, vector eff_vel, int eff_cnt)
Definition all.qc:120
RES_ARMOR
Definition ent_cs.qc:130
ent angles
Definition ent_cs.qc:121
float autocvar_hud_panel_fg_alpha
Definition hud.qh:202
#define TC(T, sym)
Definition _all.inc:82
void Net_LinkEntity(entity e, bool docull, float dt, bool(entity this, entity to, int sendflags) sendfunc)
Definition net.qh:167
#define STAT(...)
Definition stats.qh:82
#define LOG_TRACE(...)
Definition log.qh:76
float MSG_ONE
Definition menudefs.qc:56
float bound(float min, float value, float max)
float random(void)
float vlen(vector v)
vector vectoangles(vector v)
void WriteEntity(entity data, float dest, float desto)
vector randomvec(void)
float sin(float f)
float min(float f,...)
float rint(float f)
vector normalize(vector v)
void WriteByte(float data, float dest, float desto)
void WriteAngle(float data, float dest, float desto)
void set_movetype(entity this, int mt)
Definition movetypes.qc:4
const int MOVETYPE_WALK
Definition movetypes.qh:132
const int MOVETYPE_NONE
Definition movetypes.qh:129
const int MOVETYPE_BOUNCEMISSILE
Definition movetypes.qh:140
#define UNSET_ONGROUND(s)
Definition movetypes.qh:18
const int MOVETYPE_NOCLIP
Definition movetypes.qh:137
const int MOVETYPE_TOSS
Definition movetypes.qh:135
var void func_null()
string string_null
Definition nil.qh:9
#define METHOD(cname, name, prototype)
Definition oo.qh:269
#define NULL
Definition post.qh:14
#define makevectors
Definition post.qh:21
#define gettaginfo
Definition post.qh:32
float DEAD_DYING
Definition progsdefs.qc:275
entity msg_entity
Definition progsdefs.qc:63
float DEAD_DEAD
Definition progsdefs.qc:276
float health
Legacy fields for the resources. To be removed.
Definition resources.qh:9
const int RES_LIMIT_NONE
Definition resources.qh:60
#define gettouch(e)
Definition self.qh:74
#define setthink(e, f)
vector
Definition self.qh:92
entity entity toucher
Definition self.qh:72
#define settouch(e, f)
Definition self.qh:73
void RemoveGrapplingHooks(entity pl)
Definition hook.qc:30
void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, int deathtype,.entity weaponentity, vector hitloc, vector force)
Definition player.qc:234
const float VOL_BASE
Definition sound.qh:36
const int CH_SHOTS
Definition sound.qh:14
const float ATTEN_NORM
Definition sound.qh:30
#define sound(e, c, s, v, a)
Definition sound.qh:52
#define spawnfunc(id)
Definition spawnfunc.qh:96
ClientState CS(Client this)
Definition state.qh:47
#define PAGE_TEXT
Definition string.qh:642
#define PAR(...)
Adds an individually translatable paragraph to PAGE_TEXT without having to deal with strcat and sprin...
Definition string.qh:648
#define PAGE_TEXT_INIT()
Definition string.qh:641
const int DAMAGE_NO
Definition subs.qh:79
const int DAMAGE_AIM
Definition subs.qh:81
entity enemy
Definition sv_ctf.qh:153
int autocvar_g_instagib_extralives
void CSQCModel_UnlinkEntity(entity e)
Definition sv_model.qc:139
void GiveResourceWithLimit(entity receiver, Resource res_type, float amount, float limit)
Gives an entity some resource but not more than a limit.
void vehicles_impact(entity this, float _minspeed, float _speedfac, float _maxpain)
bool vehicle_initialize(entity this, Vehicle info, bool nodrop)
void vehicles_touch(entity this, entity toucher)
void vehicles_regen(entity this, float timer,.float regen_field, float field_max, float rpause, float regen, float delta_time, float _healthscale)
vector vehicles_findgoodexit(entity this, entity player, vector prefer_spot)
void shieldhit_think(entity this)
bool vehicle_addplayerslot(entity _owner, entity _slot, int _hud, Model _hud_model, bool(entity, float) _framefunc, void(entity, bool) _exitfunc, float(entity, entity) _enterfunc)
void UpdateAuxiliaryXhair(entity own, vector loc, vector clr, int axh_id)
void vehicles_think(entity this)
void vehicles_regen_resource(entity this, float timer,.float regen_field, float field_max, float rpause, float regen, float delta_time, float _healthscale, Resource resource)
void CSQCVehicleSetup(entity own, int vehicle_id)
vector vehicle_aimturret(entity _vehic, vector _target, entity _turrret, string _tagname, float _pichlimit_min, float _pichlimit_max, float _rotlimit_min, float _rotlimit_max, float _aimspeed, float dt)
void vehicles_frame(entity this, entity actor)
entity vehicle_tossgib(entity this, entity _template, vector _vel, string _tag, bool _burn, bool _explode, float _maxtime, vector _rot)
const float vehicle_shield
If ent is player this is 0..100 indicating precentage of shield left on vehicle. If ent is vehicle,...
const float vehicle_ammo1
If ent is player this is 0..100 indicating percentage of primary ammo left UNLESS value is already st...
float dmg_time
const float SVC_SETVIEWANGLES
const float vehicle_health
If ent is player this is 0..100 indicating precentage of health left on vehicle. Vehicle's value is t...
const float vehicle_energy
If ent is player this is 0..100 indicating precentage of energy left on vehicle. If ent is vehicle,...
const float SVC_SETVIEWPORT
const int VHEF_EJECT
User pressed exit key 3 times fast (not implemented) or vehicle is dying.
#define VEHICLE_UPDATE_PLAYER(ply, vehi, fld, vhname)
#define VEHICLE_UPDATE_PLAYER_RESOURCE(ply, vehi, fld, vhname, res)
entity gun1
entity vehicle
float autocvar_g_vehicles_allow_bots
int vehicle_flags
entity gunner1
entity gunner2
entity gun3
entity gun2
entity vehicle_shieldent
Entity to disply the shild effect on damage.
const float vehicle_ammo2
If ent is player this is 0..100 indicating percentage of secondary ammo left. If ent is vehicle,...
const float vehicle_reload1
If ent is player this is 0..100 indicating percentage of primary reload status. If ent is vehicle,...
bool teamplay
Definition teams.qh:59
#define DIFF_TEAM(a, b)
Definition teams.qh:242
const int TELEPORT_NORMAL
void crosshair_trace(entity pl)
Definition tracing.qc:542
#define IS_REAL_CLIENT(v)
Definition utils.qh:17
#define IS_VEHICLE(v)
Definition utils.qh:24
#define IS_BOT_CLIENT(v)
want: (IS_CLIENT(v) && !IS_REAL_CLIENT(v))
Definition utils.qh:15
#define vlen2(v)
Definition vector.qh:4
#define vdist(v, cmp, f)
Vector distance comparison, avoids sqrt()
Definition vector.qh:8
const int VHF_HASSHIELD
Vehicle has shileding.
Definition vehicle.qh:95
const int VHF_MULTISLOT
Vehicle has multiple player slots.
Definition vehicle.qh:106
const int VHF_HEALTHREGEN
Vehicles health regenerates.
Definition vehicle.qh:97
const int VHF_ENERGYREGEN
Vehicles energy regenerates.
Definition vehicle.qh:98
const int VHF_SHIELDREGEN
Vehicles shield regenerates.
Definition vehicle.qh:96
float vehicle_altitude(entity this, float amax)
Definition vehicles.qc:4
const int MAX_WEAPONSLOTS
Definition weapon.qh:16
int max_shot_distance
Definition weapon.qh:245
entity weaponentities[MAX_WEAPONSLOTS]
Definition weapon.qh:17
bool weaponUseForbidden(entity player)
bool weaponLocked(entity player)
Weapon m_switchweapon
Definition wepent.qh:25