1 #define RACER_MIN '-80 -80 -40'
2 #define RACER_MAX '80 80 40'
3 #define RACER_TICRATE 0.05
5 void racer_exit(float eject);
10 float racer_power_solid;
11 float racer_power_min;
12 float racer_anglestabilizer;
13 float racer_springlength;
15 float racer_healthmax;
16 float racer_shieldmax;
17 float racer_energymax;
19 float racer_pitchspeed;
20 float racer_turnspeed;
22 float racer_speed_forward;
23 float racer_speed_strafe;
25 float racer_afterburn_cost;
27 float jetfromtag_power;
28 float jetfromtag_normpower;
29 vector jetfromtag_origin;
30 float jetfromtag_groundcontact;
32 void racer_loadsettings()
34 racer_power_min = autocvar_g_vehicle_racer_power_min * 0.25;
35 racer_power_air = autocvar_g_vehicle_racer_power_air * 0.25;
36 racer_power_solid = autocvar_g_vehicle_racer_power_solid * 0.25;
38 racer_springlength = autocvar_g_vehicle_racer_springlength;
39 racer_anglestabilizer = autocvar_g_vehicle_racer_anglestabilizer;
40 racer_pitchspeed = autocvar_g_vehicle_racer_pitchspeed;
41 racer_turnspeed = autocvar_g_vehicle_racer_turnspeed;
42 racer_turnroll = autocvar_g_vehicle_racer_turnroll;
43 racer_speed_forward = autocvar_g_vehicle_racer_speed_forward;
44 racer_speed_strafe = autocvar_g_vehicle_racer_speed_strafe;
46 racer_afterburn_cost = autocvar_g_vehicle_racer_afterburn_cost;
48 racer_healthmax = autocvar_g_vehicle_racer_health;
49 racer_shieldmax = autocvar_g_vehicle_racer_shield;
50 racer_energymax = autocvar_g_vehicle_racer_energy;
54 vector racer_jetfromtag(string tagname)
57 float air_frac, solid_frac, air_pwr, solid_pwr;
59 jetfromtag_origin = gettaginfo(self,gettagindex(self,tagname));
60 v_forward = normalize(v_forward) * -1;
62 force_dir = jetfromtag_origin - (v_forward * racer_springlength);
63 traceline(jetfromtag_origin, force_dir, MOVE_NORMAL, self);
64 //te_lightning1(world,jetfromtag_origin, force_dir);
66 //trace_fraction *= trace_fraction;
68 solid_frac = 1 - trace_fraction;
69 air_frac = trace_fraction;
71 if (trace_fraction != 1.0)
72 jetfromtag_groundcontact = 1;
74 solid_pwr = solid_frac * racer_power_solid;
75 air_pwr = air_frac * racer_power_air;
77 jetfromtag_power = solid_pwr + air_pwr;
78 jetfromtag_normpower = jetfromtag_power / (racer_power_air + racer_power_solid);
80 //te_lightning1(world,jetfromtag_origin,jetfromtag_origin + normalize(self.origin - force_dir) * max(jetfromtag_power, racer_power_min));
81 //return normalize(self.origin - force_dir) * max(jetfromtag_power, racer_power_min);
82 return v_forward * max(jetfromtag_power, racer_power_min);
85 void racer_align4point()
88 float fl_push, fr_push, bl_push, br_push;
90 jetfromtag_groundcontact = 0;
92 push_vector = racer_jetfromtag("tag_engine_fr");
93 fr_push = jetfromtag_normpower;
94 traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
95 if(trace_fraction != 1)
96 self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
98 push_vector += racer_jetfromtag("tag_engine_fl");
99 fl_push = jetfromtag_normpower;
100 traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
101 if(trace_fraction != 1)
102 self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
104 push_vector += racer_jetfromtag("tag_engine_br");
105 br_push = jetfromtag_normpower;
106 traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
107 if(trace_fraction != 1)
108 self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
110 push_vector += racer_jetfromtag("tag_engine_bl");
111 bl_push = jetfromtag_normpower;
112 traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
113 if(trace_fraction != 1)
114 self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
116 self.velocity = self.velocity + (push_vector * frametime);
117 self.velocity_z -= autocvar_sv_gravity * frametime;
119 push_vector_x = (fl_push - bl_push);
120 push_vector_x += (fr_push - br_push);
121 push_vector_x *= 360;
123 push_vector_z = (fr_push - fl_push);
124 push_vector_z += (br_push - bl_push);
125 push_vector_z *= 360;
127 //if (push_vector_z != 0)
128 if(self.angles_z > 0)
129 self.angles_z = max(0, self.angles_z - (racer_anglestabilizer * frametime));
131 self.angles_z = min(0, self.angles_z + (racer_anglestabilizer * frametime));
133 self.angles_z += push_vector_z * frametime;
135 //if (push_vector_x != 0)
136 if(self.angles_x > 0)
137 self.angles_x = max(0, self.angles_x - (racer_anglestabilizer * frametime));
139 self.angles_x = min(0, self.angles_x + (racer_anglestabilizer * frametime));
141 self.angles_x += push_vector_x * frametime;
144 void racer_bolt_explode()
148 org2 = findbetterlocation (self.origin, 8);
149 pointparticles(particleeffectnum("laser_impact"), org2, trace_plane_normal * 1000, 1);
150 RadiusDamage (self, self.realowner, autocvar_g_vehicle_racer_laser_damage, 0, autocvar_g_vehicle_racer_laser_radius, world, 150, DEATH_WAKIGUN, world);
151 sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
156 void racer_rocket_explode()
161 // self.owner = self.realowner;
163 sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
164 org2 = findbetterlocation (self.origin, 16);
165 pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
166 RadiusDamage (self, self.realowner ,autocvar_g_vehicle_racer_rocket_damage, 0, autocvar_g_vehicle_racer_rocket_radius, world, 150, DEATH_WAKIROCKET, world);
171 void racer_rocket_touch()
173 if(other.owner == self.owner)
178 if(pointcontents(self.origin) == CONTENT_SKY)
180 self.think = SUB_Remove;
181 self.nextthink = time;
186 racer_rocket_explode();
189 void racer_fire_cannon(string tagname)
194 bolt.solid = SOLID_TRIGGER;
195 bolt.movetype = MOVETYPE_FLYMISSILE;
196 bolt.flags = FL_PROJECTILE | FL_NOTARGET;
198 bolt.realowner = self.owner;
199 bolt.touch = racer_bolt_explode;
200 bolt.think = racer_bolt_explode;
201 bolt.nextthink = time + 9;
202 bolt.bot_dodge = TRUE;
203 bolt.bot_dodgerating = autocvar_g_vehicle_racer_laser_damage;
204 setorigin(bolt, gettaginfo(self,gettagindex(self,tagname)));
207 // FIXME this uses prydon cursor
208 v = normalize(self.owner.cursor_trace_endpos - bolt.origin);
209 v_forward_z = v_z * 0.5;
211 bolt.velocity = v_forward * autocvar_g_vehicle_racer_laser_speed;
213 CSQCProjectile(bolt, TRUE, PROJECTILE_LASER, TRUE);
216 void racer_rocket_groundhugger()
218 vector newdir,olddir;
219 float oldspeed, newspeed;
221 self.nextthink = time;
223 if ((self.owner.deadflag != DEAD_NO) || (self.cnt < time))
225 racer_rocket_explode();
229 if not (self.realowner.vehicle)
231 UpdateCSQCProjectile(self);
235 olddir = normalize(self.velocity);
236 oldspeed = vlen(self.velocity);
238 tracebox(self.origin, self.mins, self.maxs, self.origin + olddir * 512, MOVE_WORLDONLY,self);
239 if(trace_fraction >= 0.35)
241 traceline(trace_endpos, trace_endpos - '0 0 512', MOVE_NORMAL, self);
242 if(trace_fraction != 1.0)
243 newdir = trace_endpos + '0 0 32';
245 newdir = normalize(newdir - self.origin);
248 newspeed = oldspeed + self.lip;
249 self.velocity = normalize(olddir + newdir * self.wait) * newspeed;
251 UpdateCSQCProjectile(self);
254 void racer_rocket_think()
256 vector newdir,olddir, eorg, edir;
257 float oldspeed, newspeed, dist;
259 self.nextthink = time;
261 if ((self.owner.deadflag != DEAD_NO) || (self.cnt < time))
263 racer_rocket_explode();
267 if not (self.realowner.vehicle)
269 UpdateCSQCProjectile(self);
273 olddir = normalize(self.velocity);
274 oldspeed = vlen(self.velocity);
275 fixedmakevectors(olddir);
276 eorg = 0.5 * (self.enemy.absmin + self.enemy.absmax);
277 edir = normalize(eorg - self.origin);
278 dist = vlen(self.origin - self.enemy.origin);
284 p = dist / self.delay;
285 p = max(0.05, p * 0.25);
286 ddir = steerlib_traceavoid(p, oldspeed * 0.25);
290 newdir = normalize(olddir + edir * self.wait);
291 newspeed = oldspeed + self.lip;
292 self.velocity = normalize(olddir + newdir * self.wait) * newspeed;
294 UpdateCSQCProjectile(self);
297 void racer_fire_rocket(string tagname)
302 setsize (rocket, '-1 -1 -1', '1 1 1');
303 rocket.lip = autocvar_g_vehicle_racer_rocket_accel * sys_frametime;
304 rocket.wait = autocvar_g_vehicle_racer_rocket_turnrate;
305 rocket.solid = SOLID_BBOX;
306 rocket.movetype = MOVETYPE_FLYMISSILE;
307 rocket.flags = FL_PROJECTILE;
309 rocket.realowner = self.owner;
310 rocket.touch = racer_rocket_touch;
311 rocket.bot_dodge = TRUE;
312 rocket.bot_dodgerating = autocvar_g_vehicle_racer_rocket_damage;
313 setorigin(rocket, gettaginfo(self,gettagindex(self,tagname)));
316 if( (self.tur_head.gun1) && (self.tur_head.cnt > time))
317 rocket.enemy = self.tur_head.gun1;
321 rocket.delay = vlen(rocket.enemy.origin - rocket.origin);
322 rocket.cnt = time + 9;
323 rocket.velocity = v_forward * autocvar_g_vehicle_racer_rocket_speed;
324 rocket.think = racer_rocket_think;
325 rocket.nextthink = time;
326 CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound
331 rocket.cnt = time + 9;
332 rocket.velocity = v_forward * autocvar_g_vehicle_racer_rocket_speed;
333 rocket.think = racer_rocket_groundhugger;
334 rocket.nextthink = time;
335 CSQCProjectile(rocket, TRUE, PROJECTILE_ROCKET, TRUE);
339 float racer_customizeentityforclient()
342 if(self.deadflag == DEAD_DEAD)
346 if(other == self.owner)
357 entity player, racer;
361 if(autocvar_g_vehicle_racer_reload)
363 racer_loadsettings();
364 cvar_set("g_vehicle_racer_reload","0");
368 racer = self.vehicle;
370 player.BUTTON_ZOOM = 0;
371 player.BUTTON_CROUCH = 0;
375 if(player.BUTTON_USE)
383 if(racer.deadflag != DEAD_NO)
386 player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
393 racer.angles_x *= -1;
394 makevectors(racer.angles);
397 ftmp = racer_turnspeed * sys_frametime;
400 ftmp = bound(ftmp2, shortangle_f(player.v_angle_y - racer.angles_y, racer.angles_y), ftmp);
401 ftmp2 = anglemods(racer.angles_y + ftmp);
404 ftmp = bound(-45, shortangle_f(player.v_angle_z + ((racer.angles_y - ftmp2) * racer_turnroll), racer.angles_z), 45);
405 ftmp = anglemods(racer.angles_z + ftmp);
406 racer.angles_z = bound(-85, ftmp, 85);
409 racer.angles_y = ftmp2;
412 ftmp = racer_pitchspeed * sys_frametime;
415 ftmp = bound(ftmp2,shortangle_f(player.v_angle_x - racer.angles_x,racer.angles_x),ftmp);
416 racer.angles_x = anglemods(racer.angles_x + ftmp);
417 racer.angles_x *= -1;
419 df = racer.velocity * -0.5;
421 if(player.movement_x != 0)
423 if(player.movement_x > 0)
424 df += v_forward * racer_speed_forward;
425 else if(player.movement_x < 0)
426 df -= v_forward * racer_speed_forward;
429 if(player.movement_y != 0)
431 if(player.movement_y < 0)
432 df -= v_right * racer_speed_strafe;
433 else if(player.movement_y > 0)
434 df += v_right * racer_speed_strafe;
437 // limit _z to avoid flying on normal thrust
439 df_z = min(df_z,700);
443 if (player.BUTTON_JUMP)
444 if(racer.vehicle_energy >= (racer_afterburn_cost * frametime))
446 racer.wait = time + autocvar_g_vehicle_racer_energy_usepause;
447 racer.vehicle_energy -= racer_afterburn_cost * frametime;
448 df += (v_forward * autocvar_g_vehicle_racer_speed_afterburn);
451 racer.velocity += df * frametime;
453 df = (vlen(racer.velocity) * autocvar_g_vehicle_racer_downforce * v_up) * frametime;
454 racer.velocity = racer.velocity - df;
455 player.movement = racer.velocity;
458 // for homing rockets
459 // FIXME this uses prydon cursor
460 if(self.owner.cursor_trace_ent)
462 self.tur_head.gun1 = self.owner.cursor_trace_ent;
463 self.tur_head.cnt = time + 1;
467 if(player.BUTTON_ATCK)
468 if(time > racer.attack_finished_single)
469 if(racer.vehicle_energy >= autocvar_g_vehicle_racer_laser_cost)
471 racer.vehicle_energy -= autocvar_g_vehicle_racer_laser_cost;
472 racer.wait = time + autocvar_g_vehicle_racer_energy_usepause;
476 racer_fire_cannon("tag_fire1");
481 racer_fire_cannon("tag_fire2");
484 racer.attack_finished_single = time + autocvar_g_vehicle_racer_laser_refire;
487 if(player.BUTTON_ATCK2)
488 if(time > racer.delay)
490 racer_fire_rocket("tag_rocket_r");
491 racer_fire_rocket("tag_rocket_l");
492 racer.delay = time + autocvar_g_vehicle_racer_rocket_refire;
497 player.vehicle_reload1 = (time - racer.lip) / (racer.delay-racer.lip);
498 vehicle_stdproc_shiledregen(racer_shieldmax, frametime);
499 vehicle_stdproc_healthregen(racer_healthmax, frametime);
501 if (racer.wait < time)
502 vehicle_stdproc_energyregen(racer_energymax, frametime);
504 player.vehicle_energy = (racer.vehicle_energy / racer_energymax);
508 player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
509 setorigin(player,racer.origin + '0 0 32');
510 player.velocity = racer.velocity;
515 void racer_exitthink()
519 self.nextthink = time;
521 a = racer_anglestabilizer;
522 b = racer_springlength;
523 c = racer_power_solid;
525 racer_anglestabilizer = 36;
526 racer_springlength = 96;
527 racer_power_solid = 300;
531 if(self.velocity_z < 0)
532 self.velocity_z *= 0.95;
534 racer_anglestabilizer = a;
535 racer_springlength = b;
536 racer_power_solid = c;
538 self.velocity_x *= 0.95;
539 self.velocity_y *= 0.95;
542 void racer_spawnthink()
547 self.nextthink = time;
549 a = racer_anglestabilizer;
550 b = racer_springlength;
551 c = racer_power_solid;
553 racer_anglestabilizer = 36;
554 racer_springlength = 96;
555 racer_power_solid = 300;
557 // self.velocity_z += sin(time * 128) * 4;
561 if(self.velocity_z < 0)
562 self.velocity_z *= 0.98;
564 racer_anglestabilizer = a;
565 racer_springlength = b;
566 racer_power_solid = c;
568 self.velocity_x *= 0.95;
569 self.velocity_y *= 0.95;
571 dorg = self.pos1 - self.origin ;
573 self.velocity_x = bound(-32, self.velocity_x + dorg_x, 32);
574 self.velocity_y = bound(-32, self.velocity_y + dorg_y, 32);
584 self.vehicle_hudmodel.viewmodelforclient = self.owner;
585 self.colormap = self.owner.colormap;
587 self.owner.PlayerPhysplug = racer_pplug;
588 self.owner.takedamage = DAMAGE_NO;
589 self.owner.event_damage = SUB_Null;
590 self.owner.vehicle = self;
591 self.owner.angles = self.angles;
592 self.owner.solid = SOLID_NOT;
593 self.owner.movetype = MOVETYPE_NOCLIP;
594 self.owner.alpha = -1;
595 self.owner.hud = HUD_WAKIZASHI;
596 self.owner.effects |= EF_NODRAW;
597 self.owner.view_ofs = '0 0 0';
599 self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_racer_health);
600 self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_racer_shield);
602 setorigin(other,self.origin + '0 0 32');
603 other.velocity = self.velocity;
605 other.flags &~= FL_ONGROUND;
607 WriteByte (MSG_ONE, SVC_SETVIEWPORT);
608 WriteEntity( MSG_ONE, self.vehicle_viewport);
610 WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES
611 WriteAngle(MSG_ONE, self.angles_x * -1); // tilt
612 WriteAngle(MSG_ONE, self.angles_y); // yaw
613 WriteAngle(MSG_ONE, 0); // roll
619 pointparticles(particleeffectnum("teleport"), self.enemy.origin + '0 0 64', '0 0 0', 1);
620 self.enemy.think = racer_spawn;
621 self.enemy.nextthink = time;
625 void racer_exit(float eject)
627 self.colormap = 1024;
628 self.flags = FL_NOTARGET;
633 msg_entity = self.owner;
634 WriteByte (MSG_ONE, SVC_SETVIEWPORT);
635 WriteEntity( MSG_ONE, self.owner);
637 WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES
638 WriteAngle(MSG_ONE, 0); // tilt
639 WriteAngle(MSG_ONE, self.angles_y); // yaw
640 WriteAngle(MSG_ONE, 0); // roll
642 if (self.deadflag == DEAD_NO)
644 self.think = racer_exitthink;
645 self.nextthink = time;
648 self.owner.takedamage = DAMAGE_AIM;
649 self.owner.solid = SOLID_SLIDEBOX;
650 self.owner.movetype = MOVETYPE_WALK;
652 setsize(self.owner,PL_MIN,PL_MAX);
654 self.owner.effects &~= EF_NODRAW;
655 self.owner.alpha = 1;
656 self.owner.PlayerPhysplug = SUB_Null;
657 self.owner.vehicle = world;
658 self.owner.view_ofs = PL_VIEW_OFS;
659 self.owner.event_damage = PlayerDamage;
660 self.owner.hud = HUD_NORMAL;
662 self.vehicle_hudmodel.viewmodelforclient = self;
666 makevectors(self.angles);
667 setorigin(self.owner,self.origin + v_forward * 100);
668 self.owner.velocity = (v_up + v_forward * 0.25) * 750;
672 self.owner.velocity = (v_forward) * -150;
673 setorigin(self.owner,self.origin - v_forward * 128);
678 if (self.deadflag != DEAD_NO)
683 ret.think = racer_return;
684 ret.nextthink = time + autocvar_g_vehicle_racer_respawntime;
692 if(vlen(self.velocity) == 0)
695 if(other.classname != "player")
699 a = normalize(other.origin - self.origin);
700 a = a - normalize(self.velocity);
705 if(other.classname != "player")
708 if(other.deadflag != DEAD_NO)
711 if(other.vehicle != world)
719 self.think = racer_spawnthink;
720 self.nextthink = time;
722 self.flags = FL_NOTARGET;
725 self.vehicle_health = racer_healthmax;
726 self.vehicle_shield = racer_shieldmax;
728 self.event_damage = vehicle_stdproc_damage;
729 self.touch = racer_touch;
731 self.iscreature = TRUE;
733 self.movetype = MOVETYPE_FLY;
734 self.solid = SOLID_SLIDEBOX;
735 self.takedamage = DAMAGE_AIM;
738 self.colormap = 1024;
739 self.deadflag = DEAD_NO;
740 self.bot_attack = TRUE;
742 self.vehicle_energy = 1;
743 self.vehicle_hudmodel.viewmodelforclient = self;
745 setorigin(self, self.pos1);
746 self.angles = self.pos2;
748 setsize(self,RACER_MIN * 0.5,RACER_MAX * 0.5);
749 pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
757 sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
758 pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
760 self.deadflag = DEAD_DEAD;
761 self.vehicle_exit(VHEF_NORMAL);
762 RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_WAKIBLOWUP, world);
765 self.nextthink = time + autocvar_g_vehicle_racer_respawntime;
766 self.think = racer_spawn;
767 self.movetype = MOVETYPE_NONE;
768 self.effects = EF_NODRAW;
770 self.avelocity_z = 0;
771 self.colormod = '0 0 0';
773 setorigin(self,self.pos1);
776 void racer_dietouch()
781 self.wait = time + 0.75;
783 pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
789 self.event_damage = SUB_Null;
790 self.iscreature = FALSE;
791 self.solid = SOLID_NOT;
792 self.takedamage = DAMAGE_NO;
793 self.touch = racer_dietouch;
794 self.deadflag = DEAD_DYING;
795 self.movetype = MOVETYPE_BOUNCE;
798 pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
800 self.velocity += '0 0 128';
803 self.avelocity_z = 16;
805 self.avelocity_z = -16;
807 self.colormod = '-0.5 -0.5 -0.5';
809 self.think = racer_blowup;
810 self.nextthink = time + 3;
816 tracebox(self.origin + '0 0 100', RACER_MIN * 0.5, RACER_MAX * 0.5, self.origin - '0 0 10000', MOVE_WORLDONLY, self);
817 setorigin(self,trace_endpos);
819 if (self.netname == "")
820 self.netname = "Race PoD";
822 self.cvar_basename = "g_vehicle_racer";
824 self.vehicle_viewport = spawn();
825 self.vehicle_hudmodel = spawn();
826 //self.ccamera = spawn();
828 setorigin(self, self.origin);
830 setmodel(self,"models/vehicles/wakizashi.dpm");
831 setmodel(self.vehicle_hudmodel, "models/vehicles/wakizashi_cockpit.dpm");
832 setmodel (self.vehicle_viewport, "null");
834 setattachment(self.vehicle_hudmodel, self, "");
835 setattachment(self.vehicle_viewport, self, "tag_viewport");
837 self.vehicle_hudmodel.viewmodelforclient = self;
838 self.customizeentityforclient = racer_customizeentityforclient;
840 self.tur_head = spawn();
842 self.pos1 = self.origin;
843 self.pos2 = self.angles;
844 self.angles = '0 0 0';
845 self.angles = self.pos1;
847 self.vehicle_die = racer_die;
848 self.vehicle_exit = racer_exit;
850 addstat(STAT_HUD, AS_INT, hud);
851 addstat(STAT_VEHICLESTAT_HEALTH, AS_FLOAT, vehicle_health);
852 addstat(STAT_VEHICLESTAT_SHIELD, AS_FLOAT, vehicle_shield);
853 addstat(STAT_VEHICLESTAT_ENERGY, AS_FLOAT, vehicle_energy);
855 addstat(STAT_VEHICLESTAT_AMMO1, AS_INT, vehicle_ammo1);
856 addstat(STAT_VEHICLESTAT_RELOAD1, AS_FLOAT, vehicle_reload1);
858 addstat(STAT_VEHICLESTAT_AMMO2, AS_INT, vehicle_ammo2);
859 addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2);
864 void spawnfunc_vehicle_racer()
866 g_turrets_common_precash();
867 racer_loadsettings();
869 self.vehicle_flags = VHF_HASSHIELD | VHF_SHIELDREGEN;
872 traceline(self.origin,self.origin - '0 0 2048',MOVE_WORLDONLY,self);
875 dprint("WARNING: vehicle_racer placed in solid\n");
876 traceline(self.origin + '0 0 512' ,self.origin - '0 0 2048',MOVE_WORLDONLY,self);
877 if(trace_startsolid || trace_fraction == 1.0)
879 dprint("ERROR: vehicle_racer placed in more then 512 units into solid\n");
886 if(trace_fraction != 1.0)
887 setorigin(self,trace_endpos + '0 0 128');
889 dprint("WARNING: vehicle_racer placed more then 2048 units above ground.\n");
891 precache_model ("models/vehicles/wakizashi.dpm");
892 precache_model ("models/vehicles/wakizashi_cockpit.dpm");
893 precache_model ("maps/bspmodel.bsp");
896 self.think = racer_dinit;
897 self.nextthink = time + 1;