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 jetfromtag_power;
26 float jetfromtag_normpower;
27 vector jetfromtag_origin;
28 float jetfromtag_groundcontact;
32 void racer_loadsettings()
34 racer_power_min = cvar("g_vehicle_racer_power_min") * 0.25;
35 racer_power_air = cvar("g_vehicle_racer_power_air") * 0.25;
36 racer_power_solid = cvar("g_vehicle_racer_power_solid") * 0.25;
37 racer_springlength = cvar("g_vehicle_racer_springlength");
38 racer_anglestabilizer = cvar("g_vehicle_racer_anglestabilizer");
39 racer_pitchspeed = cvar("g_vehicle_racer_pitchspeed");
40 racer_turnspeed = cvar("g_vehicle_racer_turnspeed");
41 racer_turnroll = cvar("g_vehicle_racer_turnroll");
42 racer_speed_forward = cvar("g_vehicle_racer_speed_forward");
43 racer_speed_strafe = cvar("g_vehicle_racer_speed_strafe");
45 racer_healthmax = cvar("g_vehicle_racer_health");
46 racer_shieldmax = cvar("g_vehicle_racer_shield");
47 racer_energymax = cvar("g_vehicle_racer_energy");
51 vector racer_jetfromtag(string tagname)
54 float air_frac, solid_frac, air_pwr, solid_pwr;
56 jetfromtag_origin = gettaginfo(self,gettagindex(self,tagname));
57 v_forward = normalize(v_forward) * -1;
59 force_dir = jetfromtag_origin - (v_forward * racer_springlength);
60 traceline(jetfromtag_origin, force_dir, MOVE_NORMAL, self);
61 //te_lightning1(world,jetfromtag_origin, force_dir);
63 //trace_fraction *= trace_fraction;
65 solid_frac = 1 - trace_fraction;
66 air_frac = trace_fraction;
68 if (trace_fraction != 1.0)
69 jetfromtag_groundcontact = 1;
71 solid_pwr = solid_frac * racer_power_solid;
72 air_pwr = air_frac * racer_power_air;
74 jetfromtag_power = solid_pwr + air_pwr;
75 jetfromtag_normpower = jetfromtag_power / (racer_power_air + racer_power_solid);
77 //te_lightning1(world,jetfromtag_origin,jetfromtag_origin + normalize(self.origin - force_dir) * max(jetfromtag_power, racer_power_min));
78 //return normalize(self.origin - force_dir) * max(jetfromtag_power, racer_power_min);
79 return v_forward * max(jetfromtag_power, racer_power_min);
82 void racer_align4point()
85 float fl_push, fr_push, bl_push, br_push;
87 jetfromtag_groundcontact = 0;
89 push_vector = racer_jetfromtag("tag_engine_fr");
90 fr_push = jetfromtag_normpower;
91 traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
92 if(trace_fraction != 1)
93 self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
95 push_vector += racer_jetfromtag("tag_engine_fl");
96 fl_push = jetfromtag_normpower;
97 traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
98 if(trace_fraction != 1)
99 self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
101 push_vector += racer_jetfromtag("tag_engine_br");
102 br_push = jetfromtag_normpower;
103 traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
104 if(trace_fraction != 1)
105 self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
107 push_vector += racer_jetfromtag("tag_engine_bl");
108 bl_push = jetfromtag_normpower;
109 traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
110 if(trace_fraction != 1)
111 self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
113 self.velocity = self.velocity + (push_vector * frametime);
114 self.velocity_z -= sv_gravity * frametime;
116 push_vector_x = (fl_push - bl_push);
117 push_vector_x += (fr_push - br_push);
118 push_vector_x *= 360;
120 push_vector_z = (fr_push - fl_push);
121 push_vector_z += (br_push - bl_push);
122 push_vector_z *= 360;
124 if (push_vector_z == 1.0)
125 if(self.angles_z > 0)
126 self.angles_z = max(0, self.angles_z - (racer_anglestabilizer * frametime));
128 self.angles_z = min(0, self.angles_z + (racer_anglestabilizer * frametime));
130 self.angles_z += push_vector_z * frametime;
132 if (push_vector_x == 1.0)
133 if(self.angles_x > 0)
134 self.angles_x = max(0, self.angles_x - (racer_anglestabilizer * frametime));
136 self.angles_x = min(0, self.angles_x + (racer_anglestabilizer * frametime));
138 self.angles_x += push_vector_x * frametime;
141 void racer_bolt_explode()
145 org2 = findbetterlocation (self.origin, 8);
146 pointparticles(particleeffectnum("laser_impact"), org2, trace_plane_normal * 1000, 1);
147 RadiusDamage (self, self.realowner, cvar("g_vehicle_racer_laser_damage"), 0, cvar("g_vehicle_racer_laser_radius"), world, 150, DEATH_WAKIGUN, world);
148 sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
153 void racer_rocket_explode()
158 // self.owner = self.realowner;
160 sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
161 org2 = findbetterlocation (self.origin, 16);
162 pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
163 RadiusDamage (self, self.realowner ,cvar("g_vehicle_racer_rocket_damage"), 0, cvar("g_vehicle_racer_rocket_radius"), world, 150, DEATH_WAKIROCKET, world);
168 void racer_rocket_touch()
170 if(other.owner == self.owner)
175 if(pointcontents(self.origin) == CONTENT_SKY)
177 self.think = SUB_Remove;
178 self.nextthink = time;
183 racer_rocket_explode();
186 void racer_fire_cannon(string tagname)
191 bolt.solid = SOLID_BBOX;
192 bolt.movetype = MOVETYPE_FLYMISSILE;
193 bolt.flags = FL_PROJECTILE | FL_NOTARGET;
195 bolt.realowner = self.owner;
196 bolt.touch = racer_bolt_explode;
197 bolt.think = racer_bolt_explode;
198 bolt.nextthink = time + 9;
199 bolt.bot_dodge = TRUE;
200 bolt.bot_dodgerating = cvar("g_vehicle_racer_laser_damage");
201 setorigin(bolt, gettaginfo(self,gettagindex(self,tagname)));
202 bolt.velocity = v_forward * cvar("g_vehicle_racer_laser_speed");
204 CSQCProjectile(bolt, TRUE, PROJECTILE_LASER, TRUE);
207 void racer_rocket_think()
209 vector newdir,olddir;
210 float oldspeed, newspeed;
212 self.nextthink = time;
214 if ((self.owner.deadflag != DEAD_NO) || (self.cnt < time))
216 racer_rocket_explode();
220 if not (self.realowner.vehicle)
222 UpdateCSQCProjectile(self);
226 self.solid = SOLID_BBOX;
227 self.touch = racer_rocket_explode;
229 olddir = normalize(self.velocity);
230 oldspeed = vlen(self.velocity);
232 newdir = normalize((0.5 * (self.enemy.absmin + self.enemy.absmax)) - self.origin);
233 newspeed = oldspeed + self.lip;
235 self.velocity = normalize(olddir + newdir * self.wait) * newspeed;
237 UpdateCSQCProjectile(self);
240 void racer_fire_rocket(string tagname)
243 dprint("self.owner=",self.owner.netname,"\n");
246 setsize (rocket, '-1 -1 -1', '1 1 1');
247 rocket.lip = cvar("g_vehicle_racer_rocket_accel") * sys_ticrate;
248 rocket.wait = cvar("g_vehicle_racer_rocket_turnrate");
249 rocket.solid = SOLID_BBOX;
250 rocket.movetype = MOVETYPE_FLYMISSILE;
251 rocket.flags = FL_PROJECTILE;
253 rocket.realowner = self.owner;
254 rocket.touch = racer_rocket_touch;
255 rocket.bot_dodge = TRUE;
256 rocket.bot_dodgerating = cvar("g_vehicle_racer_rocket_damage");
257 setorigin(rocket, gettaginfo(self,gettagindex(self,tagname)));
259 if( (self.tur_head.gun1) && (self.tur_head.cnt > time))
260 rocket.enemy = self.tur_head.gun1;
264 rocket.cnt = time + 9;
265 rocket.velocity = v_forward * cvar("g_vehicle_racer_rocket_speed");
266 rocket.think = racer_rocket_think;
267 rocket.nextthink = time;
268 CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound
269 //dprint("Tracking...", rocket.enemy.netname, " (", rocket.enemy.classname, ")\n");
273 rocket.velocity = v_forward * cvar("g_vehicle_racer_rocket_speed");
274 rocket.think = racer_rocket_explode;
275 rocket.nextthink = time + 9;
276 CSQCProjectile(rocket, TRUE, PROJECTILE_ROCKET, TRUE);
280 float racer_customizeentityforclient()
283 if(self.deadflag == DEAD_DEAD)
287 if(other == self.owner)
298 entity player, racer;
303 if(cvar("g_vehicle_racer_reload"))
305 racer_loadsettings();
306 cvar_set("g_vehicle_racer_reload","0");
310 racer = self.vehicle;
312 player.BUTTON_ZOOM = 0;
313 player.BUTTON_CROUCH = 0;
317 if(player.BUTTON_USE)
325 if(racer.deadflag != DEAD_NO)
328 player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
335 racer.angles_x *= -1;
336 makevectors(racer.angles);
339 ftmp = racer_turnspeed * sys_ticrate;
342 ftmp = bound(ftmp2,shortangle_f(player.v_angle_y - racer.angles_y,racer.angles_y),ftmp);
343 ftmp2 = safeangle(racer.angles_y + ftmp);
346 ftmp = bound(-90,shortangle_f(player.v_angle_z + ((racer.angles_y - ftmp2) * racer_turnroll), racer.angles_z),90);
347 ftmp = safeangle(racer.angles_z + ftmp);
348 racer.angles_z = ftmp;
351 racer.angles_y = ftmp2;
354 ftmp = racer_pitchspeed * sys_ticrate;
357 ftmp = bound(ftmp2,shortangle_f(player.v_angle_x - racer.angles_x,racer.angles_x),ftmp);
359 racer.angles_x = safeangle(racer.angles_x + ftmp);
360 racer.angles_x *= -1;
362 if(player.movement_x != 0)
364 if(player.movement_x > 0)
365 df += v_forward * racer_speed_forward;
366 else if(player.movement_x < 0)
367 df -= v_forward * racer_speed_forward;
370 if(player.movement_y != 0)
372 if(player.movement_y < 0)
373 df -= v_right * racer_speed_strafe;
374 else if(player.movement_y > 0)
375 df += v_right * racer_speed_strafe;
378 // limit _z to avoid flying on normal thrust
380 df_z = min(df_z,700);
384 //if (jetfromtag_groundcontact)
385 if (player.BUTTON_JUMP)
386 if(racer.vehicle_energy >= (cvar("g_vehicle_racer_speed_afterburn_cost")* frametime))
388 racer.wait = time + cvar("g_vehicle_racer_energy_usepause");
389 racer.vehicle_energy -= cvar("g_vehicle_racer_speed_afterburn_cost") * frametime;
390 df += (v_forward * cvar("g_vehicle_racer_speed_afterburn"));
393 racer.velocity += df * frametime;
395 df = (vlen(racer.velocity) * cvar("g_vehicle_racer_downforce") * v_up) * frametime;
396 racer.velocity = racer.velocity - df;
397 player.movement = racer.velocity;
399 if(cvar("g_vehicle_racer_drag"))
400 racer.velocity = movelib_dragvec(cvar("g_vehicle_racer_drag"), cvar("g_vehicle_racer_dragexp"));
402 if(self.owner.cursor_trace_ent)
404 //dprint("Lock: ", self.owner.cursor_trace_ent.classname, "\n");
405 //if not (self.tur_head.enemy)
406 // bprint(self.owner,"Locked: ",
407 self.tur_head.gun1 = self.owner.cursor_trace_ent;
408 self.tur_head.cnt = time + 1;
411 if(player.BUTTON_ATCK)
412 if(time > racer.attack_finished_single)
413 if(racer.vehicle_energy >= cvar("g_vehicle_racer_laser_cost"))
415 racer.vehicle_energy -= cvar("g_vehicle_racer_laser_cost");
416 racer.wait = time + cvar("g_vehicle_racer_energy_usepause");
420 racer_fire_cannon("tag_fire1");
425 racer_fire_cannon("tag_fire2");
428 racer.attack_finished_single = time + cvar("g_vehicle_racer_laser_refire");
431 if(player.BUTTON_ATCK2)
432 if(time > racer.delay)
434 racer_fire_rocket("tag_rocket_r");
435 racer_fire_rocket("tag_rocket_l");
436 racer.delay = time + cvar("g_vehicle_racer_rocket_refire");
441 player.vehicle_reload1 = (time - racer.lip) / (racer.delay-racer.lip);
442 //player.vehicle_energy = racer.vehicle_energy;
444 vehicle_stdproc_shiledregen(racer_shieldmax, frametime);
445 vehicle_stdproc_healthregen(racer_healthmax, frametime);
447 if (racer.wait < time)
448 vehicle_stdproc_energyregen(racer_energymax, frametime);
450 player.vehicle_energy = (racer.vehicle_energy / racer_energymax);
454 player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
455 setorigin(player,racer.origin + '0 0 32');
456 player.velocity = racer.velocity;
461 void racer_exitthink()
465 self.nextthink = time;
467 a = racer_anglestabilizer;
468 b = racer_springlength;
469 c = racer_power_solid;
471 racer_anglestabilizer = 36;
472 racer_springlength = 96;
473 racer_power_solid = 300;
477 if(self.velocity_z < 0)
478 self.velocity_z *= 0.95;
480 racer_anglestabilizer = a;
481 racer_springlength = b;
482 racer_power_solid = c;
484 self.velocity_x *= 0.95;
485 self.velocity_y *= 0.95;
488 void racer_spawnthink()
493 self.nextthink = time;
495 a = racer_anglestabilizer;
496 b = racer_springlength;
497 c = racer_power_solid;
499 racer_anglestabilizer = 36;
500 racer_springlength = 96;
501 racer_power_solid = 300;
503 // self.velocity_z += sin(time * 128) * 4;
507 if(self.velocity_z < 0)
508 self.velocity_z *= 0.98;
510 racer_anglestabilizer = a;
511 racer_springlength = b;
512 racer_power_solid = c;
514 self.velocity_x *= 0.95;
515 self.velocity_y *= 0.95;
517 dorg = self.pos1 - self.origin ;
519 self.velocity_x = bound(-32, self.velocity_x + dorg_x, 32);
520 self.velocity_y = bound(-32, self.velocity_y + dorg_y, 32);
530 self.vehicle_hudmodel.viewmodelforclient = self.owner;
531 self.colormap = self.owner.colormap;
533 self.owner.PlayerPhysplug = racer_pplug;
534 self.owner.takedamage = DAMAGE_NO;
535 self.owner.event_damage = SUB_Null;
536 self.owner.vehicle = self;
537 self.owner.angles = self.angles;
538 self.owner.solid = SOLID_NOT;
539 self.owner.movetype = MOVETYPE_NOCLIP;
540 self.owner.alpha = -1;
541 self.owner.hud = HUD_WAKIZASHI;
542 self.owner.effects |= EF_NODRAW;
543 self.owner.view_ofs = '0 0 0';
545 self.owner.vehicle_health = (self.vehicle_health / cvar("g_vehicle_racer_health"));
546 self.owner.vehicle_shield = (self.vehicle_shield / cvar("g_vehicle_racer_shield"));
548 setorigin(other,self.origin + '0 0 32');
549 other.velocity = self.velocity;
551 other.flags &~= FL_ONGROUND;
553 WriteByte (MSG_ONE, SVC_SETVIEWPORT);
554 WriteEntity( MSG_ONE, self.vehicle_viewport);
556 WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES
557 WriteAngle(MSG_ONE, self.angles_x * -1); // tilt
558 WriteAngle(MSG_ONE, self.angles_y); // yaw
559 WriteAngle(MSG_ONE, 0); // roll
565 pointparticles(particleeffectnum("teleport"), self.enemy.origin + '0 0 64', '0 0 0', 1);
566 self.enemy.think = racer_spawn;
567 self.enemy.nextthink = time;
571 void racer_exit(float eject)
573 self.colormap = 1024;
574 self.flags = FL_NOTARGET;
579 msg_entity = self.owner;
580 WriteByte (MSG_ONE, SVC_SETVIEWPORT);
581 WriteEntity( MSG_ONE, self.owner);
583 WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES
584 WriteAngle(MSG_ONE, 0); // tilt
585 WriteAngle(MSG_ONE, self.angles_y); // yaw
586 WriteAngle(MSG_ONE, 0); // roll
588 if (self.deadflag == DEAD_NO)
590 self.think = racer_exitthink;
591 self.nextthink = time;
594 self.owner.takedamage = DAMAGE_AIM;
595 self.owner.solid = SOLID_SLIDEBOX;
596 self.owner.movetype = MOVETYPE_WALK;
598 setsize(self.owner,PL_MIN,PL_MAX);
600 self.owner.effects &~= EF_NODRAW;
601 self.owner.alpha = 1;
602 self.owner.PlayerPhysplug = SUB_Null;
603 self.owner.vehicle = world;
604 self.owner.view_ofs = PL_VIEW_OFS;
605 self.owner.event_damage = PlayerDamage;
606 self.owner.hud = HUD_NORMAL;
608 self.vehicle_hudmodel.viewmodelforclient = self;
612 makevectors(self.angles);
613 setorigin(self.owner,self.origin + v_forward * 100);
614 self.owner.velocity = (v_up + v_forward * 0.25) * 750;
618 self.owner.velocity = (v_forward) * -150;
619 setorigin(self.owner,self.origin - v_forward * 128);
624 if (self.deadflag != DEAD_NO)
629 ret.think = racer_return;
630 ret.nextthink = time + cvar("g_vehicle_racer_respawntime");
638 if(vlen(self.velocity) == 0)
641 if(other.classname != "player")
645 a = normalize(other.origin - self.origin);
646 a = a - normalize(self.velocity);
651 if(other.classname != "player")
654 if(other.deadflag != DEAD_NO)
657 if(other.vehicle != world)
664 float racer_customizeentityforclient()
666 if(self.deadflag == DEAD_DEAD)
675 self.think = racer_spawnthink;
676 self.nextthink = time;
678 self.flags = FL_NOTARGET;
681 self.vehicle_health = racer_healthmax;
682 self.vehicle_shield = racer_shieldmax;
684 self.event_damage = vehicle_stdproc_damage;
685 self.touch = racer_touch;
687 self.iscreature = TRUE;
689 self.movetype = MOVETYPE_FLY;
690 self.solid = SOLID_SLIDEBOX;
691 self.takedamage = DAMAGE_AIM;
694 self.colormap = 1024;
695 self.deadflag = DEAD_NO;
696 self.bot_attack = TRUE;
698 self.vehicle_energy = 1;
699 self.vehicle_hudmodel.viewmodelforclient = self;
701 setorigin(self, self.pos1);
702 self.angles = self.pos2;
704 setsize(self,RACER_MIN * 0.5,RACER_MAX * 0.5);
705 pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
713 sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
714 pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
716 self.deadflag = DEAD_DEAD;
717 self.vehicle_exit(VHEF_NORMAL);
718 RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_WAKIBLOWUP, world);
721 self.nextthink = time + cvar("g_vehicle_racer_respawntime");
722 self.think = racer_spawn;
723 self.movetype = MOVETYPE_NONE;
724 self.effects = EF_NODRAW;
726 self.avelocity_z = 0;
727 self.colormod = '0 0 0';
729 setorigin(self,self.pos1);
732 void racer_dietouch()
737 self.wait = time + 0.75;
739 pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
745 self.event_damage = SUB_Null;
746 self.iscreature = FALSE;
747 self.solid = SOLID_NOT;
748 self.takedamage = DAMAGE_NO;
749 self.touch = racer_dietouch;
750 self.deadflag = DEAD_DYING;
751 self.movetype = MOVETYPE_BOUNCE;
754 pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
756 self.velocity += '0 0 128';
759 self.avelocity_z = 16;
761 self.avelocity_z = -16;
763 self.colormod = '-0.5 -0.5 -0.5';
765 self.think = racer_blowup;
766 self.nextthink = time + 3;
772 if (self.netname == "")
773 self.netname = "Race PoD";
775 self.cvar_basename = "g_vehicle_racer";
777 self.vehicle_viewport = spawn();
778 self.vehicle_hudmodel = spawn();
779 //self.ccamera = spawn();
781 setorigin(self, self.origin);
783 setmodel(self,"models/vehicles/wakizashi.dpm");
784 setmodel(self.vehicle_hudmodel, "models/vehicles/wakizashi_cockpit.dpm");
785 setmodel (self.vehicle_viewport, "null");
787 setattachment(self.vehicle_hudmodel, self, "");
788 setattachment(self.vehicle_viewport, self, "tag_viewport");
790 self.vehicle_hudmodel.viewmodelforclient = self;
791 self.customizeentityforclient = racer_customizeentityforclient;
793 self.tur_head = spawn();
795 self.pos1 = self.origin;
796 self.pos2 = self.angles;
797 self.angles = '0 0 0';
798 self.angles = self.pos1;
800 self.vehicle_die = racer_die;
801 self.vehicle_exit = racer_exit;
803 addstat(STAT_HUD, AS_INT, hud);
804 addstat(STAT_VEHICLESTAT_HEALTH, AS_FLOAT, vehicle_health);
805 addstat(STAT_VEHICLESTAT_SHIELD, AS_FLOAT, vehicle_shield);
806 addstat(STAT_VEHICLESTAT_ENERGY, AS_FLOAT, vehicle_energy);
808 addstat(STAT_VEHICLESTAT_AMMO1, AS_INT, vehicle_ammo1);
809 addstat(STAT_VEHICLESTAT_RELOAD1, AS_FLOAT, vehicle_reload1);
811 addstat(STAT_VEHICLESTAT_AMMO2, AS_INT, vehicle_ammo2);
812 addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2);
817 void spawnfunc_vehicle_racer()
819 g_turrets_common_precash();
820 racer_loadsettings();
822 self.vehicle_flags = VHF_HASSHIELD | VHF_SHIELDREGEN;
824 traceline(self.origin,self.origin - '0 0 2048',MOVE_WORLDONLY,self);
827 dprint("WARNING: vehicle_racer placed in solid\n");
828 traceline(self.origin + '0 0 512' ,self.origin - '0 0 2048',MOVE_WORLDONLY,self);
829 if(trace_startsolid || trace_fraction == 1.0)
831 dprint("ERROR: vehicle_racer placed in more then 512 units into solid\n");
837 if(trace_fraction != 1.0)
838 setorigin(self,trace_endpos + '0 0 128');
840 dprint("WARNING: vehicle_racer placed more then 2048 units above ground.\n");
842 precache_model ("models/vehicles/wakizashi.dpm");
843 precache_model ("models/vehicles/wakizashi_cockpit.dpm");
844 precache_model ("maps/bspmodel.bsp");
847 self.think = racer_dinit;
848 self.nextthink = time + 1;