1 #define RACER_MIN '-40 -40 0'
\r
2 #define RACER_MAX '40 40 44'
\r
4 void racer_exit(float eject);
\r
7 float jetfromtag_power;
8 float jetfromtag_normpower;
9 float jetfromtag_nosolid;
\r
10 vector jetfromtag_origin;
12 vector jetfromtag(string tagname,float jet_length,float air_power,float solid_power)
\r
15 float air_frac, solid_frac, air_pwr, solid_pwr;
\r
17 jetfromtag_origin = gettaginfo(self,gettagindex(self,tagname));
18 v_forward = normalize(v_forward);
19 //dprint("dd:",vtos(v_forward)," - ",vtos(force_dir),"\n");
21 force_dir = jetfromtag_origin - v_forward * jet_length;
\r
22 traceline(jetfromtag_origin, force_dir, MOVE_NORMAL, self);
\r
23 //te_lightning1(world,jetfromtag_origin,force_dir);
25 solid_frac = 1 - trace_fraction;
\r
26 air_frac = trace_fraction;
29 jetfromtag_nosolid += 1;
31 //if(solid_frac < 0.5)
32 //solid_frac = solid_frac * solid_frac;
33 //solid_frac = solid_frac * 1.5;
35 solid_pwr = solid_frac * solid_power;
36 air_pwr = air_frac * air_power;
39 //pmax = air_power+solid_power;
\r
40 //pmax = min(pmax,max(self.velocity_z * cvar("g_vehicle_racer_powerfac"),800));
\r
41 //jetfromtag_power = min(solid_pwr + air_pwr,max(self.velocity_z * cvar("g_vehicle_racer_powerfac"),800));
\r
42 jetfromtag_power = solid_pwr + air_pwr;
43 jetfromtag_normpower = jetfromtag_power / (air_power+solid_power);
44 if(trace_fraction == 1)
47 return v_forward * (jetfromtag_power + cvar("g_vehicle_racer_power_min"));
\r
49 // - (v_forward * cvar("g_vehicle_racer_springk"));
53 vector jetfromtag2(string tagname,float jet_length,float air_power,float solid_power)
\r
56 float solid_frac, solid_pwr;
\r
58 jetfromtag_origin = gettaginfo(self,gettagindex(self,tagname));
59 v_forward = normalize(v_forward);
61 force_dir = jetfromtag_origin - v_forward * jet_length;
\r
62 traceline(jetfromtag_origin, force_dir, MOVE_NORMAL, self);
\r
64 if(trace_fraction == 1)
\r
66 jetfromtag_power = 0;
\r
67 jetfromtag_normpower = 0;
\r
68 return v_forward * 0.1;
\r
71 float pwr_up,pwr_down;
\r
73 pwr_up = (1 - trace_fraction);
\r
74 pwr_down = (trace_fraction * -1);
\r
76 jetfromtag_power = pwr_up + pwr_down;
\r
77 jetfromtag_normpower = jetfromtag_power / solid_power;
\r
78 return v_forward * jetfromtag_power;
\r
85 void racer_align4point(float spring_length,float spring_up,float blendrate)
\r
87 vector fl_org,fl_force,fr_org,fr_force,bl_org,bl_force,br_org,br_force;
88 vector push_vector,align;
\r
90 float fl_push, fr_push, bl_push, br_push;
\r
92 jetfromtag_nosolid = 0;
\r
94 fr_force = jetfromtag("tag_engine_fr",spring_length,cvar("g_vehicle_racer_power_air"), cvar("g_vehicle_racer_power_solid"));
\r
95 fr_org = jetfromtag_origin; fr_push = jetfromtag_normpower;
97 fl_force = jetfromtag("tag_engine_fl",spring_length,cvar("g_vehicle_racer_power_air"), cvar("g_vehicle_racer_power_solid"));
98 fl_org = jetfromtag_origin; fl_push = jetfromtag_normpower;
100 br_force = jetfromtag("tag_engine_br",spring_length,cvar("g_vehicle_racer_power_air"), cvar("g_vehicle_racer_power_solid"));
101 br_org = jetfromtag_origin; br_push = jetfromtag_normpower;
103 bl_force = jetfromtag("tag_engine_bl",spring_length,cvar("g_vehicle_racer_power_air"), cvar("g_vehicle_racer_power_solid"));
104 bl_org = jetfromtag_origin; bl_push = jetfromtag_normpower;
106 push_vector = fr_force + fl_force + br_force + bl_force;
107 //c1 = (fr_org + fl_org + br_org + bl_org) - (self.origin *4);
111 vtmp = normalize((fr_org + fr_force) - self.origin);
112 vtmp += normalize((br_org + br_force) - self.origin);
113 vtmp += normalize((fl_org + fl_force) - self.origin);
114 vtmp += normalize((bl_org + bl_force) - self.origin);
115 //vtmp = vtmp * 0.25;
117 //dprint("a1:",vtos(vtmp)," a2",vtos(vtmp - self.angles),"\n");
120 align_x = (fl_push - bl_push);
121 align_x += (fr_push - br_push);
124 align_z = (fl_push - fr_push);
125 align_z += (bl_push - br_push);
128 self.angles_x *= 0.96;
129 self.angles_z *= 0.96;
131 self.angles_x += align_x * frametime;
132 self.angles_z += align_z * frametime;
133 //c1 = normalize(self.velocity);
134 //c2 = normalize(push_vector - self.velocity);
135 // dprint("VR: ",vtos(c2),"\n");
137 // push_vector_z *= 5;
139 self.velocity = self.velocity + (push_vector * frametime);
140 self.velocity_z -= sv_gravity * frametime;
\r
143 void racer_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
\r
145 self.velocity += force;
\r
148 float racer_pplug()
\r
150 entity player,racer;
\r
155 racer = self.vehicle;
\r
156 player.fixangle = FALSE;
\r
158 player.BUTTON_ZOOM = 0;
\r
159 player.BUTTON_CROUCH = 0;
\r
163 if(player.BUTTON_USE)
\r
171 racer.angles_x *= -1;
\r
172 makevectors(racer.angles);
\r
173 racer.angles_x *= -1;
\r
176 ftmp = cvar("g_vehicle_racer_turnspeed") / server_fps;
\r
179 ftmp = bound(ftmp2,shortangle_f(player.v_angle_y - racer.angles_y,racer.angles_y),ftmp);
\r
181 //if(racer.flags & FL_ONGROUND)
\r
183 racer.angles_y = safeangle(racer.angles_y + ftmp);
\r
184 //player.angles = racer.angles;
\r
185 if(player.BUTTON_JUMP)
\r
187 player.BUTTON_JUMP = 0;
\r
188 racer.velocity = racer.velocity + v_forward * 250 + v_up * 600;
\r
192 if(vlen(player.movement) == 0)
\r
195 //movelib_beak_simple(cvar("g_vehicle_racer_speed_stop"));
\r
196 ftmp = self.velocity_z;
\r
197 self.velocity = self.velocity - self.velocity * cvar("g_vehicle_racer_speed_stop");
\r
198 self.velocity_z = ftmp;
\r
203 if(player.movement_x != 0)
\r
205 if(player.movement_x > 0)
\r
207 player.movement_x = 1;
\r
209 else if(player.movement_x < 0)
\r
211 player.movement_x = -1;
\r
215 if(player.movement_y != 0)
\r
217 if(player.movement_y < 0)
\r
219 player.movement_y = -1;
\r
221 else if(player.movement_y > 0)
\r
223 player.movement_y = 1;
\r
228 self.velocity = self.velocity + ((v_right * player.movement_y) * cvar("g_vehicle_racer_speed_strafe")) * frametime;
\r
229 self.velocity = self.velocity + ((v_forward * player.movement_x) * cvar("g_vehicle_racer_speed_forward")) * frametime;
\r
236 df = vlen(self.velocity) * cvar("g_vehicle_racer_downforce") * v_up;
237 //te_lightning1(self,self.origin,self.origin - df);
238 self.velocity = self.velocity - df;
240 player.movement = racer.velocity;
\r
242 racer_align4point(cvar("g_vehicle_racer_springlength"),100,cvar("g_vehicle_racer_inert"));
\r
244 if(cvar("g_vehicle_racer_drag"))
\r
245 self.velocity = movelib_dragvec(cvar("g_vehicle_racer_drag"),cvar("g_vehicle_racer_dragexp"));
249 player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
\r
251 setorigin(player,racer.origin);
\r
252 player.velocity = racer.velocity;
\r
254 //player.v_angle = racer.angles;
\r
255 //player.v_angle_x *= -1;
258 msg_entity = player;
\r
259 player.angles = racer.angles;
\r
260 //player.fixangle = TRUE;
\r
261 WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES
\r
262 //WriteAngle(MSG_ONE, player.v_angle_x - (racer.angles_x * -1)); // tilt
\r
263 WriteAngle(MSG_ONE, racer.angles_x * -1); // tilt
\r
264 WriteAngle(MSG_ONE, player.v_angle_y); // yaw
\r
265 WriteAngle(MSG_ONE, (racer.angles_z + player.v_angle_z) * 0.5); // flip
\r
273 //if(self.flags & FL_ONGROUND)
\r
275 movelib_beak_simple(cvar("g_vehicle_racer_speed_stop"));
\r
276 //racer_align4point(300,100);
\r
278 self.nextthink = time;
\r
283 self.owner = other;
\r
284 self.owner.angles = self.angles;
\r
286 //setattachment(other,self,"");
\r
287 self.nextthink = 0;
\r
288 self.think = SUB_Null;
\r
289 self.owner.takedamage = DAMAGE_NO;
\r
290 self.owner.solid = SOLID_NOT;
\r
291 self.owner.movetype = MOVETYPE_NOCLIP;
\r
292 //setsize(self.owner,spiderbot_MIN,spiderbot_MAX);
\r
293 self.owner.alpha = -1;
\r
294 self.owner.PlayerPhysplug = racer_pplug;
\r
295 self.owner.vehicle = self;
\r
296 self.owner.event_damage = SUB_Null;
\r
297 //self.event_damage = vehicle_stdproc_damage ;
\r
298 //self.colormap = self.owner.colormap;
\r
299 //self.tur_head.colormap = self.owner.colormap;
\r
300 //self.vehicle_hudmodel.viewmodelforclient = self.owner;
\r
301 //self.owner.hud = HUD_SPIDEBOT;
\r
302 //self.owner.vehicle_health = (self.vehicle_health / cvar("g_vehicle_spiderbot_health"));
\r
303 //self.owner.vehicle_shield = (self.vehicle_shield / cvar("g_vehicle_spiderbot_shield"));
\r
305 //setorigin(self.owner,self.origin);
\r
306 //setattachment(self.owner,self,"");
\r
307 //setorigin(self.owner,'0 0 0');
\r
309 msg_entity = other;
\r
310 WriteByte (MSG_ONE, SVC_SETVIEWPORT);
\r
311 WriteEntity( MSG_ONE, self.vehicle_viewport);
\r
313 WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES
\r
314 WriteAngle(MSG_ONE, self.angles_x); // tilt
\r
315 WriteAngle(MSG_ONE, self.angles_y); // yaw
\r
316 WriteAngle(MSG_ONE, self.angles_z); // flip
\r
318 //self.owner.view_ofs = '0 0 0';
\r
319 //self.tur_head.nodrawtoclient = self.owner;
\r
322 void racer_exit(float eject)
\r
324 self.velocity = '0 0 0';
\r
326 msg_entity = self.owner;
\r
327 WriteByte (MSG_ONE, SVC_SETVIEWPORT);
\r
328 WriteEntity( MSG_ONE, self.owner);
\r
330 //setattachment(self.owner,world,"");
\r
331 self.think = racer_think;
\r
332 self.nextthink = time;
\r
334 self.owner.takedamage = DAMAGE_AIM;
\r
335 self.owner.solid = SOLID_SLIDEBOX;
\r
336 self.owner.movetype = MOVETYPE_WALK;
\r
338 setsize(self.owner,PL_MIN,PL_MAX);
\r
340 self.owner.alpha = 1;
\r
341 self.owner.PlayerPhysplug = SUB_Null;
\r
342 self.owner.vehicle = world;
\r
343 self.owner.view_ofs = PL_VIEW_OFS;
\r
344 //self.owner.hud = HUD_NORMAL;
\r
345 self.owner.event_damage = PlayerDamage;
\r
347 //self.colormap = 1024;
\r
348 //self.tur_head.colormap = 1024;
\r
350 //self.vehicle_hudmodel.viewmodelforclient = self;
\r
351 //self.tur_head.nodrawtoclient = self;
\r
353 setattachment(self.owner,world,"");
\r
357 makevectors(self.angles);
\r
358 setorigin(self.owner,self.origin + v_forward * 100);
\r
359 self.owner.velocity = (v_up + v_forward * 0.25) * 750;
\r
362 setorigin(self.owner,self.origin - v_forward * 200);
\r
364 self.owner = world;
\r
372 if(vlen(self.velocity) == 0)
\r
375 if(other.classname != "player")
\r
379 a = normalize(other.origin - self.origin);
\r
380 a = a - normalize(self.velocity);
\r
381 //dprint("a:",vtos(a),"\n");
\r
386 if(other.classname != "player")
\r
389 if(other.deadflag != DEAD_NO)
\r
392 if(other.vehicle != world)
\r
399 float spiderbot_customizeentityforclient()
\r
401 if(self.deadflag == DEAD_DEAD)
\r
403 if(self.owner == other)
\r
404 self.tur_head.alpha = -1;
\r
406 self.tur_head.alpha = 1;
\r
411 void racer_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force);
\r
414 self.think = racer_think;
\r
415 self.nextthink = time;
\r
417 //self.vehicle_health = CCVAR("_health");
\r
418 //self.vehicle_shield = CCVAR("_shield");
\r
419 //self.event_damage = vehicle_stdproc_damage;
\r
420 //self.event_damage = spiderbot_damage;
\r
421 //self.iscreature = TRUE;
\r
423 self.movetype = MOVETYPE_FLY;
\r
424 self.solid = SOLID_SLIDEBOX;
\r
425 //self.takedamage = DAMAGE_AIM;
\r
426 self.touch = racer_touch;
\r
427 //self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = 1;
\r
429 //self.tur_head.angles = '0 0 0';
\r
430 //self.colormap = 1024;
\r
431 //self.tur_head.colormap = 1024;
\r
432 self.deadflag = DEAD_NO;
\r
433 self.bot_attack = TRUE;
\r
434 setorigin(self,self.origin + '0 0 128');
\r
435 setsize(self,RACER_MIN*0.5,RACER_MAX*0.5);
\r
436 setorigin(self,self.tur_aimpos);
\r
437 pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
\r
440 void racer_blowup()
\r
443 sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
\r
444 pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
\r
446 //RadiusDamage (self, self.owner, self.owner.shot_dmg, self.owner.shot_dmg * 0.5, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
\r
447 RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_TURRET, world);
\r
449 self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = -1;
\r
450 self.nextthink = time + 10;
\r
451 self.think = spiderbot_spawn;
\r
453 setorigin(self,self.tur_aimpos);
\r
462 self.event_damage = SUB_Null;
\r
463 self.iscreature = FALSE;
\r
464 self.solid = SOLID_NOT;
\r
465 self.takedamage = DAMAGE_NO;
\r
466 self.touch = SUB_Null;
\r
467 self.nextthink = time + random() * 2;
\r
468 self.think = spiderbot_blowup;
\r
469 self.deadflag = DEAD_DEAD;
\r
470 self.vehicle_hudmodel.viewmodelforclient = self;
\r
472 self.tur_head.frame = 0;
\r
479 server_fps = (1 / sys_ticrate);
\r
482 addstat(STAT_HUD, AS_INT, hud);
\r
483 addstat(STAT_SPIDERBOT_ROCKETS, AS_INT, rockets);
\r
484 addstat(STAT_SPIDERBOT_RELOAD, AS_FLOAT, rockets_reload);
\r
485 addstat(STAT_SPIDERBOT_HEAT, AS_FLOAT, vehicle_heat);
\r
486 addstat(STAT_SPIDERBOT_HEALTH, AS_FLOAT, vehicle_health);
\r
487 addstat(STAT_SPIDERBOT_SHIELD, AS_FLOAT, vehicle_shield);
\r
490 if (self.netname == "") self.netname = "Race PoD";
\r
492 self.vehicle_viewport = spawn();
\r
493 self.event_damage = racer_damage;
\r
494 //self.gravity = 2;
\r
495 //self.vehicle_hudmodel = spawn();
\r
496 //self.vehicle_flags = VHF_HASSHIELD | VHF_SHIELDREGEN | VHF_HEALTHREGEN;
\r
497 //self.cvar_basename = "g_vehicle_spiderbot";
\r
499 setmodel (self.vehicle_viewport, "models/null.md3");
\r
500 setmodel(self,"models/racers/waka.dpm");
\r
502 setattachment(self.vehicle_viewport,self,"");
\r
503 //self.tur_head.customizeentityforclient = spiderbot_customizeentityforclient;
\r
505 setorigin(self.vehicle_viewport,'-400 0 40 ');
\r
506 self.tur_aimpos = self.origin;
\r
509 //self.vehicle_die = spiderbot_die;
\r
510 //self.vehicle_exit = spiderbot_exit;
\r
513 void spawnfunc_racer()
\r
515 g_turrets_common_precash();
\r
517 precache_model ( "models/racers/waka.dpm");
\r
519 self.think = racer_dinit;
\r
520 self.nextthink = time + 0.5;
\r
523 onClipEvent (load) {
\r
524 // inertia relates to the quantity of energy that
\r
525 // the spring will carry
\r
526 // inertia = 1 would mean that the spring doesn't
\r
527 // loose any energy, and that it will oscillate
\r
531 // k relates to the spring, and how "hard" it will be.
\r
532 // The higher k the faster the mass will come back.
\r
536 onClipEvent (enterFrame) {
\r
538 // We calculate the distance to the mouse
\r
539 x = -this._x + _root._xmouse ;
\r
540 y = -this._y + _root._ymouse ;
\r
542 //We calculate the amount by which the mass will to move
\r
543 xp = xp * inertia + x*k ;
\r
544 yp = yp * inertia + y*k ;
\r
556 .entity springtarget;
\r
558 void func_spring_think()
\r
562 deltatime = time - other.lastpushtime;
\r
563 if (pushdeltatime > 0.15) pushdeltatime = 0;
\r
564 other.lastpushtime = time;
\r
565 if(!pushdeltatime) return;
\r
570 dist = (self.springtarget.origin *-1) + self.origin;
\r
571 dist = '-1 -1 -1' * vlen(self.springtarget.origin - self.origin);
\r
572 self.springtarget.velocity_x *= self.inertia + dist_x * self.k;
\r
573 self.springtarget.velocity_y *= self.inertia + dist_y * self.k;
\r
574 self.springtarget.velocity_z *= self.inertia + dist_z * self.k;
\r
576 self.nextthink = time;
\r
579 void func_spring_init()
\r
581 self.springtarget = find(world, targetname, self.target);
\r
582 if(!self.springtarget)
\r
584 objerror("func_spring cant find its .target!\n");
\r
588 self.think = func_spring_think;
\r
589 self.nextthink = time;
\r
592 void springtarget_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
\r
594 dprint("Smack!\n");
\r
595 self.velocity = self.velocity +force;
\r
598 void spawnfunc_func_springtarget()
\r
600 self.mdl = self.model;
\r
601 setmodel(self, self.mdl);
\r
603 self.effects |= EF_LOWPRECISION;
\r
604 setsize (self, self.mins , self.maxs);
\r
605 self.movetype = MOVETYPE_BOUNCE;
\r
606 setorigin(self,self.origin);
\r
607 self.solid = SOLID_BSP;
\r
608 self.takedamage = DAMAGE_YES;
\r
609 self.event_damage = springtarget_damage;
\r
610 dprint("spawnfunc_func_springtarget!\n");
\r
613 void spawnfunc_func_spring()
\r
615 if(self.target == "")
\r
617 objerror("func_spring w/o target!\n");
\r
623 self.inertia = 0.9;
\r
631 self.mdl = self.model;
\r
632 setmodel(self, self.mdl);
\r
634 self.effects |= EF_LOWPRECISION;
\r
635 setsize (self, self.mins , self.maxs);
\r
636 self.movetype = MOVETYPE_FLY;
\r
637 self.think = func_spring_init;
\r
638 self.nextthink = time +1;
\r
639 dprint("spawnfunc_func_spring!\n");
\r